Thursday, March 29, 2018

Tiger Hu Fitness Band - Low Cost, Few Features and a Winner

I stumbled on the Tiger Hu Fitness Tracker Smartband on Amazon, and despite the fact that I have multiple smart watches, I couldn't resist picking one up.

My Zen Watch 3 may bring the functionality, but it's battery life leaves a lot to be desired. I could carry the clunky charger around with me, but that seems downright excessive. The Martian Notifier wins in the battery department, but I didn't find it quite functional enough to pull me away from the Zen Watch. And besides, it too requires a proprietary charger, which I'd rather not bring along.

All these battery annoyances are especially pronounced when I travel.

What I noticed first in the Tiger Hu is that it appeared to solve the battery problem altogether. This, combined with the low price of $29.99 made it a buy I couldn't pass up.

I've now had the Tiger Hu for about two weeks and here are my thoughts on it.

What It Does Well

The device is downright primitive when compared to my Zen Watch, so naturally the battery life is great. But more than that, it totally nails the charging solution. It trounces the Pebble, two Garmins and devices mentioned above, all of which require fidgety device-specific chargers. To charge the Tiger Hu, you peel off one section of the band to expose a surface that plugs in any USB charger. It's brilliant. Here this functionality is in action:

This makes traveling with the Tiger Hu a no brainer.

Given that the device is only $30, I have to say that the fit and finish is surprisingly good. It's far less clunky than my Zen Watch with a noticeable weight difference. Of course, comparing the Tiger Hu and the Zen Watch is silly; it's like comparing a pocket calculator with a laptop. But, if all you need to do is arithmetic, that pocket calculator is nothing to scoff at.

The accelerometer on the device is unexpectedly accurate. On the two occasions I used it to track a jump rope sessions, it perfectly matched the number I counted in my head. On a 4 mile run, the device was off by 400 steps when compared to my phone, which I think is acceptable. The watch also has a heart rate monitor, though I'm not convinced it's especially accurate. When compared to Shira's Garmin, it was typically 10bpm or more off.

The notifications that the watch offers, including calls, SMS, and Skype work well enough. As does the find-your-phone feature. So while the device doesn't do a whole lot, it does mean that I can keep my phone tucked into my bag and not miss a call or text message. Unfortunately, I'll have more to say about notifications below.

Finally, the watch does work well as a time piece. It syncs up with my phone and means that I've got the time and date on my wrist. That may not seem like much of an accomplishment, but long after my Zen Watch has died due to lack of battery life, the Tiger Hu keeps ticking.

What It Doesn't Do Well

The software that comes with the app is OK, though I'm sure it can't compare to a FitBit or Garmin in terms of features. I want to use the watch for basic time keeping and notifications, so I wasn't disappointed by this. But if you wanted to actually use this as a fitness tool, I wouldn't be surprised if you were disappointed. (On the other hand, if you have a teen who's dying to have a fitness band like all her friends, this may solve the problem quite nicely at a steep discount.)

The biggest disappointment is the way the device handles notifications. The app author decided to hard code the list of apps that can generate notifications, and nothing Tasker related made the list. If I could have enabled AutoNotification to send messages to the watch, then the device would have been quite hackable out of the box. As a quick work around, if I do want to get data from my phone to the watch, I can use Tasker to create and send me an SMS.

In general, the watch isn't obviously hackable. Though, I'm not ready to give up on this yet, as I have a couple of low level approaches I still intend to experiment with.

In Conclusion

For $30, I'm now the proud owner of a long lasting, easily chargeable, notification capable watch. Sure, it's mostly just a glorified watch and pedometer, but in many cases, that's just what I need. If that's what you're looking for, you can't go wrong with the Tiger Hu.

Tuesday, March 27, 2018

Hidden in plain sight: Using Unicode Braille Patterns for message obfuscation

Like the author at glow.li, as soon as I found out that Unicode has support for generating Braille Patterns I knew I'd have to put this capability to use. I took a slightly more practical approach than designing a font using braille (which I'll agree with the author, is delightfully perverse) and instead opted to use Braille as a sort of easy to read 'secret' code.

The use case is this: suppose you want to text your wife to pick up some cream for that nasty rash that recently flared up. You want to text her, and make sure she sees the message loud and clear. Yet, you'd like her nosy co-workers to remain in the dark about your condition. So you both agree to: (a) learn the braille alphabet, and (b) use a new convention in your text messages.

The convention I've implemented is this: any words between two sets of dots are automatically converted to Braille encoded letters. This allows you to compose a text message like so:

With the appropriate Tasker code in place, the following alert is shown when the message comes in:

The Tasker code consists of a trivial set of actions to detect encoded text:

The more interesting part is the JavaScript that converts from plain text to Braille Patterns:

function tToB(text) {

  function toHex(v) {
    var x = v.toString(16);
    return x.length == 1 ? "0" + x : x; 
  }


  var bmap = {
    a: [1], b: [1,2], c: [1,4], d: [1,4,5], e: [1,5], 
    f: [1,2,4], g: [1,2,4,5], h: [1,2,5], i: [2,4],
    j: [2,4,5 ], k: [1,3], l: [1,2,3], m: [1,3,4],
    n: [1,3,4,5], o: [1,3,5], p: [1,2,3,4],
    q: [1,2,3,4,5], r: [1,2,3,5], s: [2,3,4],
    t: [2,3,4,5 ], u: [1,3,6], v: [1,2,3,6], x: [1,3,4,6],
    y: [1,3,4,5,6], z: [1,3,5,6], w: [2,4,5,6]
  };

  var html = "";
  var text = text.toLowerCase();

  for(var i = 0; i < text.length; i++) {
    var c = text[i];
    if(c == ' ') {
      html += "&nbsp;&nbsp;&nbsp;"; 
    } else if(bmap[c]) {
      var val = 0;
      for(var j = 0; j < bmap[c].length; j++) {
        val += (1 << (bmap[c][j]-1));
      }
      html += "&#x28" + toHex(val) + ";"; 
    } else {
      html += "_";
    }
  }

  return html;
}

var matches = text.match(/[.][.](.*?)[.][.]/g);
var html = text;
if(matches) {
  for(var i = 0; i < matches.length; i++) {
    html = html.replace(matches[i], tToB(matches[i].replace(/[.]/g, ''))); 
  }
}

The Unicode standard for Braille Patterns is actually quite clever. The dots in a Braille pattern have a standard numeric index. E, for example, has dots 1 and 5 raised. In Unicode, these indexes correspond to bit positions. In the case of E, the bits enabled would be 10001000. This means that you can use Braille Patterns to represent any 8 bit piece of data, from a letter, to an arbitrary byte in a binary file.

Thanks again to glow.li for the inspiration!

Friday, March 23, 2018

An Incomplete, Yet Super Handy Tree Identification Guide

Perusing A Beginner's Guide to Recognizing Trees of the Northeast by Mark Mikolas is like taking a walk through woods with a clever naturalist. Rather than approach the identification of trees with scientific completeness, she seems to know which tree is which through one trick after another. This one over here, she explains, is a obviously a beech tree because it has gray-silver bark and while it's the dead of winter, it still has its leaves.

Mikolas' book has a simple recipe format. Name the tree, list useful cues for identifying the tree, and then spend a few paragraphs expanding on each cue. There are also photographs that visually depict the cue, which of course is quite helpful. The book is relatively brief, covering about 45 trees or so. However, what it lacks in depth it makes up for in functionality.

One of my little pleasures is identifying plants and other objects I come across while in the wilderness. To know something's name is to appreciate it on a deeper level than just the broad category of plant or tree. So for me, Mikolas' book is a win. It's not just that my chances of identifying trees is increased. By keeping the books cues in mind, I find myself noticing details about trees I'd never considered before. Which direction do the branches grow? What kind of shape or texture is the bark? Does the tree have its leaves in the winter? Even if the list of trees I can identify doesn't greatly increase, I'm thankful to Mikolas to opening my eyes to new features I'd never considered.

As I was reading 'Recognizing Trees' I so wished I had a way of committing the trees and their features to memory. Alas, I'm not especially gifted in that department. What I could do, however, was to quickly type up all the trees and their cues into a Google Spreadsheet. Check them out here:

I then printed this sheet using the multiple-pages-on-one-sheet setting enabled. The result: a mouse-print, wallet sized version of the guide:

My plan is to carry this cheat sheet with me in my wallet and put it to use on our next hike.

You're welcome to use these cues too, though without Mikolas' explanations, I doubt they'll mean a whole lot to you.

There's a time and place for a Peterson Guide to Eastern Trees, but if you want a fun and non-overwhelming approach to tree identification, 'Recognizing Trees' is the way to go.

Thursday, March 22, 2018

Scenes from a Flight

Here's some anti-flying-anxiety photography from our last trip to Boston.

The first set of pictures were taken on our night flight heading to Boston. The long exposure shots worked surprisingly well given they were snapped on my cell phone without any planning.

The last photo shows an aerial view of DC from the opposite end of the National Mall. You can clearly see RFK stadium, as well as the major diagonal streets that make driving in the district a needlessly confusing experience.

Tuesday, March 20, 2018

On a Roll: Cheap, Compact and Versatile Cordage

