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.

Tuesday, March 13, 2018

A Powerful Scene at the US Capital

My brother caught this stunning picture of the #notonemore monument on the lawn of the Capital. It shows a slice of the 7,000 shoes that were on display, each one representing one of the 7,000 lives lost since the Newtown shooting.

While this display is only 10 minutes from my house, I wasn't able to make it out today to catch it in person. So a huge thanks David for being my eyes. So well done!

Monday, March 12, 2018

So Useful: Yet Another Mail Merge

If you use Gmail and Google Sheets, you need to know about Yet Another Mail Merge (YAMM). This plugin allows you to draft an e-mail in Gmail, and send it out to recipients in a spreadsheet. The e-mail contains tokens which correspond to the headings in your spreadsheet. Basically, it does what Old School mail merge used to do with Word and Excel, minus the joy of stuffing envelopes.

I'm working on a project for shul, and I wanted to send a reminder out to the participants that entries were due in a week. I could have sent a mass e-mail by including everyone in the BCC header, but using YAMM is a far better solution. The obvious advantage is that I can personalize the e-mail, including specific details about each person's piece of the project (which is already being tracked in a spreadsheet). YAMM also reports on who has opened and replied to the e-mail, which is an unexpected bonus.

Here's a crude example of how YAMM works:

Step 1: Draft an e-mail

Step 2: Organize your data

Step 3: Merge and send out the e-mails

At times, nothing beats a specialized e-mail platform like MailChimp or evite. But when you've got a job too small or specialized for these services, and too cumbersome to handle manually, YAMM is the way to go. Try it, and I'm sure you'll add it to your toolbox.

Here's a video tutorial to get you started:

Friday, March 09, 2018

Managing Multiple Android Devices for the Lazy and Impatient

Recall that I've got a handful of Android devices that need to be configured, and not enough time and patience to do so. I progress on this challenge by writing a shell script around adb that pulls down, pushes up and deletes the apps from a phone.

While this allows me to install and uninstall apps in bulk, it doesn't account for app settings. In my case, settings are key because I need to lock down these devices to insure they remain in content creation mode only (Sorry, no YouTube or Fruit Ninja here). Previously, the ability to lock out apps was provided by Apex Launcher; a slick app, but one that was both too complex and not bullet proof enough for my needs.

I was able to solve both my configuration problem and improve the launcher experience by taking advantage of two new facilities.

First, on the master phone, I installed Kids Place - Parental Control. This is a far simpler launcher than Apex, and is a natural fit my use case. Kids Place is one of many launchers that provide a very simple user experience on the front end, while letting the parent configure the available apps on the back-end. What makes it unique is that the free version is fully functional and doesn't display ads. The pro version offers some nice to haves such as controlling the time of day the device is available and allowing you to put a custom photo in the background. But for my purposes, these features aren't needed and the free version is ideal.

Next, I took advantage of the backup ability that adb offers. This can be configured to not only grab the app files, like I had previously rigged up, but also grabs the apps settings. This command line does the trick for me:

  adb backup -shared -nosystem -all -apk -f master.ab

The nosystem flag insures that only the add-on app configurations are stored in my master snapshot. The apk flag insures that the backup contains the app itself, which makes for easy device restoration.

Once I have my master backup, I can use 'abb restore' to create a cloned.

  adb restore master.ab

The process isn't perfect. For example, it take a few screen presses to complete. But it's far simpler than having to hand-configure device after device. Once the restore is done, and the Kids Place launcher is activated, I've got a neat clone of my master device:

This looks to be the Android Enterprise Device Management strategy I was originally after. I can install and configure apps on one device, and painlessly replicate this effort to its siblings.

Bonus Pro Tip: The backup file generated above can be unpacked with this one liner:

  ( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 ../non_system.ab ) | tar -xvf -

This allows you to get a behind the scenes look at the data your phone is storing; something that is surprisingly difficult to do. (It's your phone after all, yet Android permissions work tirelessly to avoid giving you access)