Use ‘%%’ to indicate a percentage change of a percentage?

“40% of people clicked through when the button was blue. When we changed it to green, the click-through rate increased by 20%!”

We all know that the above statement is ambiguous; we can’t be sure whether the writer intends to let us know that the final percentage is 60% (40% + 20%) or 48% (40% × 1.2).

Percentage Points

‘Percentage Points’ is a well-established way to unambiguously communicate the first type of difference. That is, “When we changed it to green, the click-through rate increased by 20 points,” is clear that the final percentage is 60%.

Percentage change in Percentage

However, I can’t find a well-established way to unambiguously communicate the latter type of difference, the percentage change of a percentage.

Can we use ‘%%’ and/or maybe ‘p/p’ (“percent-of-percentage”)?
Continue reading

Posted in Personal Technology | Leave a comment

Reader-augmented Writing

Words gave us the ability to effectively share ideas and knowledge, and writing allowed those words to spread further and be carried across time. The printing press accelerated that spread, and electronic mediums allowed even more people to share ideas more quickly.

Yet articles and books — even e-books — are still largely static and one-way. We read only what the author knows at the time of writing. Technology will change these from one-way, static content into the basis for conversation, bringing out more ideas and critical discussion, magnifying what we get out of them.

I’m looking forward to that day.
Continue reading

Posted in Futurism | Leave a comment

Containerized Passenger Transportation

Getting someone from point-A to point-B will often — even in the distant future — involve a variety of methods of transport. For example, getting someone from their home in San Francisco to an office in Los Angeles might primarily (the majority of the distance) be served by something like high-speed rail or Hyperloop. However, there’s still the need to get the person from their home to the train station in SF, and from the train station in LA to the office. Further, less common routes might involve transfers; for example, from regional rail to inter-regional hyperloop.

Containerization will allow someone to enter into the transportation module — a pod — at the beginning of their journey, and not have to exit it until they’ve reached their final destination. This is especially important when a passenger also has luggage.

I’m certainly not the first one to think of or write about this. I mostly just wanted to write about this for the fun of it; predicting some of the details of how some aspects will work, including ownership of the various parts, and billing (namely from the customer perspective). Maybe it could be a tiny bit useful to take into account when designing something like Hyperloop, or embarking on creating pods.

Why this matters now

  1. We are at the cusp of transportation automation. Self-driving cars are quite literally around the corner.
  2. Just as self-driving cars have becoming reasonable due to current technology (e.g., fast and portable computers, advanced software, efficient and lightweight batteries), the technology to support containerized passenger transport is also reasonable. That is, all of the ingredients are available and close to becoming economically, socially, and politically ready to deploy, including:
    • Robotics to transfer a pod from one vehicle to another
    • Self-driving vehicles that can bring a pod to anywhere a car can.
    • Technology allowing real-time matching of a passenger with all the parties necessary to transport them, and billing.
  3. We are beginning to re-invest significantly in transportation infrastructure. For examples:
    • In California: High-speed rail.
    • Hyperloop

We should start designing and standardizing passenger transportation pods so that we are poised to start taking advantage of them as we get closer to major transportation infrastructure investments that are expected to have 50+-year lifespan.

What we can do now

  • Begin to think about pod standardization
  • … and much more… <TODO>

My vision


Passenger pods — what the passengers actually sit in — are the staple of this vision, as it’s what will most define their experience.

Also, as the one constant throughout the trip, it is also main channel through which billing must occur. That is, as the passenger’s pod embarks with, say, a train, the train will essentially bill the pod for the trip (including for, possibly, providing power to the pod).


While individuals could own pods, they probably won’t.

  1. People will likely want to use a variety of pods. One might be optimized for their daily commute (expected to take 45 minutes), while another might be optimized for long-distance travel (e.g., 6 hours).
  2. Just as we’re seeing with “ride-sharing” services (like Lyft), and as many are predicting with self-driving cars, not-owning your transportation vehicle/vessel is more economical. Owning your own vessel means your paying for it even when you’re not using it (often >95% of the time). Likewise, you don’t have to find — and pay for — a place for it while it sits idle while you’re at work.

Continue reading

Posted in Futurism | 2 Comments

Schrödinger’s Laugh

Schrödinger’s Laugh [shroh-ding-ers laf]


  1. The strong expression by one that paradoxically may be either laughing or wailing, this being tied to an earlier random event. It creates an awkward period during which the observer does not know which and thus how to properly react.
Posted in portmanteau | Leave a comment

HTTP Status Codes 401 Unauthorized and 403 Forbidden for Authentication and Authorization (and OAuth)

When a client requests a resource from an HTTP server and it’s not allowed to access that resource, the client needs to know enough about why in order to present the right message or options to the user. Basically, we need to know whether the user can do something about it or not.

HTTP status codes help us differentiate these scenarios and when the reason has to with authentication (verifying who the client is) or authorization (what that client is allowed to access), the server should use the 401 and 403, respectively.

