Friday, May 22, 2020

Hiker in Training: Gulf Branch Trail

To recap: I want to take our 16 week old for some serious hiking, but I realize we need to ease into this to avoid total parent and baby meltdown. Phase 1 was to figure out which carrier worked best for hiking. With that done, it was time to pick the first hike.

I wanted a 'real' trail to hike on, but I also wanted it a short drive away so that it was a minimal investment in time and it had be relatively short. Our solution: hike the Gulf Branch Trail which follows Gulf Branch. All told, we did 2 miles, which included 1.5 miles out and back on the Gulf Branch Trail and then another .5 miles of exploring because the little man was sleeping and we could get away with it.

Like Windy Run and other nearby offshoots of the Potomac Heritage Trail, the trail follows a stream down to the Potomac. Even though you're in the midst of Arlington, you feel like you're doing authentic backcountry hiking. We saw a couple of families along the way, but the trail really wasn't busy at all. Best of all, our little guy enjoyed the hike. He got to stare up at trees and have a little picnic at our turn around point.

If you're in Arlington, you're no doubt itching to get out and have an adventure during the COVID-19 lock down. Hiking the Gulf Branch Trail (and the neighboring runs) are an absolute no-brainer.

Hiker in Training: Pre Hikes

My strategy for planning an outdoor adventure could be summed up in two words: Overdo It. You know, jump in the car and drive 3 hours away, into awful weather, to hike a technically difficult trail that's not fully mapped out. Shira puts up with overdoing it, but our 16 week old, not so much. Heck, given how little we've spent in the car, we're not sure he could endure a long'ish car ride, not to mention a long'ish hike.

So I've been trying to be smart about this, and build up our little hiker's ability step by step.

Phase one has been through a series of walks in the neighborhood. The primary goal: figure out which carrier is most comfortable for him and us. The Moby carrier, while great in the winter and for general snuggling, has shined less once the sun is out. Not to mention, adjusting it on the fly is a real chore.

The Baby Bjorn is a sweet carrier, but our little one isn't so little any more, and we've seemed to have hit its maximum carrying capacity. I mean, I'm sure it technically carries heavier children, but I'm not sure how you do this and breathe at the same time.

Running low on options, I busted out the oddly named Fresh Shine Baby Hip Carrier and gave it go. I bought it 3 years ago when we had an especially zoftig baby placed with us. I thought surely it would be too big for our our little guy. In fact, he fit perfectly and the carrier has been a total winner.

The Fresh Shine's design has a seat to hold the baby, which puts nearly the full weight of the baby on your hips. This is the same strategy that's been employed by back-country backpacks for years and it works. The result is no back pain and a carrier that feels agile to move in. It's also lightweight and easy to take the baby in and out of. Though doing this is a two person job. We've had success carrying our little guy facing out and in, which gives us the option have him watch the trail or nap.

With the carrier figured out, it was time to plan a hike.

Friday, May 15, 2020

Giving Ionic's Capacitor a Dev Friendly Boost

I recently started a Capacitor based Ionic project. After years of working with Cordova, the framework initally felt jarring. However, with even a bit of use, I'm already buying into Capacitor's benefits. The Cordova approach of generating Android and iOS projects often worked great, but at times the approach showed itself to be quite fragile. Something would change in the iOS world and you'd be at the mercy of Cordova to update the build process to catch up with this. Not so with Capacitor, which embraces the notion of working directly on Android and iOS native projects.

I do however miss a number of nicities that Cordova offered. Take versioning. It seems obvious that there would be a central location where your project's version number was set and the iOS and Android apps pulled from this. And yet, this isn't the case with Capacitor. The thought of having to launch two different IDE's to manually change the app's version number seems like a recipe for disaster.

Speaking of launching IDE's, the thought of giving up command line building and running of apps is another step backwards.

