Friday, October 20, 2017

Yet Another Etrog Use - Infused Honey

I feel strongly about finding clever ways to reuse my etrog after Sukkot (why is explained here). This year's adventure: make etrog infused honey!

The idea came to me while doing research on how to make Goldenrod tea. While looking at YouTube results, I came across an entry that described making Goldenrod honey. This got me thinking: what else could I infuse in honey? And from there, using the etrog was an obvious choice.

Making infused honey seems to be ridiculously simple: put the flavored food in a container, add honey, and flip the container every day for a week plus. While I didn't find anyone who suggested making etrog infused honey, I did find a orange infused honey recipe.

One important word of caution: making the rounds of Facebook is an article that talks about how you should absolutely not eat your etrog because farmers douse them in pesticides. Apparently, this isn't a new concern, and here's an article from back in 2008 with the same strong warning. I'm not entirely sure how I feel about this, but it's important to consider.

This afternoon I busted out the left over honey we had from Rosh Hashanah (Thanks Mom! Thanks Roses!) and setup two batches to infuse. One container is filled with etrog peel, the other with mint and basil from our garden. I've got no idea how they are going to taste, but it's a fun and easy experiment to try. Perhaps I'll try the etrog infused honey on Hanukah latkes? That would be combining symbols from the three different holidays making for philosophical, if not culinary, extravaganza!

L'Chaim!

Thursday, October 19, 2017

Digital Backcountry Maps - The Hard (but educational!) Way

After my last backpacking trip I decided it was officially time to switch from paper to digital maps. Sure, busting out a topo map makes me feel like I'm 14 years old again and trying to navigate the Adirondacks with fellow Scouts. And yes, a traditional map has never run out of batteries or been damaged from being dropped. But digital maps, like using a GPS with your car, is ultimately a game changer, and the functionality can't be beat. Not to mention, my phone is waterproof and I'm carrying an extra battery for it. Ultimately, the risks of depending on a digital device for a weekend trip is outweighed by the benefits of the tech.

So I was going digital. But how?

My first attempt to was to turn to the most trusted name (for me) in maps: the USGS. Looking at one of my Shenandoah maps I noticed that it referenced various USGS maps:

With a little Googling I learned that the USGS makes all of its topo maps available for free. You need only head over to https://viewer.nationalmap.gov/basic/ to select the products you want to download. The interface over at viewer.nationalmap.gov took some playing with before I understood it. Ultimate, the map on the right hand side is a tool that drives the downloads on the left. You can search for a general location on the map, highlight a region, and the results on the left hand side will show you content you can download. Here's what the UI looked like after I searched for a section of Shenandoah National Park:

It's a bit hard to see there, but there are 54 map files in the area I selected. Clicking on the download link of one of the entries gave me a PDF file. I was pleased to see that both the paper map and results from the USGS search both referred to 7.5 minute maps.

So now I had a single 7.5' USGS topo map. But as a PDF, it's basically useless.

That's where Avenza Maps comes into play. This is one of the mapping apps I'd seen referenced on the web. Once you launch the app, you're given an option to import a map. I selected the PDF file I downloaded and to my amazement, the app imported the file and gave me a clean UI for viewing the map:

This was a huge step in the right direction: I'd imported a USGS map to my phone. The next challenge, however, was to account for the fact that one 7.5' map isn't an especially large area. What I needed was a way to import multiple PDF files into Avenza, yet have them be treated as one individual map.

To do this, I would need to download multiple PDF files from the USGS, create a Collection within Avenza, and import each PDF into this collection. That sounded like a lot of work. Fortunately, Avenza provides a better way. You can bundle PDF files together using a .avenzamaps file. This is a JSON formatted file, and one that's easy to create given the .txt file that you can download from the USGS.

Here's a fragment of text file containing all the products found in my USGS search above:

https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796771.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23575/7794333.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796749.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23759/7810959.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23532/7789076.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23543/7789410.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23532/7789082.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796765.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23575/7794355.pdf
https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796783.pdf

And here's that same file in the .avenzamaps format:

{ "Version":"PDFMaps Maplist 1.1",
  "Name":"Ben's Example Map",
  "Collection": [ 
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796771.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23575/7794333.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796749.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23759/7810959.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23532/7789076.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23543/7789410.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23532/7789082.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796765.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23575/7794355.pdf"}},
    {"Map": {"URL":"https://prd-tnm.s3.amazonaws.com/StagedProducts/Maps/USTopo/1/23608/7796783.pdf"}}
  ]
}

One catch: you can't import this file from your phone. Assuming the above JSON was in example.avenzamaps, I'd need this file to be accessible via a URL. Once you import the .avenzamaps URL, the collection is created and you can browse all the PDFs in a seamless manner. Here's an example:

While I'd now figured out how to reliably import multiple USGS maps into one mobile friendly view, I'd also learned a critical lesson along the way. The USGS maps were far from the ideal set of maps to depend on for backpacking. The main issue: in locations I was familiar with, trails that should be marked there weren't. In hindsight, this makes sense. The USGS maps aren't designed for hikers and backpackers, they are general purpose mapping resource. While I think of the maps I use as being provided by the USGS, they're really provided by other services that no doubt annotate the maps beyond what the USGS provides.

Another glitch: Avenza requires a $30/year membership if you want to import more than 3 PDF maps. So while USGS makes downloading large collections of maps relatively easy, you can't import them without a yearly membership.

