Thursday, August 31, 2017

Summer 2017 Road Trip

After Kinsey graduated from school in Johnson City, we spent the next couple months slowly making our way back to Wyoming.  We'd drive for 4-6 hours, stay for 7-10 days and repeat.  Except for a visit to Memphis (for Kinsey to take her TN licensing exam) and the ocean we had no planned itinerary.  We picked locations as we went.  We stayed in VRBO and Airbnb houses at most stops.  Our route ended up looking like this:

Our first stop was to spend some more time in Appalachia.  This was the view from our porch every morning:

Next to our house was a patch of wild blackberries.  The kids loved to pick and eat berries whenever they wanted a snack:

We all really enjoyed Appalachia.  There were lots of trails for hiking, beautiful scenery to explore and quiet places to enjoy.  Unlike the Rockies, the forests are dense and trails were typically a narrow path surrounded by thick foliage.  In this picture, there are three children ahead of Jericho and Brigham, but you can't see them for the trees:

Only about 70,000 people live in Johnson City, TN but that was a big city by our standards.  We'd had enough of the urban hustle by the time we left, so we spent our first month in small towns throughout the northern parts of Dixie.  In Middle Tennessee, we stayed on 50 acres near a small stream.  In the Arkansas Delta, we were in an old farmhouse surrounded by fields of cotton and rice.  The owner's 10 children lived nearby so our younger kids passed the time playing with them in irrigation ponds and climbing trees.  Kinsey and I ran the nearby farm roads each morning:

One of the kids' favorite stops was in Hot Springs, Arkansas.  We had a small house on the edge of a lake.  They spent every day jumping off the dock and getting sunburn.

While fighting with pool noodles near the water's edge, Kinsey knocked Jericho's glasses right off his face and fifteen feet into the lake (as best we could tell) so Jericho spent the next month squinting at all the scenery.  For our upcoming trip to Europe, we've packed a couple extra pair of glasses for each kid.

Hot Springs also had a small putt-putt golf course in town.  One rainy morning we decided to play nine holes and had the entire course to ourselves.  Brigham (3 years old) scored four holes-in-one on the course, three of them consecutively on a single hole. After the second hole-in-one, I bet the kids $10 that he wouldn't score another.  Nobody took the bet.

The rest of our trip had a more urban flavor.  The kids had never tried a performance Japanese restaurant, so we made an obligatory stop at Benihana:

Same story for the beach.  Padre Island was nice because we could park right on the sand.  The mornings were quiet with only a few people around.  We left the beach each day around 11 am to eat lunch, avoid the crowds and retire to the pool (which was less popular than the beach).

After Padre Island, most of our trip was devoted to visiting family.  On the way, we tried to visit the Riverwalk in Pueblo, CO and met with an unexpected and heavy rainstorm during the walk.  We took shelter under a bridge where Aravis and Brigham passed the time with a little dancing:

We had a lot of fun, made great memories and loved having months together as a family without distractions or external responsibilities.  The naps were nice too:

Of all the places we visited, Wyoming was our favorite.  On my first walk after being home, I was reminded how much I love it here.

Monday, July 17, 2017

Parenting? Roll a Dice

The Problem

I have five children between the ages of 13 and 3.  Everywhere we go, there's a scarce resource that all the kids want.  Maybe it's an elevator button that everyone wants to push.  Maybe it's a favorite spot in the car where everyone wants to sit.  On the flip side, there are chores that nobody wants to do: take out the trash, load the dishwasher, etc.  I used to make assignments round-robin, trying to give each kid a turn at fun and chores.  I've tried other scheduling algorithms too, but I inevitably forget whose turn it is and then everyone tries to straighten me out: "But it was Gideon's turn last time. No, that was Haven not me. ..."

I've tried for years to convince them that these things don't matter and that life is not fair.  I'm apparently poor at communicating that message.  So I decided to take my own sermon to heart:

My Solution