Fortunately, with a bit of shell scripting the versionining and building challenge for Android can be addressed. Building from the command line on iOS is possible but it will take a bit more research befor I get it figured out. I added this functionality to my ionicassist command line tool. It's now possible to say:

  ionicassist android-cap
  ionicassist ios-cap

To push the version number found in capacitor.config.json to both Android and iOS and build and install the Android project from the command line. The source code for ionicassist is below. Most of the code is straightfoward, though dealing with the ridiculous Info.plist format took some work. xmlstarlet and jq both proved invaluable for this little project. 

#!/bin/bash

##
## Scrip to help with ionic dev
##

action=$1 ; shift
case $(uname) in 
  Darwin)
    PLATFORM_TOOLS=$HOME/Library/Android/sdk/platform-tools/
    APK_DEST="$HOME/Google Drive (ben@ideas2executables.com)/Clients/Uchi/APKs/"
    ;;
  
  CYGWIN_NT-10.0)
    PLATFORM_TOOLS=/d/tools/android/platform-tools/
    APK_DEST="/d/Google_Drive_i2x/Clients/Uchi/APKs/"
    ;;
esac

ADB=$PLATFORM_TOOLS/adb

case "$action" in
  grab-apk)
    name=$(xmlstarlet sel -N x=http://www.w3.org/ns/widgets  -t -v '/x:widget/x:name' config.xml | sed 's/[^A-Za-z0-9_-]//g')
    version=$(xmlstarlet sel -N x=http://www.w3.org/ns/widgets  -t -v '/x:widget/@version' config.xml)
    cp -v platforms/android/app/build/outputs/apk/debug/app-debug.apk "$APK_DEST/$name-$version.apk"
    ;;

  grab-release-apk)
    name=$(xmlstarlet sel -N x=http://www.w3.org/ns/widgets  -t -v '/x:widget/x:name' config.xml | sed 's/[^A-Za-z0-9_-]//g')
    version=$(xmlstarlet sel -N x=http://www.w3.org/ns/widgets  -t -v '/x:widget/@version' config.xml)
    cp -v platforms/android/app/build/outputs/apk/release/app-release.apk "$APK_DEST/$name-$version.apk"
    ;;

  screencap)
    if [ -z "$1" ] ; then
      echo "Usage: $(basename $0) screencap {file}"
      exit
    else
      file=$1 ; shift
      $ADB shell screencap /sdcard/screen.png
      $ADB pull /sdcard/screen.png $file
    fi
    ;;


  screenrec)
    if [ -z "$1" -o -z "$2" ] ; then
      echo "Usage: $(basename $0) screencap {file} {duration}"
      exit
    else
      file=$1 ; shift
      duration=$1 ; shift
      $ADB shell screenrecord --verbose --time-limit $duration /sdcard/screen.mp4
      $ADB pull /sdcard/screen.mp4 $file
    fi
    ;;

  adb)
    exec $ADB "$@"
    ;;

  sync-cap)
    cap_conf=capacitor.config.json
    and_conf=android/app/build.gradle
    ios_conf=ios/App/App/Info.plist
    if [ -f "$cap_conf" ] ; then
      version_name=$(cat $cap_conf  | jq -r  .appVersion)
      version_code=$(cat $cap_conf  | jq -r  .appVersionCode)

      if [ -f "$and_conf" ] ; then
        mv $and_conf $and_conf.prev
        sed -e "s/versionCode .*/versionCode $version_code/"  \
            -e "s/versionName .*/versionName \"$version_name\"/" \
            < $and_conf.prev > $and_conf
        rm $and_conf.prev
      else 
        echo "Android: $and_conf not found, skipping"
      fi

      if [ -f "$ios_conf" ] ; then
        mv $ios_conf $ios_conf.prev
        xmlstarlet ed -u '/plist/dict/key[text() = "CFBundleShortVersionString"]/following-sibling::string[1]'  \
                   -v $version_name $ios_conf.prev > $ios_conf
        mv $ios_conf $ios_conf.prev
        xmlstarlet ed -u '/plist/dict/key[text() = "CFBundleVersion"]/following-sibling::string[1]'  \
                   -v $version_name $ios_conf.prev > $ios_conf
        rm $ios_conf.prev
      else 
        echo "iOS: $ios_conf missing, skipping"
      fi

    else 
      echo "$cap_conf not found. Giving up."
      exit
    fi
    ;;

  android-cap)
    cap_conf=capacitor.config.json
    if [ -f $cap_conf ] ; then
      app_pkg=$(cat $cap_conf  | jq -r  .appId)
      ionic cap copy
      ionicassist sync-cap
      cd android ; ./gradlew installDebug
      $ADB shell monkey -p $app_pkg 1
    else 
      echo "$cap_conf not found. Giving up";
    fi
    ;;

  ios-cap)
    ionic cap copy
    ionicassist sync-cap
    ionic cap open  ios
    ;;
  *)
    echo "Usage: $(basename $0) {grab-apk|grab-release-apk|screencap|adb|sync-cap|android-cap}"
    exit 1
    ;;