Of course, Avenza isn't limited to using USGS maps. Far from it. The application has a built in store that allows you to easily buy all sorts of mapping products. Before I splurged on them, however, I thought I would try out some other Android mapping solutions. Spoiler alert: I found a reasonably priced, high quality solution as an alternative Avenza, which is a far better fit for my needs. More on that in a future blog post soon.

In the mean time, I do plan to keep Avenza on my phone. It's an impressive tool and should the opportunity come up where I need to view arbitrary GeoPDF files, Avenza is definitely the way to go.

Tuesday, October 17, 2017

Awesome Armchair Adventure: 'Hike' the PCT with Dixie

I'm most of the way through my second virtual hike of the 2,650 mile Pacific Crest Trail and boy are my legs not tired! My first hike was courtesy of Joe Brewer, while this one is brought to me by Dixie!

Dixie has a good thing going: about once a week she uploads a heap of raw footage to her Dropbox account. At that point her editor, Aaron, works his magic and turns the content into a 10 minute video. Between her videography and Aaron's editing, the results are quite impressive.

The videos work for a number of reasons. First off, Dixie's Southern drawl and upbeat attitude means that she's a natural on camera. And of course, the views are often spectacular and the challenges immense. But it's more than that. The videos begin to capture the scale of the trail in a way that's hard to convey. Turning a 2,650 mile trek into a 4 minute video may be watchable, but it won't convey the shear challenge. On the other hand, hours of footage would no doubt highlight the full the scope of the trail, yet who has the time? 10 judiciously cut minutes a week, however, does the trick.