From in-field repairs, to basic camp chores, whenever you head into the backcountry there's no shortage of uses for rope. There are countless varieties of cordage out there, and finding the right balance of strength, cost and bulk can be tricky. One of my favorite options is a spool of 100LB test fishing line that I picked up years ago. It's strong enough to be used most for camp activities, like staking out a tarp or lashing items together. But its utility doesn't stop there: because of the narrow diameter (6mm or so) and lack of stretch, I've used it as sewing thread and even as an improvised cutting tool. Heck, I bet you could even use it for fishing. Of course, the lack of bulk means that it's quite packable and easy to stash in whatever kit I'm carrying.

I've often wondered what the ideal way to carry this type of cordage was, and being inspired by the sewing I've been doing, I decided to try spooling it onto a bobbin. This isn't really a stretch: it's more or less exactly what the sewing machine was designed to do. The spool of fishing line was too large to fit where the thread usually rests; but I found that a baby's stacking toy we had lying around made the perfect resting place for the fishing line.

Once I had things situated, it took only a minute to fill up two bobbins worth of cordage.

By my estimate, each bobbin holds about 18 feet of cordage. Not bad for the size of the finished product. Also I confirmed that I can pull the line off without forming knots.

I can see picking up a half dozen more bobbins, filling them up, and sprinkling these little spools of cordage all over. I think this method works quite well.

Boston Simchas - Two Birthdays and a Siddur Celebration

It was a weekend of family Simchas as we celebrated Dovid and Chana's birthday, and Tzipora receiving her first siddur. This made for a whirlwind trip to Boston, but boy was it worth the exhaustion.

Friday morning, bright and early, we assembled to watch Tzipora and her classmates receive their first siddur. They put on quite the presentation / play, which was all done in Hebrew. Tzipora had quite a few solo moments, during which an entire row of family beamed with pride.

It was too chilly on Shabbat to venture outside, but Shira and I came prepared for this. Before we arrived, I had a Marble Genius Super Run shipped to the house, and we spent a good part of the day putting together various configurations. The kids were patient as we tried to figure out the best strategy for having 4 children build all at once. But we got there. I've had plenty of experiences where a toy didn't live up to the picture on the box, but not this time. We really did have a blast building various tracks for the marbles, and there were enough pieces in the box to make for interesting structures. Definitely a fun toy for the whole family.

After lunch, we played Bananagrams, a game that's known to be a hit among the adults. This time, however, Shira played with Tzipora and I played with Dovid. Shira and Tzipora won a few games, and Tzipora demonstrated impressive trash talking skills. What can I say, she's a natural born competitor who loves to win. Pairing her with her Aunt Shira made for quite a team.

Before we knew it, it was Sunday morning, where we had a delightful family learning activity at the kids' school. In the span of an hour, we ate, made matzo by hand, crafted a drum in honor of Miriam and banged around on various school instruments. It was tons of fun, and the kids all did great. From there, we did a few last minute preparations, and then it was time for the Twins to have their birthday party.

The kids had their party at a climbing gym, which was an awesome venue. All the kids gave it their all to climb, but Gavriella was clearly the most fearless. She, in her special kiddie sized harness, was just too adorable. Alas, we didn't have time at the gym to climb ourselves, nor did we have a chance to stay for cake. But when we left, everyone was having a blast.

9 years. Just where did the time go?!

Thursday, March 15, 2018

An Old Friend Gets A New Look

A lot has changed since I started working as a programmer in Washington, DC area nearly 20 years ago. Hardware has gone from physical to virtual with specs that I could barely have imagined. I've traded PHP for Java as my daily server side language of choice. Gone is the office and coworkers, replaced by programming in my pajamas and a 0 mile commute.

Some things haven't changed: the thrill I get from tracking down and fixing a bug, the joy of implementing an elegant solution to a problem and my chair. Yes, my chair.

This old guy has been with me since day one at Amazing Media. When the company fizzled out, I was able to take my trusty steed home with me. He found new life as my office chair when I started my own company.

I marvel to think of all the ideas I've had—some great, some horrendous—while sitting in this chair.

A few years ago the plastic on the arm rests started to disintegrate. I grabbed the first solution at hand: a roll of atheltic tape, and patched him up. That was a mediocre solution at best, because the tape would eventually peel, get all nasty and require another layer of tape.

I realized a couple of weeks ago that I now had a new tool in my toolbox to solve this conundrum: sewing. So yesterday and today, I upcycled a pair of comfy PJs into custom arm covers.

One one had, the process was super simple: cut out rectangle of fabric and sew in 4 channels to hold some heavy duty fishing line. On the other hand, nothing is ever that easy. I finally ran out of thread in my bobbin so I had to learn how to spool a new one (seriously, what a satisfying experience!). And of course, I made the first one too large and had trim and resize it. But all in all, I think the project was a success.

These days, I tend to stand at my desk more than sit. But the chair, he's still there. Ready to support me, regardless of whatever challenge we're facing.