esac

Friday, May 01, 2020

Review: The Trumpet of the Swan

What feels like a lifetime ago, 10 year old J was visiting us and we had a few moments of downtime. I suggested we have some reading time and grabbed the first book nearby that I hadn't read: Trumpet of the Swan by E. B. White. We took turns reading a few chapters and by the 3rd chapter we were both hooked. J went home and finished reading the book within a week. It took me longer, but I eventually got through it.

--Spoiler Alert--

I'm of two minds about this story. On one hand, it's brilliant and inspiring. The book pulls no punches: Louis is disabled. He can't speak, and for a swan, speaking is nearly everything. Yet, Louis and his family don't let his circumstances dictate the outcome of his life. Through creativity and hard work, Louis accomplishes far more than a typical swan ever would. What a powerful example for a young person who may feel that their differences somehow makes them less.

As a person who thrives on being a fixer, this notion that no personal limitation can't be hacked is pretty much a core belief. So I can't help but applaud the book as it shows example after example of Louis creatively solving his problems.

On the other hand, I can't help but be bothered by how unrealistic the book is. And by unrealistic, I'm not referring to the suggestion that Louis is capable of such high level learning and reasoning. I'm fine with that; it's a story after all. But what I can't forgive is how White allows every undertaking Louis makes to be a success. Louis wants to learn to write, so he goes to school and learns to write. He wants to make money playing his trumpet, so he gets a job at a camp and makes money playing his trumpet.

Shame on White for only giving Louis one challenge to overcome and providing smooth sailing from there. How is that an example any child can learn from? Being a fixer means you're going to fail. A lot. Learning to pick yourself up and try again is what makes the process of self improvement even possible.

Overall, what the book lacks in authentic problem solving, it makes up for with a fun story and clever characters. This is definitely a book you'll want to read and discuss with your kids.

Sunday, April 26, 2020

Cause My Arms Are Tired | A Field Expedient Baby Carrier

Far and away the fanciest furniture in our home belongs to our little one. Yet, his favorite resting spot continues to be our arms. And while his near 15 pounds of baby cuteness doesn't sound like much, he gets heavy! Our goto carriers are the Moby Wrap* and Baby Bjorn, and they both work really well. Yet, I found myself looking for other ways to help lighten the load.

Inspired by an Aden + Anais extra large swaddle blanket (47x47 inches baby!) that my Sister-in-Law and Brother gifted us, and memories of playing with Furoshiki wrapping, I wondered what would happen if I rigged up a sling to carry the kid around.

I laid the blanket out and tied the opposite corners together like so:

At this point, I had a sort of crude bag that could be slung over my shoulder. Carefully, I slid our 10 week old baby into the space and let the blanket take his weight:

The square knot that bore the most of the weight cinched down nicely and showed no signs of slipping. The blanket itself also felt secure. And just like that, I had the world's worst baby carrier. The knot dug into my back and the kid was nowhere near secure enough to go hands free. Yet the hack showed promise. The weight had been shifted away from my arms, and one hand had been freed up. At this age, the Moby Wrap works great as a place for the baby to cuddle and sleep. Using my improvised sling, which is mostly just me holding him, I found he could face out and interact with the world.

Over the last couple of weeks this little setup has been truly helpful. When I need just a little extra mobility or want to give my arms a rest, into the sling the baby can go. I also like that as long as I carry one of these blankets in his baby bag, I've got a backup baby carrier. This would have been handy when we visited a museum and found out that strollers were a no-no.

Soon he'll outgrow the sling, and at that point I should be able to use more carry options with the Moby Wrap (like say hip carry). But in the mean time, I'll take all the help I can get.

Two final points: First, I bet there's an established way to do what I'm doing. Perhaps it's a product you can buy or a well known hack. Either way, I won't be surprised if someone leaves a comment: uh, if you just bought X, you'd get all the benefits you have now.

Second: Shira's not impressed with the sling idea and has her own solution: lifting weights and having actual arm strength. To each their own, I suppose.


*Case in point, I'm composing this blog post as our little one naps in the Moby Wrap on my chest. Man I love this thing!

Wednesday, April 22, 2020

3am Audio Hack - Playing Lullabies and Netflix at the Same Time

Years ago, as we prepared to take on our first Foster Placement, I read this book. One piece of advice from this text has stuck with me:

There are no maintenance tasks with a baby.

That is, while diaper changing or feeding a little one a bottle may feel like work can be done on autopilot, it's worth striving to avoid this. These so called 'maintenance moments' are in fact a opportunities to connect and be present with the one you're caring for.

Over the years, this advice has served me well. But I also have to admit, even I have my limits. When it's 3am and I'm rocking a little one back to sleep for the 4th time, I think I can be forgiven for wanting to unplug from the moment. And that's what my latest hack is all about.

Did you know that on Samsung devices, you can go to: Settings » Sound and Vibration » Separate App Sound to configure your phone such that one app plays audio through the speaker and other apps play through a Bluetooth headset?

Why is this useful and what does this have to do with rocking a baby to sleep at 3am?

Using this setting you can softly be playing lullabies via Amazon Music on your phone's speaker, while binge watching a TV show on Netflix using a pair of Bluetooth headphones.

Just remember: with great power comes great responsibility; So use with care.

The Separate Sounds functionality should also be useful for solving the age old problem of having Google Maps navigation be announced via the phone's speaker, while a podcast plays via Bluetooth audio. Got to love these non-standard, random'ish features manufacturers add to Android OS.

Tuesday, April 14, 2020

Passover Thoughts, Covid-19 Edition

I've been mulling over what it means to celebrate Passover in a world wrestling COVID-19. For one thing, it meant trading a raucous multi-family seder for a quaint (and delightful!) one between Shira, Myself and our 11 week old.

Like the first Passover our ancestors went through, we find ourselves under a stay at home order, with an unseen force lurking outside ready to do harm. Sure, the CDC has called for social distancing, and not smearing lamb's blood on your doorpost, but the message remains the same: stay home, heed the instructions of experts, and stay safe.

I'm also gaining fresh perspective on what it means to have your life dramatically altered seemingly overnight. We look at the Jews leaving Egypt as going from slaves to free men and women. But that's with the benefit of a hefty dose of hindsight. In the moment, you can appreciate how it must have felt like trading one precarious situation for another. That is, to go from a slave to a wandering people unsure where your next drink or meal could be found.

While COVID-19 restrictions didn't go into effect at the stroke of midnight, they have descended on us at an alarming rate. Suddenly, parents are home-schooling teachers; office workers are work-from-home employees, and a massive number of people are simply unemployed. Basic human interactions, like sharing a meal or giving a hug are now off limits. The science tells us this is all for our own good. But like those Israelites heading into the desert and being told how fortunate they are to be free, you can be forgiven for wondering: what the heck did we get ourselves into?!