If it really doesn't matter, why not pick kids at random?  I installed Random Name Picker on my phone.  I created a list named Children and added each child's name to that list.  In the list settings, I chose "With replacement" and set "# of names chosen" to 5.  When I click Choose, the app shuffles all the children into a random order.  Now that little Choose button resolves all trivial, family disputes.  We've been doing this for months and it works great.

Only space for one kid to help Dad at the store? Click Choose and the top name wins.  Choosing 2 ice cream flavors at the store? Click Choose and the top two names win.  On vacation? Click Choose in the morning and read everyone the full list to assign priority for pushing elevator buttons that day.  Assigning all children a random priority has proven especially helpful.  Each kid remembers their place in line.  No matter which subset of children happens to travel in the elevator at any given time, they instantly know whose turn it is to push the buttons.

One extra rule proved useful: Dad always clicks Choose.  Otherwise, things get meta really fast: "I get to click Choose to see who gets to click Choose to see who gets to pick the ice cream"

Sunday, July 02, 2017

Goodbye Duolingo

Today I'm giving up a 665 day streak in Duolingo.  I've removed the app from my phone.  Duolingo is still a helpful tool for many and they have potential to become great again.  Unfortunately, the trend in their recent changes has encouraged me to leave.  I'm mostly writing this to warn myself about practices that can drive customers away.

I didn't mind when Duolingo started showing ads.  I knew they had to do it eventually.  They even did a good job of showing ads in predictable locations and using ads of relatively high quality.  I anticipated a subscription model allowing me to pay $1 per month to remove the ads and expected no other functionality for my subscription.  Unfortunately, the subscription costs 10x more than I was willing to pay.  For reference, Duolingo charges $9 per month.  Netflix charges $7 per month and provides much greater value.

No big deal.  I'll skip the subscription and just look at the ad after each lesson.  I'm sure that 90% of users do the same thing.  Duolingo doesn't seem content with that, so they randomly move the location of the "close this ad" button on each page.  Sometimes it's in the top left corner.  Sometimes it's in the lower right corner.  This inconsistency is disrespectful.  It's playing games with my time in an apparent attempt to manipulate me into clicking their ads or subscription button.  If most users are going to skip the ads, the "close this ad" button should be predictable and convenient (on the bottom where a thumb can quickly reach it).

It was annoying, but I was willing to live with it.  Duolingo has to make money.  They're being a little pushy about it, but I can overlook that.  Then they changed the "strengthen my skills" button so that it only performs a timed practice.  I thought, "maybe they've seen that this produces better results, so I'll try it".  After using it for 2-3 weeks, I found myself skipping any question which took longer than 1-2 seconds to answer (listening comprehension, free text response).  The new rules of the game were encouraging me to learn a language less effectively.  For people whose focus is conversational speech, it might make sense to practice under time pressure.  My goal has always been reading comprehension.  In that context, time is not an issue.  I can spend as much time as I want on a German Wikipedia page and nobody will care.

Android has always been a second-class citizen for Duolingo.  Useful features come to iPhone first and often don't make it to Android for months or years.  It's no big deal since the core functionality is available on Android.  Duolingo makes it very clear that they're trying to hire an Android developer.  They've been trying for as long as I can remember.  A couple days ago, I installed an update to the Android app.  Even though I only use the app for 10 minutes each morning, it now consumes 9% of my battery each day.

In a market for user attention that's so competitive, you really have to play at the top of your game.  Anything pushy or disrespectful can have large costs.  Repeated minor issues like this can push a user away.  I hope I can remember that as I work on software.

Duolingo.  Thanks for 665 days of fun.  Sorry that things didn't work out between us.

Monday, June 19, 2017

Toggle syntax highlighting to catch bugs

I usually write code with syntax highlighting enabled.  While preparing my final commit message, I view the proposed diff in its own color scheme (red for removed lines, green for added lines, white for context lines).  Even though I've spent hours working on a patch, I often spot mistakes in my newly added lines as soon as the color scheme changes.  Apparently, psychologists already knew about this phenomenon: “Once you’ve learned something in a particular way, it’s hard to see the details without changing the visual form.”  The article suggests other visual changes like using a different font or printing to paper.