You can feel the relentless heat of the desert; the pain of blisters; the reality of dealing with 'blah' days; the anxiety of walking into a the Sierras and the joy of knocking out milestone after milestone. You also get a feel for what life is like on trail. Even I was surprised at how connected the whole affair is, with cell phones playing a near essential role in coordinating the day to day execution of the trail (at least for the later sections I've seen). With that said, there are plenty of moments where the loneliness of the trail comes through loud and clear.

It's been years since I've watched 'Reality TV.' But Dixie's adventure, that's the real deal. Seriously, hit play on the first day of her hike and see if you can stop:

Thru-Hike The PCT with Dixie:

Monday, October 16, 2017

Forget Remembering | Setting up a Quick Access Skills Library

A few nights ago we were out at a Chinese restaurant and hit me that I used to know a slick way to make a chopstick rest from the stick's wrapper. This clever bit of origami isn't hard to do, but without practice, it's easy to forget. As I mulled this incident over, I realized that there were a bunch of skills that fall into this category, from learning new knots to remembering the wiring sequence for jumping a car.

What I wanted was a skills library: a resource I could turn to get a refresher on a concrete technique that I used to know. Most importantly, I wanted the library to be local to my phone. That is, even without cell phone service or WiFi, I wanted to be able to relearn a skill. Fortunately, the LG G6 supports an external SD card, which is the perfect place to stash extra content like this.

To put together the library, I headed over to YouTube and ran some searches for some simple skills (like tying the Uni knot and folding a recording breaking paper airplane). I then added each video to a Skills Playlist.

I had the start of my Skills library, but it wasn't accessible offline.

For that, I turned to keepvid.com. There's no way around it, this step is sketchy. Keepvid allows you to paste a YouTube URL, and in response, allows you to download the underlying video file. This is typically a no-no. But for these few videos, which I'll be using rarely and not distributing to the public, I think it's an acceptable compromise.

Once I had the various .mp4 files for the videos, I pushed them to a Google Drive folder. And from there, I setup a FolderSync rule that pulls them down into my phone's SD card:

The result is a folder filled with helpful videos.

The next time we're out eating Sushi, the only thing stopping me from making a nifty chopstick rest is my poor folding skills and not my poor memory!


And here's a snapshot of all the skills in the library:

Wednesday, October 11, 2017

Weekly Discoveries - Poetry Meets Music, Sweet Covers and Righteous Dance Moves

The spoke word introduction to Jacob Banks' Unholy War is really something else. It's definitely on the cryptic side, but that only seems to add to it. The fact that there's a song after the introduction is nice a bonus.

Oh Wonder also delivers on the spoken word with All We Do. Many of the short statements intermingled with the music are quite inspiring. A favorite of mine: Find yourself. Lose yourself. And find others...that is how to be human.

This last week was all about the covers. Miley Cyrus (yes, the Miley Cyrus), nailed The First Time Ever I Saw Your Face, Lorde totally brought it with In The Air Tonight and Ryan Sheridan's version of Wicked Game is masterfully done.

But mostly, last week I just wanted to dance! This video of Flume & Chet Faker's This Song Is Not About A Girl features some dude dancing his heart out to the tune. Perhaps it's just the shy 13 year old boy in me, but every time I see a video like this I can't help but feel that this guy has a special level of courage and chutzpah. Good for him!

And continuing on the dancing theme, I give you: MisterWive's Our Own House. The song is OK, but the dance feud themed video is just too adorable. Its got it all: a leather clad evil dance troupe, a hapless group of newbies and a washed up dance guru who's ready to come out of retirement to save the day. What can I say, not every video has to be an emotion masterpiece.

View All the videos:

And here's a couple videos from the week before:

Tuesday, October 10, 2017

The free, fold flat, 18 gram camping cup

MeZillch has a new video up about collapsible water bottles. In it, he demonstrates squishing down a juice box to fit in an Altoids Tin.

That got me wondering: what if I lopped off the top of an empty soy milk carton? Would that leave me with a useful container?

Fortunately, we had just finished a box of soy milk, so this was an easy test to run. I peeled up the corners of the now empty carton, which allowed me to flatten it with ease. I then cut the top of the container off. After giving it a through washing, here's what I ended up with:

And there you have it: a free, fold flat, 18 gram cup!

Over the last week I've folded and unfolded it a number of times, and it still hasn't leaked. I even poured boiling water into it with no (visible) ill side effects.

I wouldn't want to depend on this as a primary container while camping, but given how lightweight and packable it is, it seems like an ideal sidekick.

Poking around the web, I learned that re-using these containers is Totally a Thing. From vases to a slick coin purse, people make amazing things these out of Tetra Brik packaging. Basically, any project that calls for a durable and possibly water-tight square shaped form is a good candidate for reuse. As for me, my projects tend to far more crude, but no less fun or functional.

Monday, October 09, 2017

Pick 3 - Android Tasker Based Meal Inspiration

One of the advantages of working from home is the fully stocked kitchen at the ready (not to mention that there's nobody to complain when you microwave some wacky food concoction). While having the kitchen is great, I often draw a blank as to what I should make. Yesterday, as we were shopping for the week, yet another approach to solving this problem hit me: why not write some code to make random suggestions?

First, recorded a bunch of ingredients we had in the house in a Google Keep list. I then used Tasker and AutoCommand to write some code to grab three random entries from this list and presents them to me. Voila! Lunch is served.

Here's the code in action:

That shows me looking at the list of all food items, launching the Android Share function, clicking on the Pick 3 icon and then getting food recommendations. The particular 'meal' isn't very strong: Pickles, Cheese, Bananas, but that's a minor detail.

This Tasker recipe will pick 3 random lines out of any block of text. While I'm using this for food, it could easily be used for generating movie or restaurant recommendations, or really any time you want to narrow down a big list to 3 random items.

Implementing this in Tasker was straightforward. It consists of a Profile that's powered by AutoCommand, a Task that does the heavy lifting and a very simple Scene to display the output.

The Task works by splitting the text passed to it on newlines, calling the Array Process: shuffle action and then outputting the first three values in the newly shuffled array:

As it stands, the recommendations I'm getting are shall we say creative. I could improve them by having separate lists for the different classes of of ingredients. But what fun would that be? Pardon me, while I step away and have a delicious ... Lettuce, Taco Seasoning and Chocolate Milk sandwich.

Wednesday, October 04, 2017

One Less Reason to Curse YouTube -- Managing Subscriptions from the Command Line

Every time I look over at the channels I'm subscribed to in YouTube I have this internal discussion:

  1. My gosh, how did that list of subscriptions get so big? I sure wish I had a way to trim it down without going through the tedious process of manually unusbscribing.
  2. I know, I'll write a command line script to manage my YouTube subscriptions!
  3. But that will take time ... let me just muscle through and manually unsubscribe from channels I don't want to follow any longer.
  4. (Goes through the process of unsubscribing from two channels)
  5. Ugh! This is painful. I give up.
  6. And repeat...

Today, however, I finally broke the cycle! I decided to write a tool that will let me list and delete subscriptions from the command line. This wasn't really a stretch, I've written code that works with the Blogger Data API, so I figured working with the YouTube Data API wouldn't be any more difficult.

Step 1, I created a small command line utility to grant me OAuth access to my YouTube account:

#!/bin/bash

##
## Authenticate with YouTube Data API
##
USAGE="`basename $0` {auth|refresh|token} ctx"
CTX_DIR=$HOME/.youtube_auth
CLIENT_ID=703261074341-e1vpmqq8kh2v9ke0mveve7dakpbobkft.apps.googleusercontent.com 
CLIENT_SECRET=uRhAcxywxYZF2bhbx7zVqeML

ctx=default

function usage {
  echo "Usage: `basename $0` [-h] [-c context] {init|token}"
  exit
}

function age {
  modified=`stat -c %X $1`
  now=`date +%s`
  expr $now - $modified
}

function refresh {
  refresh_token=`cat $CTX_DIR/$ctx.refresh_token`
  curl -si \
       -d client_id=$CLIENT_ID \
       -d client_secret=$CLIENT_SECRET \
       -d refresh_token=$refresh_token \
       -d grant_type=refresh_token \
       https://accounts.google.com/o/oauth2/token > $CTX_DIR/$ctx.refresh
  grep access_token $CTX_DIR/$ctx.refresh | sed -e 's/.*: "//' -e 's/",//' > $CTX_DIR/$ctx.access_token
}

while getopts :hc: opt ; do
  case $opt in
    c) ctx=$OPTARG ;;
    h) usage ;;
  esac
done
shift $(($OPTIND - 1))

cmd=$1 ; shift

mkdir -p $CTX_DIR
case $cmd in
  init)
    url=`curl -gsi \
         -d scope=https://www.googleapis.com/auth/youtube \
         -d redirect_uri=urn:ietf:wg:oauth:2.0:oob \
         -d response_type=code \
         -d access_type=offline \
         -d client_id=$CLIENT_ID \
         https://accounts.google.com/o/oauth2/v2/auth | \
      grep -i Location: | \
      sed 's/[lL]ocation: //'`
    echo $url
    echo -n "Code? "
    read code
    curl -s \
         -d client_id=$CLIENT_ID \
         -d client_secret=$CLIENT_SECRET \
         -d code=$code \
         -d grant_type=authorization_code \
         -d redirect_uri=urn:ietf:wg:oauth:2.0:oob \
         https://www.googleapis.com/oauth2/v4/token > $CTX_DIR/$ctx.init
    grep access_token $CTX_DIR/$ctx.init | sed -e 's/.*: "//' -e 's/",//' > $CTX_DIR/$ctx.access_token
    grep refresh_token $CTX_DIR/$ctx.init | sed -e 's/.*: "//' -e 's/"//' > $CTX_DIR/$ctx.refresh_token
    echo "Done"
    ;;
  token)
    if [ ! -f $CTX_DIR/$ctx.access_token ] ; then
      echo "Unknown context: $ctx. Try initing first."
      exit
    fi
    age=`age $CTX_DIR/$ctx.access_token`
    if [ $age -gt 3600 ] ; then
      refresh
    fi
    cat $CTX_DIR/$ctx.access_token
    ;;
  *)
    usage