Here's to enduring the scourge that is COVID-19 with as little hardship as possible, and diligently looking for ways to use it as fuel for good. Like our ancestors, may we be able to look back at these events and see more than just the challenges. And next year in Jerusalem! Or really anywhere, as long as it's together in the same room.

Monday, April 13, 2020

A First Hike in Gunpowder Falls State Park

Two weeks ago, the stars looked to be aligning: the weather was going to be top notch, and our day free. We could finally get in some quality hiking! Because we wanted to practice smart social distancing, we opted for what appeared to be a low traffic hike: Little Gunpowder, Winterfell, Quarry Loop located in Gunpowder Falls State Park.

We arrived at the trail head to find cold and dreary conditions. On the plus side, the cruddy weather appeared to be keeping people away. Off we trekked into the wilderness, opting to take the hike uphill first to help us warm up.

For the first half of the hike we found the seclusion we were looking for. We saw no other hikers, and while the conditions remained cold and damp, they also served to enhance the scenery. With the mist, it felt like were in enchanted woods.

This was our little guy's first official hike and for the first couple of miles he slept right through it.

As we descended the Quarry Trail and re-joined the Little Gunpowder Trail we found ourselves with a choice: go left and log an out-and-back hike which would get us more miles and a chance to see a waterfall. Or go right and close out the loop we'd started. At this point, our 10 week old woke up and urgently asked where his next meal was. It also became clear that it wasn't going to warm up and that the 70+ degree temps we'd anticipated weren't coming. We hadn't expected to hike the full day in 50 degree weather, and weren't properly equipped for the day.

So we opted to close out the loop. We encountered a few families at this point, and I'm sure we looked like quite the sight: our little guy slurping down a bottle while we hustled back to a warm car.

All told we logged only 4.26 miles out of the planned 6.6. I got yet another hard won lesson in the need to closely watch the forecast and plan accordingly. I kick myself, because if I had planned for cold weather, we'd have almost certainly completed the full hike.

Still, I'm counting the hike as a success. We learned about a new state park to explore, our 10 week old got his first taste of the wilderness, and a number of gear choices were spot on. Mainly, I carried a large backpack which had food, our little one's diaper bag and my essentials, and Shira carried the kid and a small fanny pack with her essentials. At the last minute, Shira opted to use the Moby Wrap carrier instead of a Baby Bjorn one. The reasoning: the Moby does especially well in cold conditions. This turned out to be a smart move.

Later in the day Shira noticed this tweet from our trusted weather friends Capital Weather Gang:

And where's Gunpowder Falls State Park? Outside Baltimore. D'oh!

I look forward to getting back to Gunpowder Falls State Park and seeing this elusive waterfall.

Monday, March 30, 2020

From Office Supplies To Ninja Armaments

Times are tough. Toilet paper, eggs and even flour are scare around here. School is canceled and we're effectively sheltering in place. But here's useful tip: if you have two sheets of printer paper and a few minutes of time, you can have a throwing star. You can also have a boomerang. Welcome to COVID-19 arts and crafts time baby!

I consider my origami skills beginner at best, so I was pleased how approachable the throwing stars tutorial is. Another fun project: make a treasure chest using two origami boxes.

Sunday, March 29, 2020

Make With Care: Protein Packed Hot Chocolate

I've had the idea a number of times: I bet I can make my morning hot chocolate more nutritionally significant by adding whey protein powder to it. My reasoning goes: whey comes from milk, and milk goes with hot chocolate. And the flavor of the chocolate should overpower the whey. The result: a solid hit of protein in a hot and tasty drink.

And yet early attempts at making whey hot chocolate were disastrous. I'd mix the whey and hot chocolate packet easily enough and then I'd add boiling water. The whey immediately formed nasty clumps and no matter how much I stirred the mixture, wouldn't dissolve. And trying to drink clumpy hot chocolate? Yuck to put it mildly.