I use two other, related hacks for helping myself find mistakes in my code:

  • go to sleep and review my code in the morning
  • watch a video, play a game, read a book, work on a completely unrelated problem to force my mind to lose as much of its mental model as possible then review my code again
In each case, the new perspective often reveals details that I overlooked before.

Saturday, May 20, 2017

Sensitive survey questions

Do you steal from your employer? Do you lie on your taxes? Have you cheated on your wife?  If you want to gather statistical information about these questions, you can't ask directly.  Most respondents will lie.  I'm aware of three methods for addressing the problem, two of them are quite clever.

Bogus Pipeline

The first one is not particularly clever.  Hook the subject to a machine.  Tell them it's a lie detector even though it's not. Ask them to respond honestly and pose a few baseline questions to which you know the answer (What's your name? What day is it? etc). After each answer, have the machine indicate that it detected truth.  Now ask the subject to respond deceptively and ask more baseline questions. After each response, have the machine indicate that it detected a lie.  Now hide the machine's truth/lie indicator and ask your questions.  Most subjects will tell the truth.

This is called a bogus pipeline. It's complicated to implement, requires physical access to the subject and not as accurate as other techniques.

Randomized Response

Ask the subject to flip a coin but don't tell you what it is.  If it's heads, they should answer truthfully. If it's tails, they should answer yes (or whatever the socially unfavorable answer is).  Now ask your question.  Applying some simple math to the aggregate responses, you can accurately calculate the percentages you want to know.

This one's pretty helpful, but it requires the subject to have a coin (who uses coins anymore?).  The subject must also be smart enough to recognize that the coin gives him deniability. It seems obvious, but it's not obvious to everyone.

Unmatched Count

Construct an innocuous survey along these lines: "How many of the following statements are true about you? I own a dog. I drink coffee. I've been married. I have brown hair."  Construct a second survey, identical to the first but add your sensitive statement, "I cheat on my taxes".  For each subject, randomly give them one survey or the other.  Calculate the average answer for each type of survey.  The difference between the two averages tells you the percentages you want to know.

This one's my favorite. Since the subject only tells you their final count, it's obvious to them that they've divulged no sensitive information.  The math for analyzing the results is similarly easy.

Do you know of any other techniques?

Tuesday, May 02, 2017

Switching to OpenBSD

Short story:

After 12 years, I switched from macOS to OpenBSD.  It's clean, focused, stable, consistent and lets me get my work done without any hassle.

Long story:

When I first became interested in computers, I thought operating systems were fascinating. For years I would reinstall an operating system every other weekend just to try a different configuration: MS-DOS 3.3, Windows 3.0, Linux 1.0 (countless hours recompiling kernels).  In high school, I settled down and ran OS/2 for 5 years until I graduated college. I switched to Linux after college and used it exclusively for 5 years. I got tired of configuring Linux, so I switched to OS X for the next 12 years, where things just worked.

I was pretty happy with OS X.  It gave me Unix and mostly got out of the way so that I could write software.  I wrote about enjoying Apple's simplicity.  Snow Leopard even spent an entire release cycle just fixing bugs and improving performance.

But Snow Leopard was 7 years ago. These days, OS X is like running a denial of service attack against myself.  macOS has a dozen apps I don't use but can't remove. Updating them requires a restart.  Frequent updates to the browser require a restart.  A minor XCode update requires me to download a 4.3 GB file.  My monitors frequently turn off and require a restart to fix.  A system's availability is a function of mean time between failure and mean time to repair.  For macOS, both numbers are heading in the wrong direction for me. I don't hold any hard feelings about it, but it's time for me to get off this OS and back to productive work.

So where do I go now?  We own 5 Chromebooks and they have great availability.  Updates are infrequent, small, fast and nearly transparent.  Unfortunately, I need an OS where I can write and compile code.  I also want it to run on older, commodity hardware so I can replace a broken laptop for $400 instead of $2,000.

I considered several Linux distributions.  Lubuntu seemed promising, but it was too bloated for my taste.  A couple years ago, I tried Ubuntu on a Dell XPS Developer Edition for a few months.  Even with hardware designed for Linux, it was too fragile. Desktop Linux has also become even more complex than when I used it a decade ago.  I just want to get my work done, not feed and maintain an OS.

I was reminded of OpenBSD during the Heartbleed scare.  While everyone else was complaining about OpenSSL and claiming that open source had failed, the OpenBSD developers quietly drew their machetes and hacked out hundreds of thousands of lines of bad code, forking off LibreSSL where they can keep it clean and stable.  The OpenBSD community is like that: focus on what's really important, hold your code to a high standard, ignore all the distractions.  They're not trying to live in the past, just trying to make the future a place worth living.

Anyway, I found OpenBSD very refreshing, so I created a bootable thumb drive and within an hour had it up and running on a two-year old laptop.  I've been using it for my daily work for the past two weeks and it's been great.  Simple, boring and productive.  Just the way I like it.  The documentation is fantastic.  I've been using Unix for years and have learned quite a bit just by reading their man pages.  OS releases come like clockwork every 6 months and are supported for 12.  Security and other updates seem relatively rare between releases (roughly one small patch per week during 6.0).  With syspatch in 6.1, installing them should be really easy too.

I also enjoy that most things are turned off in OpenBSD by default.  The base installation is sparse.  It assumes that I'll enable a service or install a tool if I want it.   So I'm not constantly facing updates for software I never use.

My experience with OpenBSD is still young, but I really like what I see so far.

Thursday, April 06, 2017

Using Project Fi

I signed up for Project Fi last month.  It's been a real pleasure to use.  I expected it to be a step down compared to Ting, but I was wrong.  For my use cases, Fi is slightly better in a couple ways.  Fi's customer support isn't as good, but it's acceptable and better than most phone companies.


Project Fi canceled my Google Voice account during sign up, but it transferred all my GV account credit over to the new account.  The credit wasn't visible on the first bill but appeared on the second.  It was nice not to lose those GV funds.  (Fi also transferred my voicemail greetings and blocked numbers from GV).

I really like the way that Fi charges for data.  I chose the 1 GB plan (since there's no penalty for overages).  Last month I consumed 1.165 GB of data.  On Ting I would have paid $10 for crossing into the second GB.  On Fi, I paid only $1.65 extra; exactly covering my overage.

Fi provides free data-only SIM cards whose usage is just added to your account.  Since my family uses VoIP for all phone calls (either SIP or Google Voice) and SMS, everyone just needs data.  I gave everyone a data-only SIM card and it's been working great.  The SIM cards work in every device we've tried, old and new.  This avoids the $20/month charge per phone line.  Fi billing breaks out usage for each device.  The only downside is that you can only order one data SIM at a time.  It took me a few weeks to place orders for all the cards I needed.


Ting is built on T-Mobile's network.  It has great coverage almost everywhere I go.  The one exception is the northwest quarter of my grocery store.  Data signal in that part of the store was always missing.

Since Project Fi automatically switches between T-Mobile, Sprint and US Cellular networks, depending on signal strength, I expected Fi to do better.  It did.  This dead spot is no longer a problem.  In this particular store, Fi often switches to the Sprint network then switches back to T-Mobile when I go elsewhere.  Never underestimate the power of a layer of abstraction.  Data-only SIM cards only use T-Mobile, so their coverage is identical to what I had on Ting.

I use Signal Spy to see which network my phone is currently using.  I find it gratifying to drive through town and watch Fi switch networks.  I look forward to some road trips this summer to see how effective it is in that scenario.

Fi's switching algorithm sometimes sticks with a network whose signal is slightly weaker than the alternatives.  Theoretically this could hurt battery life, but I've never had it impact connectivity.  It does annoy my OCD a little.


Overall, I'm very happy with Project Fi and will probably stick with it after I return from Europe.  I hope Fi's international coverage is as good as the US coverage.