esac

Surprisingly, I needed to use different API end points than I used for other curl based Google OAuth apps. I needed to generate the authentication code at https://accounts.google.com/o/oauth2/v2/auth and generate the auth token at https://www.googleapis.com/oauth2/v4/token.

Once I had an authentication token, life was good. I used the usual suspects to power this script. Mainly, curl to make the appropriate web requests and jq to format the resulting JSON in an intelligent way. You'll notice from the script below that if you pass -v to the script, you get the complete JSON output. Man those tools are awesome; if you don't know them well you're missing out.

Here's a sample run of my shiny new script:

$ youtube_tools  -a subscriptions|grep -i megan
ffVDX-wHSD6NaM3-kGgVug8jUOQIbwozBmWubSPnjtU:Megan Davies

# Nothing personal Megan, but we're breaking up:
$ youtube_tools -a subscription-delete \
 -i `youtube_tools  -a subscriptions |grep Megan | cut -d ':' -f 1`

Now that's how you manage YouTube subscriptions!

I'm not quite sure what else I'm going to do with this tool, but given how much I use YouTube for, I won't be surprised if I add to it.

Here's the code for the script, enjoy!

#!/bin/bash

##
## command line tools for working with YouTube.
## See: https://developers.google.com/youtube/v3/docs/
##
API_BASE=https://www.googleapis.com/youtube/v3
AUTH_TOKEN=`youtube_auth token`

if [ -z "$AUTH_TOKEN" ] ; then
  echo "`basename $0`: authentication not setup. Run: 'youtube_auth init'"
  exit 1
fi

function usage {
  echo "Usage: `basename $0` -a {subscriptions|subscription-delete} [-i ID] -v"
  exit
}

function filter {
  if [ -z "$VERBOSE" ] ; then
    jq "$@"
  else
    cat
  fi
}

while getopts ":a:i:v" opt ; do
  case $opt in
    a) ACTION=$OPTARG ;;
    v) VERBOSE=yes    ;;
    i) ID=$OPTARG     ;;
    \?) usage         ;;
  esac
done

function invoke {
  curl -s -H "Authorization: Bearer $AUTH_TOKEN" "$@"
}

case $ACTION in
  subscriptions)
    invoke -G $API_BASE/subscriptions \
           -d mine=true \
           -d part=snippet \
           -d maxResults=50 | 
      filter -r ' .items[] |  .id + ":" + .snippet.title'
    ;;
  subscription-delete)
    if [ -z "$ID" ] ; then
      echo "Deleting a subscription requires an ID (-i) value"
      usage
    fi
    invoke -X DELETE "$API_BASE/subscriptions?id=$ID"
    ;;
  *)
    usage
    ;;
esac

Tuesday, October 03, 2017

Making the Martian Notifier Watch More Useful - Implementing Step and Time Based Alerts

Despite the far more capable Zenwatch 3 on my desk, I do find myself turning to the relatively primitive Martian Notifier surprisingly often. It does a reasonable job at keeping me aware of notifications, and has far better battery life. If I know I'm going to be away from an outlet for more than 12 hours, I'll definitely learn towards using the Martian.

One feature I miss on my Martian is the ability to easily set a timer which will trigger a notification on my wrist. Thankfully, this is easy functionality to implement in Tasker. While I was at it, I made two different types of timers: one to support a number of minutes and another to support a number of steps. The latter I intend to use while hiking or jogging.

The strategy I for these timers was to build out two sets of tasks: one for registering events and one for triggering the events.

The registering side of things use the 'Get Voice' action to ask for a number of minutes, or steps, along with a label. It then adds this information into a global queue variable. For the time based reminders, I convert the minutes to seconds, and then add %TIMES (that's Unix time) to this value. The result is an absolute time in the future when the reminder needs to happen. In other words, if I want to trigger a reminder in 5 minutes, then I'll add 5 x 60 to the current unix time, which happens to be 1507059578.

Steps work off the same principle, but instead of using %TIMES, I rely on the global variable %STEPS_EVER. This variable is set to be constantly updated every 10 steps.

One last feature of the 'register' side actions is that I also add an entry for half the time or steps into the queue variable. This allows me to trigger a notification telling me I'm half way to my goal. (Who doesn't love a little computer generated positive feedback?)

Here's the code for the register side of things:

Register Minutes Notifier (203)
 A1: Say [ Text:How many minutes? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ] 
 A2: Get Voice [ Title:How Many Minutes? Language Model:Free Form Language: Maximum Results:1 Timeout (Seconds):30 ] 
 A3: Variable Set [ Name:%nmins To:%VOICE Recurse Variables:Off Do Maths:On Append:Off ] 
 A4: Say [ Text:Label? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ] 
 A5: Get Voice [ Title:Label? Language Model:Free Form Language: Maximum Results:1 Timeout (Seconds):30 ] 
 A6: Variable Set [ Name:%nsecs To:%nmins * 60 Recurse Variables:Off Do Maths:On Append:Off ] 
 A7: Variable Set [ Name:%label To:%VOICE Recurse Variables:Off Do Maths:Off Append:Off ] 
 A8: Variable Set [ Name:%half To:(%nsecs / 2) + %TIMES Recurse Variables:Off Do Maths:On Append:Off ] 
 A9: Variable Set [ Name:%full To:(%nsecs) + %TIMES Recurse Variables:Off Do Maths:On Append:Off ] 
 A10: Array Push [ Variable Array:%MINUTES_NOTIFICATION_QUEUE Position:1 Value:%full;%label Fill Spaces:Off ] 
 A11: Array Push [ Variable Array:%MINUTES_NOTIFICATION_QUEUE Position:1 Value:%half;half way to %label Fill Spaces:Off ] 
 A12: Say [ Text:Got it. Notifying you about %label in %nmins minutes. Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ] 

Register Steps Notifier (184)
 A1: Say [ Text:How many steps? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ] 
 A2: Get Voice [ Title:How Many Steps? Language Model:Free Form Language: Maximum Results:1 Timeout (Seconds):30 ] 
 A3: Variable Set [ Name:%nsteps To:%VOICE Recurse Variables:Off Do Maths:On Append:Off ] 
 A4: Say [ Text:Label? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ] 
 A5: Get Voice [ Title:Label? Language Model:Free Form Language: Maximum Results:1 Timeout (Seconds):30 ] 
 A6: Variable Set [ Name:%label To:%VOICE Recurse Variables:Off Do Maths:Off Append:Off ] 
 A7: Variable Set [ Name:%half To:(%nsteps / 2) + %STEPS_EVER Recurse Variables:Off Do Maths:On Append:Off ] 
 A8: Variable Set [ Name:%full To:(%nsteps) + %STEPS_EVER Recurse Variables:Off Do Maths:On Append:Off ] 
 A9: Array Push [ Variable Array:%STEP_NOTIFICATION_QUEUE Position:1 Value:%full;%label Fill Spaces:Off ] 
 A10: Array Push [ Variable Array:%STEP_NOTIFICATION_QUEUE Position:1 Value:%half;half way to %label Fill Spaces:Off ] 
 A11: Say [ Text:Got it. Notifying you about %label in %nsteps steps. Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ] 

Once the absolute step or time value is registered, I need another set of tasks to continually scan the queue, looking for entries that need to trigger a notification. I wrote two different 'tick' tacks which perform this loop through the relevant array once. The array and string handling of variables offered by Tasker is downright primitive. But, it also worked just fine for my needs.

It's hard to see it from the code below, but this is really a simple for loop that's checking to see if the current time or step count exceeds the absolute value that was previously registered.

Tick Minutes Notifier (204)
 A1: Variable Set [ Name:%pos To:1 Recurse Variables:Off Do Maths:Off Append:Off ] 
 A2: For [ Variable:%item Items:%MINUTES_NOTIFICATION_QUEUE() ] 
 A3: Variable Split [ Name:%item Splitter:; Delete Base:Off ] 
 A4: Variable Set [ Name:%when To:%item1 Recurse Variables:Off Do Maths:Off Append:Off ] 
 A5: Variable Set [ Name:%label To:%item2 Recurse Variables:Off Do Maths:Off Append:Off ] 
 A6: Variable Set [ Name:%offset To:%when - %TIMES Recurse Variables:Off Do Maths:On Append:Off ] 
 A7: If [ %offset = 0 | %offset < 0 ]
 A8: Notify [ Title:%label Text: Icon:ipack:crystalhd:cnr Number:0 Permanent:Off Priority:3 ] 
 A9: Array Pop [ Variable Array:%MINUTES_NOTIFICATION_QUEUE Position:%pos To Var: ] 
 A10: End If 
 A11: Variable Add [ Name:%pos Value:1 Wrap Around:0 ] 
 A12: End For 

Tick Steps Notifier (202)
 A1: Variable Set [ Name:%pos To:1 Recurse Variables:Off Do Maths:Off Append:Off ] 
 A2: For [ Variable:%item Items:%STEP_NOTIFICATION_QUEUE() ] 
 A3: Variable Split [ Name:%item Splitter:; Delete Base:Off ] 
 A4: Variable Set [ Name:%when To:%item1 Recurse Variables:Off Do Maths:Off Append:Off ] 
 A5: Variable Set [ Name:%label To:%item2 Recurse Variables:Off Do Maths:Off Append:Off ] 
 A6: Variable Set [ Name:%offset To:%when - %STEPS_EVER Recurse Variables:Off Do Maths:On Append:Off ] 
 A7: If [ %offset = 0 | %offset < 0 ]
 A8: Notify [ Title:%label Text: Icon:ipack:crystalhd:cnr Number:0 Permanent:Off Priority:3 ] 
 A9: Array Pop [ Variable Array:%STEP_NOTIFICATION_QUEUE Position:%pos To Var: ] 
 A10: End If 
 A11: Variable Add [ Name:%pos Value:1 Wrap Around:0 ] 
 A12: End For 

The final bit of magic is to invoke these tick functions on a regular basis. This is easily done by setting up two profiles, one that's time based and one that's step based:

I opted to use the Tasker widget to invoke the various register tasks from a home screen. This means that I'm only one button press away from queueing up a time or step based reminder. It's not as sexy as an AndroidWear solution, but so far, it's been working well. And besides, it's Tasker, so I'm sure I'll come up with some clever addons to this basic functionality.