There are a couple things that complicate the use of 401 and 403:

  1. The terminology used around the 401 status code in the HTTP spec (RFC 2616), namely “unauthorized” is often misused in place of “unauthenticated,” and
  2. HTTP doesn’t provide a status code for authenticated users who aren’t allowed to use a resource, so we use 403.

The Scenarios

Let’s start by understanding the scenarios that we need to be able to differentiate. There are six outcomes of a request when viewed from an authentication or authorization perspective:

# Authentication Authorized Resource delivered HTTP Status Code Resolution
provided good
1 no n/a yes yes 2xx n/a
2 no n/a no no 401 Provide Authentication
3 no n/a no no 403 none
4 yes no n/a no 401 Provide Valid Authentication
5 yes yes no no 403 none
6 yes yes yes yes 2xx n/a
  1. The unauthenticated client is authorized to access the resource (HTTP 200-class).
  2. The unauthenticated client is perhaps authorized to access the resource if authenticated (HTTP 401).
  3. The unauthenticated client is not allowed access the resource; authentication will not help (HTTP 403).
  4. The client’s authentication credentials are incorrect, invalid, expired, or revoked (HTTP 401).
  5. The client is authenticated but cannot access the resource (use HTTP 403 Forbidden).
  6. The client is authenticated and may access the resource (HTTP 200-class).

Continue reading

Posted in Networking, Software Development, Web Technology | Leave a comment

Protected: Now Entering Germany

This content is password protected. To view it please enter your password below:

Posted in Personal Technology | Enter your password to view comments.

My Experience with Carbonite Home and CrashPlan+

I don’t like losing data, and I’m guessing that you don’t, either. I already do local backups, but not only can it a little cumbersome and easy to forget (not to mention drive failures), fire or theft could result in the loss of the both the data and the backup.

So, I also want a backup that’s off-site, easy, and reliable. I’ve taken it upon myself to set up online backup for my wife, parents, and brother, so I’ve had the opportunity to try more than one provider, and wanted to share my experience.

My Criteria for our Online Backup Service

I’ll start by sharing what’s important to me in backup provider so that you know what biases I have and how my opinions may apply to you. Also, my research and review are primarily from Q4, 2011. Features and pricing may have changed.

Unlimited for a low, flat price

I have roughly 300 GB of personal data. The bulk of that are digital photos and videos, and that’s with almost no RAW photos and only rarely is there HD video. Any non-unlimited plan would have been significantly more expensive.

My wife, dad, and brother each have between 50-100 GB, and that grows with every photo-opp. Not only would it have been unpleasant to have to think that each new document, photo, and video could result in an increased recurring payment, I simply did not find anything compelling in the services offered by non-unlimited providers.
Continue reading

Posted in Personal Technology | 11 Comments

OpenVPN over DSL with PPPoE

I work remotely and use OpenVPN to access development services such as SVN and our file server, both of which are at our colocation facility.

While at a new location, I first encountered a problem trying to do any SVN operations. Turned out that any significant traffic to any server at the colo would cause my SSH session to freeze. For example, I would SSH into a machine and issue the ‘ps‘ command and the short list of processes would be returned just fine. When issuing ‘ps aux‘, however, only the first couple of the processes would be displayed, but then the SSH session would become permanently unresponsive. Other significant activity, including ‘vi‘, would also cause the session to become unresponsive, and ‘svn up‘ over svn+ssh would also fail.


My DSL connection at the new location was PPPoE, which adds a little bit of overhead to each packet. Our OpenVPN server is configured with UDP and a 1,542 byte MTU, which is apparently too large to fit into a UDP-in-PPPoE packet (and UDP can’t adapt like TCP can).

So, when it came time for the colo server to send a large packet to the client (or v.v.), the packets would be discarded and the session would become unusable.


You can force OpenVPN on the client side to use a smaller MTU so that all packets will fit within the PPPoE packets by adding the following line to your ‘my_connection.ovpn‘ file and then reconnecting:

link-mtu 1395

While unlikely, you may need to use a smaller value (or you could also experiment with larger values up to the 1,542 default).

Posted in Networking | 2 Comments

Logging Levels


Use this logging level to help you develop or find bugs in something you’re currently working on, and when the information being logged is not useful once the current task is done. So, trace logging should usually be removed when the task is done, which often means that it should not be committed. Pair this with ‘TODO-XXXX‘ to help prevent accidental commits.


Debug logging provides information that might be useful to developers while they’re working on other tasks (related or unrelated). Examples might include “The client’s session has been cleared because they logged out,” or “A feature has been hidden because a camera was not detected on this device.”
Continue reading

Posted in Software Development | Leave a comment

A system for getting the most out of “TODO” comments in code

Annotating code with “TODO” can help remind us what code needs attention. It’s easy, however, for them to build up, get out of hand, and no longer be useful.

Below is a system I came up with to keep TODOs useful. Some of what I like about it are that:

  • It is based on the basic use of the “todo” string in comments. By retaining the use of the “todo” string, all uses are automatically highlighted for those who environments are set up to by default (including many or most IDEs)
  • When searching or filtering, the search or filter will also automatically include higher urgency items.

Continue reading

Posted in Software Development | 1 Comment