Still, I tried this a couple of times before I got the hint: adding boiling water to whey is a bad idea. A little Internet research explains:

If it’s whey protein powder, you might want to avoid boiling it with milk. Most of the whey that is sold in market, is acid whey, which will cause curding of milk. It’s not harmful for health, but you might find the end product difficult to consume.

Difficult to consume is an understatement.

All isn't lost, however. If you're a more strategic about it, you can warm up the hot chocolate and whey so that you don't end up with a curdled mess. Here's what's been working for me:

  • Mix the hot chocolate and whey protein powder in a mug
  • Put some water on to boil, and turn on your sink's hot water tap
  • When the tap water is running as hot as can be, use it to fill the mug a quarter of the way
  • Mix the hot tap water with the whey and hot chocolate powders to form a thick sludge. The goal is get the powder completely dissolved at this point
  • Once the water is done boiling, let it cool for a minute, then add it to your mug, filling it to the top
  • Stir and enjoy!

The hot tap water should help both powders dissolve and the recently-boiled water should be hot enough to make the drink enjoyable, but not so hot that it curdles the why protein.

Mmmm....delicious and nutritious.

Monday, March 23, 2020

This Buds For You | Savoring Signs of Spring

Last Friday Shira, the little one and I logged a 6 mile walk along the Virginia side of the Potomac. It was a perfect day and signs of Spring busting out were everywhere. With the steady drumbeat of pandemic news it was nice to step outside and forget that we're in the middle of a global crisis.

Speaking of being outside, over the weekend DC closed the National Mall, something I didn't imagine was possible. But if you surround an area with enough police and National Guard, I suppose anything is possible.

These are truly remarkable times.

Thursday, March 19, 2020

Musings From Within a Pandemic

COVID-19 is turning our world upside down. It seems only appropriate to jot down a few notes to my future self. Self, when you recount these days, folks simply aren't going to believe you.

Thought 1: our 'new normal' has descended upon us at break neck speed. Two weeks ago I was shaking hands with folks at shul and discussing whether coronavirus would be more dramatic than the flu. Last week, we held services with each of the chairs spaced three feet apart, I washed my hands three times during services, and the Rabbi repeatedly reminding us not to touch each other or the Torah. This week, shul is closed indefinitely. We've had friends' Bar and Bat Mitzvah's go from happening, to 'we understand if you can't make it', to called off all in a matter of weeks.

What seems impossible one day, schools closing for months, Metro working tirelessly to lower ridership, DC shuttering all bars and restaurants, is our normal the next. The CDC continues to lower its recommended maximum group assembly count. It's gone from 500, to 250, to 50 and is now at 10. It would shock no one if we awoke tomorrow with instructions not to leave our homes at all.

If a movie came out three weeks ago suggesting a mysterious illness required the world to shutter schools and businesses and mandate groups of no more than 10 assemble, I'd have written it off as ridiculous. Yet, that's where we are today.

Thought 2: the impact on businesses, especially small businesses, is catastrophic. Walking down Columbia Pike and seeing closed business after business is heartbreaking. Being online comes with its own challenges. Suddenly the customers you serve have no income, making your business prospects just as bleak. The more essential the service you provide, the more likely you'll have to offer it at no charge. While this generous gesture will earn you good will, it won't bring in funds to pay your employees or operating expenses.

As terrifying a time as it is for entrepreneurs, it's also every bit exciting. I'm seeing organizations refashion and even invent new business models seemingly on the fly. Companies are seizing the opportunity to help others and continue finding ways to eek out an existence. The very small businesses that are getting crushed are also going to help us get through this. In a small way, it's very heartening.

Thought 3: we're still in the calm before the storm. As of today, we have 14 known cases of coronavirus, a number that seems low when compared to the unprecedented measures being taken (see above). Yet, we're all bracing for this to get bad. Really bad.

Monday, March 16, 2020

Crafting Music | Building and Playing the Canjo