Monday, October 02, 2017

Review: Eachway Tactical Pen

My views on the value of so called tactical pens hasn't changed. Nor has my appreciation for the LAIX Q1-H pen, which I carried for the last year as both writing implement and self defense helper. What has changed is that my LAIX ran out of ink. I went on a fairy wide ranging search for a replacement ink cartridge, but came up empty. It was time to buy a replacement.

I was looking for three things in a self defense pen:

First, it should be built for that purpose. I know there's plenty of advice out there that suggests using a simple metal pen is as good, if not better, than you're typical tactical pen. I'm not buying this. The weight and shape of a pen built to approximate a kubotan is far easier to hold and strike with than a skinny aluminum pen. I'm hardly on an expert on these matters, but if I'm counting something to deliver maximum effect in a few precious moments, I'm going to go with the heftiest option available.

Second, and apparently in direct contradiction to the first point, I want a pen that's discrete. I don't need something that's got a "DNA collector" or other crazy sharp ends, or something that's branded as being deadly (I'm looking at you, Cold Steel Pocket Shark). I want to be able to stroll through TSA with this pen and not worry about being thrown into an interrogation room.

And finally, it should write well. For the last year, I carried the LAIX, and not once did I need it to fend off an attacker. I did, however, find it useful for saving the day in other ways, mostly by writing down important notes.

After searching around, I settled on picking up the ridiculously named: Eachway Anti-Skid Tactical Pen. Somewhat disturbingly, the Amazon link to the item is now completely dead. I did find it being sold on eBay.

Here's how the pen compares to a Pilot G2 and the Q1-H:

Here's a few other shots, including an example of its writing:

Let's see how it stacks up against my original criteria.

Purpose Built: A. The pen is heavy, easy to grip, and fits nicely in a hammerfist. The clip is solid, and I'm generally satisfied with the construction.

Low Profile: B. The presence the carbide tip is a bit funky. It makes the pen look 'open' even when the cap is on. So far, I've traveled with the pen and used it in public frequently and nobody has given it a second look. The cap unscrews, and then screws onto the end with the carbide tip. It's a strange'ish design, but oddly effective.

Writes Well: A. The secret of the pen's writing success is that it takes standard Parker refills. I swapped the ball point refill with the pen with a gel refill and couldn't be happier with the result. I may eventually opt to replace the medium tipped refill with a fine one if I can get my hands on one. I never appreciated how important finding refills would be and how bummed I was that I had to retire the Q1-H simply because I couldn't get a refill.

While the carbide tip of the pen makes it stand out, it's fairly subtle, and does add important additional functionality: that of being a glass breaker. Ideally, I'd find myself an old piece of automobile glass and confirm that the pen works on it. As an alternative, I did some unscientific tests in my kitchen. I grabbed a glass jar out of the recycling bin and tried to break it using an aluminum pen and then the Eachway. The metal pen didn't make a scratch. It took only a couple of strikes to break the glass using the Eachway. I'm not entirely convinced this would work on auto-glass, but clearly, the carbide tip is doing something. As of now, I think it's a useful addition to the pen, nicely adding to its self defense and writing skills.

I'm sorry to report that buying a tactical pen isn't going to turn you into Jason Bourne. It is, however, a handy tool to have in your deal-with-what-life-throws-at-you toolkit..

Thursday, September 28, 2017

The 10 Minute Cordage Organizer - Because a knotted ball of rope is the worst.

For rigging up tarps and other backpacking needs I'll often turn to masonry line as my cordage of choice. Compared to say, paracord, it's lower cost, far more compact, and has a reasonable pound-test rating. Best of all, it's easy to get in high-vis colors, which makes it a bit safer around the campsite.

For my last trip I decided to bring 6 pre-cut 12 foot lengths of cord with me. I figured each chunk could be deployed as a guyline when setting up my shelter.

While this was a fine plan and all, I was almost guaranteed that by the time I got to the campsite the 6 cords would be in hopelessly tangled mess. Clearly there's some sort of corollary to Murphy's law that involves cordage and its necessity to tangle and knot.

To get ahead of this problem, I decided to create a little spool to hold the lengths of cord. All it took was a DSW Shopper's card, an expired library card, a sharpie, a craft knife and about 10 minutes of time:

Ultimately, I didn't end up sleeping under a tarp, so I never deployed the cordage. But, I did confirm that it stayed neatly bundled the entire trip (take that Murphy!). Next trip I think I'll cut down on the length of each segment (to perhaps 6'), but I'm keeping the card organizer the same. It's definitely worth spending a few minutes up front to avoid a cussing session in the woods.

Wednesday, September 27, 2017

A Month of Weekly Discoveries

I've found some gems these last few weeks, what I haven't found is a lot of time to blog about them. But here goes.

I'm finding a really do a have a thing for Australian rap music. My latest find: Out of the Blue by Joelistics. It's a great song with solid story telling. Love it.

The Russian Cosmonaut story, which is supposedly based on Yuri Gagarin's first flight, is an excellent bit of storytelling. Alas, the story is almost certainly not true, but why let the truth get in the way of a good story?

Witt Lowry's Last Letter is wicked powerful stuff. It captures the loss of of a loved one to cancer in such a raw and powerful way. Amazing.

On the non-music side of things, do you need this $2.00 USB powered light? That's the question this video tries to answer. I can tell you on good authority that you do. I picked one up a few months ago (well before I saw the video), found it works perfectly as a travel night light. It's super compact and I'm already bringing along USB wall adapters. I plugin the adapter and light int our hotel room's bathroom and I've got just the right amount of light for a 3am potty trip. As the video shows, there are plenty of other uses for these lights, so definitely pick one up and see what you can do with it.

I know it's cheesy, but I just can't help but enjoy listening to Paramore's The Only Exception.

I'm Pickle Riiiiiiiiiiiiiiiick!. See, it's songs like this one that pretty much ensure I'll never be allowed to work in an office again. Unless these days it's considered normal operating procedure to program and belt out I'm Pickle Rick! at the top of your lungs. Pantless. Yeah, didn't think so.

Hey sis, you can do this with your violin, right? That's some pretty impressive fiddling, if I do say so myself.

In my mind it's official: Passenger is no longer a one hit wonder. I thoroughly enjoyed listening to their entire new album, which I have to say caught me by surprise. If I had to pick one song that I really enjoyed, it would be The Boy Who Cried Wolf. The song is an unexpected and clever take on the tale that gives the song its name. Great stuff and worth a listen.

For the first 50 seconds of Breathe by Lauv I thought it was an OK tune. And then bam! at 51 seconds I was hooked. And just like that, I became a fan of Lauv, whoever that is. Well played Lauv, well played.

The top comment on Chris Stapleton's Tiny Desk Concert says it all: Sooo, apparently I like country after all... . And that's your challenge, listen to Chris and try not to become a fan of country music. His voice. His style. His songs that tell such powerful stories.

Finally, here are two clips that bring the laughs. The first one is a clever twist on what it's like to dine with a vegan, and the second one, well the title says it all: A young man takes his date to an Indian restaurant. To his horror, she goes off-menu in Hindi.. The second one especially is a great piece of hilarious storytelling.

8/20/2017

9/3/2017

9/10/2017

9/17/2017

Tuesday, September 26, 2017

Review: Small as an Elephant

I ended up checking out Small as an Elephant by Jennifer Jacobson because it came up when I searched for Acadia National Park books in our local library's catalog. I checked it out based on the curious title alone.

As I started reading, (yes, actually reading, versus say listening) I realized I'd picked up yet another 'kids book.' This continued the trend I'd started back at the beginning of the summer with Flying Lessons, followed by Pax. And like Pax I quickly realized that I was in for a surprisingly heavy journey. In fact, if you had told me that I'd find a more difficult to read young fiction book than Pax I'd say that you were crazy. And yet in many respects, Small as an Elephant is even more challenging.

While Pax dealt with difficult issues of loss, it had a certain other worldy quality to it. The story was taking place in some future or alternative universe. We can relate to the story, but we have a bit of shielding. Not so with Jacobson's text. Here we find a young boy who is confronted by the very real, and very difficult challenges of mental illness, neglect and how far one can go to keep a family together. The book may be about a 10 year old, and has a bit of a Hatchet feel to it, as our young hero cleverly solves problems and survives. Yet, ultimately, these serious themes are the central focus.

Thankfully, I found the story a bit more straightforward than Pax and couldn't help but enjoy its simpler and more pleasing ending. This would be a challenging book for a kid; heck it's a challenging book for anyone. At the same time, there's a huge opportunity for learning about topics that we're often mum about and could be an important tool for helping individuals understand and cope with difficult family situations.

As a foster parent, I did feel a special sort of connection to the book. I could see a number of best practices we're taught on display, as well as the appreciation that what I was reading wasn't all that far fetched. At the same time, the book didn't give a lot of love to the foster care system, making it yet another stressor in the main character's struggle. I don't blame the author for this. If she's striving to make a realistic character, then it would make sense that a ten year old kid would have his view of foster care shaped by TV and movies. And if there's one thing you can depend on, it's TV and movies showing foster care and foster parents as evil.

I seriously need to lighten up my reading list. At the same time, I've got huge respect for authors like Jacobson who write stories that don't just entertain us, but help us grow.

Monday, September 25, 2017

Hunting for Pawpaws - The Perfect Rosh Hashanah Addition

A few weeks back I noticed folks on /r/foraging reporting success finding pawpaws, and most surprisingly, many of the posts referenced the DC area. This timing checked out, as it was back in September of 2014 when I first learned about the fruit, by discovering it along the Potomac Heritage Trail.

Pawpaws, for those not in the know, are the largest edible fruit native to the U.S. Lewis and Clark, as well as George Washington and Thomas Jefferson enjoyed the fruit. As I learned back in 2014, they grow wild along the Potomac River. While I had seen the fruit there, I'd never actually tasted one.

As Rosh Hashanah approached, I decided that pawpaws would be the perfect addition to the apples and honey we eat on the holiday. I've always been fond of the distinct significance that apples and honey have. Both may be sweet, like the year we're after, but they come about their sweetness in different ways. For apples, it's simple: they're a sweet fruit. For honey, it's more complicated, and represents the sweetness that comes from an unexpected sources. Pawpaws add another dimension to this: as they are sweetness that's in front of you your whole life, yet you've never taken the time to notice it.

While this was a novel idea, how was I going to manage to find pawpaws in such a short time? Shira had an unexpected solution: one of the apple orchards in town also offered pawpaw picking. And so for our pre-Rosh Hashanah apple picking we made our way to Mackintosh Fruit Farms, which along with a large selection of apples did offer pawpaws:

They didn't have a huge selection left, so we were lucky to both pick some and find some in their store.

Incidentally, I did get one jog along the Potomac Heritage Trail before Rosh Hashanah began, and I found many pawpaw looking trees:

However, I saw no sign of any pawpaw fruit. Shira definitely scored with the orchard approach.

On Rosh Hashanah, I enjoyed my very first pawpaw, and I have to say, it was truly delicious. It definitely matched up to the mango'y flavor folks say it has. Even with all the foods I have available they were delicious, I can't imagine how precious these fruits would have been back in the 17th century.

Shanah Tovah Tikatevu! May you have a good and sweet year, full of health and interesting discoveries!

Wednesday, September 20, 2017

Review: Fire Season: Field Notes from a Wilderness Lookout

On the surface, it seems like Fire Season: Field Notes from a Wilderness Lookout would be a tricky book to author. After all, how much can you write about sitting in a tower, staring at the landscape and waiting for a puff of smoke to appear. It turns out, if you're Philip Connors, there's a lot to say and most of it is quite fascinating.

First off, in this age technical wonder that we live in, who knew that Fire Lookout would even still be a job? It is. And Connors takes us through the full range of experiences that a lookout goes through: from the awe inspiring views, to the adrenaline rush of discovering a live 'smoke', to the often unappreciated power of solitude, to the terror that accompanies experiencing a full on lighting storm in a glass and metal box. And yes, he even also covers at times soul-crushing tedium that comes with the job. It's a true testament to Connors' writing skills that I found this book to be a real page turner (or, whatever the equivalent is for an audio book).

We are also treated to a healthy dose of history with book, covering both the creation of National Forests as well as how wild ires have been treated throughout our country's history.

We are truly fortunate that we had individuals with enough courage and foresight to demand that we block off parts of our country to 'progress.' At the time, this must have been an absolutely absurd notion. And yet, now we're truly blessed to have these green spaces.

As for the history of wildfire management, that's fascinating as well. Once I started reading this book, I polled a few individuals, ranging from adults down to middle schoolers about what they know about wildfires. They all reported back to me what I had know before reading this book: fire is healthy. While a wildfire may appear to decimate the landscape, often it's just the opposite, serving to keep the landscape healthy. Connors only reinforced this understanding and added another important dimension: every time you keep a fire from burning, you leave more fuel in place for the next fire. Do this long enough, and you've got the makings of a fire that is far more dangerous and traumatic to the landscape than need be.

What I found so surprising, is that for decades, the exact opposite of these principles were observed. Fire was treated as the enemy, and every means necessary was brought to bear to put it out. It's hard to believe that such a wrong headed idea could be believed by so many, yet those in charge just couldn't imagine a world where fire was doing anything other than destroying precious resources.

I found Fire Season to be my kind of book: educational, inspiring, eye-opening and just a fun read. I'd definitely recommend it.

Tuesday, September 19, 2017

The Keep me Organized/Motiviated/Working Portable Office Sidekick

As a computer programmer, I typically need little more than a computer-like device and an Internet connection to get work done. However, I've found that when I'm away from my desk a few extra items can go a long way towards keeping me effective. This handful of tools helps me stay organized by letting me keep my TODO list updated, stay motivated by letting me focus in on critical tasks, and gives me the chance to tackle certain tasks offline (like, sketching out a design) with relative ease.

Yesterday, as I worked away from my desk, I realized just how valuable this simple setup had become. In the spirit of sharing, here's what works for me. I'd love to know what works for you.

Better Together Pouch - this pouch was a gift (thanks Dawn!) and I love using it. It has slots to hold everything perfectly, and I always feel professional busting it out.

Index cards - I carry a big o'l stack of blank index cards, as well as my active TODO List. Yes, the irony is not lost on me that I'm a computer programmer and I track my TODO list with dead trees. The top card in the stack shows a roughly drawn weekly schedule. I've found that drawing out a schedule on Sunday night is a fantastic way to prepare for the upcoming week. And don't even get me started on the index cards themselves. With their cheap price tag, portable size and ability to offer both a lined and unlined canvas, what's not to love?

Hotel Notepad - There's something both powerful and freeing about hotel stationary. Maybe it's because it's provided free, and there's no consequences for just scribbling on it? Maybe it's because of the compact size and low page count? Who knows. I just know that for brainstorming and other (nearly disposable) writing activities, a hotel pad just feels right.

(2) 0.38mm Pilot Juice Gel Ink Ballpoint Pens - I love the Pilot G2 gel ink, but it wasn't until I tried the .38mm size (instead of the usual .7mm size) that I realized what a difference the right pen thickness could have on my handwriting. I use these ultra fine tipped pens for general writing on note cards, and all of a sudden, my hand writing doesn't have to be a chaotic mess. (I mean, it still is. But it doesn't *have to be*.)

Various color Pilot G2 0.7mm pens. Oh, the power of color! I use green to note due dates, red to title the cards, orange to represent 3shrink links, and purple to mark priority (1 asterisk is priority, 3 means I better get it done today!). My cards may look like a middle schooler created them, but that's fine by me. They're effective.

Not shown: at one point I had small ruler that I found was helpful for making grids and other precise'ish drawings. I lost it. Now I just use the edge of an index card when I need a straight edge. If I see a replacement, I may pick one up.

Also not shown: goodies in my murse daily utility bag, such as headphones, USB cables and other on-the-go essentials.

And that's all there is to it. I should mention that my archival and backup strategy is simple: I just take pictures of index cards and notes, and then I don't worry about losing them.

What's your on-the-go office setup like? Any recommendations?

LinkWithin

Related Posts with Thumbnails