The Canjo is a one stringed instrument that uses a can as a resonator. It has a reputation for being easy to build and easy to play.

A few weeks ago, when 10 year old J was visiting us, we put these claims to the test.

Before J arrived, I'd purchased a couple of Canjo kits and a song book. Surprisingly, I was able to find all the tools we'd need for assembly around the house.

When we had a couple of hours free, we dove into the project.

On the surface, assembly looks trivial. You're doing little more than attaching a can and string to a stick. In practice, we found the build process more on the challenging side. Most of the holes are not pre-drilled, so you need to take your time and assemble with care. This complexity is far more feature than bug. We felt like we were really creating something, not just snapping together a toy. In about 30 minutes, we had the our first of two Canjo's complete. It was awesome.

Playing the thing, like assembly, looks simple. As suggested, we numbered the frets on the Canjo's neck to correspond to the song-book's instructions. In theory, to play a song all one has to do is hold down the string at the number that's listed under the word you're singing, and strum. In practice, it's tricky! Even playing slowly, it takes time to position your fingers and even then, you've got to hold down the string just right to get the best sound. Still, with practice, we were definitely able to make music!

Here's me busting out the Canjo and taking a few attempts at one of the songs in the book:

I know that's screechingly bad, but still, you can hear the tune in there right? That's music. I made music!

As my Brother David noted, the Canjo is effectively an offline version of Rock Band. And he's right; as addictive as it is to try to hit the notes when they are scrolling by on screen, it's even more so when you're the one making the music.

10 year old J really enjoyed the Canjo project, from the measuring and drilling to just noodling around on the finished instrument. If I'd had my act truly together, we'd have hit the local hardware store and would have picked up a set of tools just for him. I would have also picked up some blocks of wood we could have tested the drill and awl on. Not too long ago, it would have been normal for a 10 year old to mess around with hand tools, now it's a novel experience. Want to get your kids to put down that phone? My suggestion: buy them some power tools and other sharp implements, and have them make stuff.

Another suggestion for having a successful Canjo experience: pick up some extra strings at the time you place your order. They are cheap and we quickly broke two of four that were provided. Finally, I'd suggest picking up a digital tuner. This sounds like an extravagance, but $12 for a device which ensures your Canjo sounds as good as it can is a bargain.

So, is the Canjo easy to build and easy to play? Not for me and J it wasn't. But this lack of ease only served to make the project more rewarding. Canjos rock!

Thursday, March 12, 2020

Wrestling with a Google Play Services Error

Last week I got the Android 10 update on my Galaxy S9+. Whoo! Then, a few days later, I went to update a Tasker action that used the Spreadsheet Tasker Plugin and got the following error:

Spreadsheet Tasker Plugin requires one or more Google Play services that are not currently available. Please contact the developer for assistance.

I did the usual things: rebooted my phone, re-installed the Spreadsheet Tasker Plugin, made sure all my apps were up to date, searched Google for others having similar problems and cursed the universe. None of this did any good.

Surely the upgrade to Android 10 broke things. I grabbed an old Android device and installed Tasker, the Spreadsheet Tasker Plugin and did a restore from Google Drive to import Profiles and Actions. To my shock and great annoyance, I got the same exact error. Whatever was going on, it wasn't due to the Android 10 update. Even my crusty Android 8.1.0 phone was failing with the same error.

The only hint that others had into this issue was a couple of threads related to Android Auto. Deep in one of those discussions was this advice:

I had this issue but was able to fix it by going to settings > apps > google play services > storage and then clearing the cache. Once I did that and reinstalled Android Auto I no longer got that error. I uninstalled the app, then cleared the cache, then reinstalled the app.

With nothing to lose, i gave this a try:

For maximum impact, I cleared both the cache and the app's data. After doing this and rebooting, my problem was solved!

So what the heck happened? I've got no idea. But if you get the above error, before you curse the universe, try clearing the Google Play Service's cache & data.