why I didn’t upgrade

I’m a software developer. I just upgraded my “dev” environment from Ubuntu 14 to Ubuntu 16, both LTS.

Ubuntu 14 was supported till April of 2019. I delayed upgrading until the last possible minute.

I have a lot of services installed and configured for several different side projects that I work on. After I upgraded, almost all of them were broken. I just spent about an hour fixing a few, and I anticipate that it will take a few more hours, maybe even a day, to get everything working again.

I’m lucky that I have the time to do this (although, I really don’t!). Many people who work on side projects only have an hour or two to work on them every week. Which would you rather do: spend an hour this week making progress on adding features and functionality to your side project? Or spend that time fixing newly broken services?

Being a developer, I am loathe to sit in my chair twiddling with config files. Usually, I’m very happy using Linux. But there are times when I long for a system that doesn’t break after every upgrade. This is one of them. And this experience is the reason that I always postpone upgrading for as long as possible – I just know that it’s likely everything will suddenly stop working when I do!

the lifestyle business: part 1

I am a fan of the concept of the “lifestyle business”. Years ago, I borrowed “The 4-Hour Work Week” from the library. It put into words what I’d been feeling for a while: life’s too short, and it would be bad to spend too much of it doing work that has no meaning, and is sometimes even unpleasant. Since then, I’ve tinkered with building a few of my own lifestyle businesses. But the bulk of my money was made in full-time employment, working for companies. I’ve come to wonder if the “lifestyle business” is a dream that only works for a lucky few.

Recently, I came across a blog post by Nat Eliason on his own (apparently successful) attempt at building a lifestyle business. He says he was inspired by the “The 4-Hour Work Week”. Hey, so was I! So I decided to study his post carefully. Here are my thoughts as I read it – not exactly a review, just my response.

He writes the post as a list of steps to build a lifestyle business. Great, he hooked me! I love recipes. I can follow a recipe. 🙂

“Step 0: Having useful skills”

Let me run a quick inventory: I know several different programming languages. I’m a full-stack web developer, although I don’t have all the latest and greatest mad skillz. I am fluent in English. I am good at sticking to goals, and persistent to the point of stupidity. Sometimes, though, persistence is not an asset. It can be very tough to know when to stick with something, and when to quit!

“If you don’t have some relevant, valuable skills, or the ability to teach yourself new things, you’re not going to have a good time. You’ll be more likely to waste years on something going nowhere…”

I can totally teach myself new things! Examples: I taught myself to program, and to use relational and noSQL databases. On the other hand, I’ve tried to learn a language (French) and haven’t had huge success with it. So yeah I can teach myself things, but there are limits.

The key skills he mentions are: “website creation [check], marketing [not sure], copywriting [not sure], and self-direction [check]”. Here’s the thing: successful marketing and copywriting are both somewhat ambiguous. I think I could do these things – I mean, here I am blogging! – but how would I know for sure? I can write a bunch of stuff, but is that really marketing and copywriting? Hm?

Then Nat says: “Now, don’t worry. If you read this section and got freaked out about ‘not being ready,’ you should still go for it”. OK. Let’s keep reading.

“Step 1: Finding the idea”

Read the article for details, but his advice is “solve your own problem” and “share your skills”. Oooookay…. I’ve heard this before. There seem to be two opinions on this. One is to scratch your own itch when coming up with the idea. The other is, do market research, find a pain point that people will pay you to solve, and proceed from there. So I’m a little skeptical that his Step 1 will pay off, in general. I mean, I’ve done a number of projects that never paid off, and I doubt I’m the only one with that problem.

For his business, he teamed up with a friend, and they chose “programming for marketers”. This was a little funny, because it’s difficult to imagine marketing pros being interested in programming (although he says it was a problem that he had when doing his own marketing, so I’ll just believe him). I think of marketers as people who pay programmers to do technical grunt work. So I’m super surprised at the idea that marketers want anything to do with programming. If they do, it makes me wonder just what other ideas I’m holding onto that are wrong.

“Step 2: Determining How to Validate the Idea”

Good, he didn’t just build it and expect people to pay. Validating the idea is standard operating procedure. He and his friend decided to validate by making an email course…

“Step 3: Making the Email Course”

But they didn’t really make it. They hung up a web shingle (aka landing page) and advertised the existence of the course.

This content is starting to sound more and more like the standard script that I’ve read in a number of places, one of them probably being “The 4-Hour Work Week”. Which I strongly recommend you check out from your local library, if you are interested in lifestyle businesses. I don’t begrudge Timothy Ferriss his income from the book, but if you’re looking at “lifestyle”, you can probably use the money that you save on other things that can’t be gotten free of charge.

There’s a bunch of stuff mentioned in Step 3 which sounds like advertising for other services. I don’t know if this is affiliate marketing, but it looks suspicious. Clearly you don’t need those to set up your landing page. It may be worth investigating, but personally I wouldn’t throw money at a landing page before I’ve validated my idea.

“Step 4: Promoting the Email Course”

They posted their course to Product Hunt, GrowthHackers, Hacker News, Reddit Marketing, and Inbound. And “we asked some of our friends to help us by upvoting our submission. Yeah, you’re not supposed to do that, but everyone else is…”. Oops. This is a problem. I’ve got no friends who will give my posts an upvote. And it’s kiiind of unethical?

They got 2800 sign-ups almost immediately! At this point in the article, I’m still mystified as to why marketers are interested in the technical details of programming. Who are these people?

The team had set an arbitrary goal of 1K sign-ups. I think the arbitrariness of this goal is lame. Why not 500 or 5000? I didn’t think the advice in this step was practical or truly actionable. It made me think that this “recipe” had more fairy dust in it than I’d like to see.

“Step 5: Writing the Email Course”

So yeah, the idea was validated by virtue of the fact that they got far more than their arbitrarily picked target number of sign-ups.

Then voilà they wrote the email course real fast and people loved it. They gave people bonus content for sharing on twitter or whatever (which seems sleazy, but whatever works, I guess).

“Step 6: Proving People Would Pay”

I just want to point out here that some people roll the “Proving People Would Pay” part into the “Validating the Idea” part by making a landing page that sells a product for a price. You won’t get as many sign-ups this way, but I would think your email list would consist of more committed subscribers.

Anyways, they threw together a paid product (a video course) and a paid service (a “mastermind group” which kind of screams scam), and made an offer to their email list: “The paid course pre-order was for $500, the mastermind group was for $50 a month. And… no one bought either”. Ha, that was not a surprise!

Then they sent a new email out to their list, offering the pre-order for half the original cost. And apparently they got 40 people to pay for that. Mysterious! The course content sounds like the kind of stuff you could do for yourself with a little searching around on the internet, although I admit that I haven’t looked at it yet. I’m very very curious to know why people are willing to pay $250 for something like this. I wonder if it’s because the people paying this money think of $250 as a trivial amount of money. Food for thought. On the other side of things, we’re talking about $250 for a video course. A video course seems like a lot of work, and I wonder just how much time and money it would cost to make one.

He admits that the the $500 offering price for the video course was arbitrary, and that he’d do it differently now. And in “Step 7” he says “Making the video lessons, between planning, recording, and editing, took 3-10x longer than we’d anticipated.” It took them a week to create two modules. He doesn’t say how many hours of video are in each module, but I’m guessing it’s less than 1 hour each. That is fine, because no one really wants to look at a video for an hour. But still. A week for about 2 hours of video, eh? From what he says, they wanted to produced 8 modules, so that means you’re looking at a total of 4 weeks of work… for $10K. However, you’re not making $10K*12/year. You’re making $10K once (with some long tail fall-off of subscribers), and you still have to pay for hosting on Teachable ($40/mo, at the moment, which is really much better than I expected!). And I don’t know what other services, Mailchimp and maybe some other stuff. I’m just ballparking the numbers as I go along… he does not give all the details, so I’m making some guesses.

“Step 8: Launching the Course”

Here, he talks about how they built the new landing page for their product. There’s a screenshot of the headline, which says “Become a Technical Marketer”. Huh. What the heck is a technical marketer, anyway?

They launched, and over the course of the next few days they made $48K or so in orders. I gotta say, this must have felt fantastic!

He claims they are still getting about $3K per month. However, there is no date on his blog post (part of the “evergreen content” craze, I guess). So I wonder just how long the $3K per month continued. And I repeat: who are these old school marketers who don’t understand how to do web-y things, and think that throwing $250 at a video course is worth the cost to help them learn it?

There are a couple of other steps in his process, but I feel like I can stop here. Go read the article, as it’s definitely worth a look.

There are two takeaways that I have from reading this article.

First, when choosing a lifestyle business, you need a target market that can shell out a few hundred dollars for your product without too many qualms. That could mean selling content that helps them generate more money, which I suspect is the case here. This is something that Nat never addresses. I mean, suppose he’d decided to teach moms to make sock puppets for their kids. I do not see that idea generating any kind of income, even if it did produce a nice email list filled with craft-y moms!

Second, it won’t be easy doing this kind of thing unless you really like your audience. Patio11 eventually got tired of promoting his product to teachers. Now I feel like I’m stuck back at Step 1, and I’ll have to keep searching for “The Idea”.

the crappy client

client relationships can sour

As a freelancer, once in a while, you wind up with a crappy client. And there’s just no indication when beginning to work with them. As with other types of relationships, there’s often a brief honeymoon period. The client starts out on their best behavior: they spend time crafting carefully worded documents, define the specs for new features in detail, stay within project scope, and pay on time.

After a successful project or two, the relationship begins to fray. You start to see little signs that the client finds their initial good behavior too demanding. Grammar mistakes and misspellings appear in those previously perfect documents, and soon the docs require multiple, thorough readings to decipher. Maybe you give a little feedback, asking for more care in describing the assignment. In response, they tell you that “the task is quite simple” or something similar, as if you are the stupid one for failing to understand the garble.

You get on the defensive. You’re an excellent developer, and perfectionism kicks in! You spend some extra time reading through the document (on your own dime, if this is a fixed price project!). You do your best to reiterate to the client what’s been requested. The client tells you that your interpretation of their garble is correct (with an “of course!” as if you are stupid to even request additional feedback). So you start working. Then you run into a hitch, and ask for instructions. Turns out that they “didn’t mean that, they meant something else…”. No apologies, just do it some other way. You get a little miffed, but they’ve been paying on time, so you back off and rework things.

Finally, you finish the work and bill them, but they won’t pay yet because they are “testing”… they find some “bugs” that they want fixed. The bugs are just things that do not work because they weren’t covered in the original garbled “spec”. You spend time trying to reproduce a bug and can’t get it to happen… that’s more of your time wasted, if your project is fixed price. You ask for more information about the “bug”, get more incomplete and unclear feedback, and waste more time trying to reproduce it. Finally, after many hours of wasted debugging work, you discover that there was an important step left out of the bug report in order to reproduce the bug. Nice!! With that step, you can finish debugging, and you fix the issue. Everything is done, but it took a lot longer than expected.

And then comes the kicker: they felt like you took too long to work on this “simple task”. It’s all your fault, you see. They pay you less than what was agreed upon, telling you that the work took “too long”.

When this happens, you need to kick the client to the curb. Just don’t tolerate this behavior. Sure, you got paid “something”, but there were so many problems with this situation that you should never, ever do business with this client again. If you are so desperate that you have to work for them again, then you need to work hard to put yourself in a position where you can be more picky about your clients. It’s just not worth the aggravation!

forget version control?

I’ve been noticing this ad for Google’s G Suite for a while now. It says “Get G Suite. Forget Version Control.” I’m just posting it here for posterity. Aren’t there already too many people who use email and word docs for tracking changes? Oy. Words fail me 🙂

(For anyone who is concerned, that’s a screenshot of the ad below, not the actual ad!)

negotiate royalties, otherwise invest

I ran across an article about an artist who painted the cover of Jethro Tull‘s Aqualung. He was paid a fixed fee, $1500, for three pieces of art in 1971.

It’s a little bit sad that this fellow did not make more money off the job. That $1500 is only worth about $9000 in today’s dollars, according to this Bureau of Labor Statistics’ CPI Inflation Calculator. I suspect that many artists would be thrilled to make $9K off a few paintings, these days. However, I can imagine that it’s still a bummer when your artwork is generating millions for the people who bought it, and you don’t get any royalties from that.

This artist doesn’t get a do-over. However, we can learn from this lesson! Nowadays, it is extremely easy to invest in index funds online. Even just $1000 invested in the S&P 500 in January of 1972 would be worth approximately $100K today. If you are an artist, and you do not have the power to negotiate a royalty agreement, you can still take your payment and invest it in a low-fee index fund like Vanguard’s VFINX. Depending on your tax situation, you might also want to put it into a retirement vehicle such as an IRA or 401K, which offers tax protection. There’s always risk involved in investing, but there’s a lot of risk involved in sticking your money in a saving account, too. Inflation will eat away that money in no time.

Javascript Object keys cannot be Objects

TL;DR – Javascript Object keys may be strings or symbols, and nothing else. So be careful when setting key/value pairs on an Object.

In Javascript, if you use an Object as another Object‘s key, you will have problems. You will not see an error, but you will be producing a bug. I ran this code sample in the node REPL to demonstrate what goes wrong.

First, I create two completely different Objects, obj1 and obj2:

> var obj1 = { a : "a" };

> var obj2 = { b : "b" };

> obj1
{ a: 'a' }
> obj2
{ b: 'b' }

Next, I create an empty Object:

> var obj3 = {};

Finally, I set two different properties on obj3. One is set on the key obj1, and the other is set on the key obj2. Since these two Objects are different, you might be fooled into thinking that obj3 will now have two keys. But watch!

> obj3[obj1] = "test1";
> obj3
{ '[object Object]': 'test1' }
> obj3[obj2] = "test2";
> obj3
{ '[object Object]': 'test2' }

As you can see, both the obj1 and obj2 keys have been coerced into their string values (obj1.toString() is '[object Object]', as is obj2.toString()) when the property was added. So obj3 has only one key/value pair. The first one that was added was obliterated when the second one was set.

For anyone who is more used to working with a strongly typed language, such as Java, this can be a “gotcha!” in Javascript. I certainly made this mistake, myself, when I first started coding in Javascript, years ago. If you want your keys to be less restrictive, consider using Javascript’s Map.

how to get out of a git detached head state

I got into a “detached HEAD state” in git the other day. Here’s what happened, and how I solved it.

I had fixed a bug by making a code change to a single file. I committed the change to git. Then, I decided I didn’t like my fix. I wanted to start over from the previous commit, and redo it.

There are nicer ways to do this, and I guess you could say I did the wrong thing. What I did was to checkout the previous commit, and make my changes there. Then when I committed my changes, I saw the worrisome “You are in ‘detached HEAD’ state” message from git.

I searched around the internets and found a solution at stackoverflow as usual: create a branch, checkout master, and merge your branch into master.

Here’s a very simple example of how it went (I’m in Linux, YMMV). I start with a completely new git repository for demo purposes:

mkdir /tmp/git
cd /tmp/git
echo "Initial commit" > README
git init

Initialised empty Git repository in /tmp/git/.git/

git add README
git commit -a -m "Initial commit."

[master (root-commit) 9dee938] Initial commit.
1 file changed, 1 insertion(+)
create mode 100644 README

echo "A wrong thing" >> README
git commit -a -m "This is wrong."

[master 4ec7b1a] This is wrong.
1 file changed, 1 insertion(+)

[Oops! I want to ignore this wrong change that
I just made. So I check out the previous commit.]

git checkout 9dee938

Note: checking out '9dee938bcd5b575775f5461a383e2b6f010e0866'.

You are in 'detached HEAD' state.
You can look around, make experimental
changes and commit them, and you can
discard any commits you make in this
state without impacting any branches
by performing another checkout.

If you want to create a new branch to
retain commits you create, you may
do so (now or later) by using -b with
the checkout command again. Example:

git checkout -b new_branch_name

HEAD is now at 9dee938... Initial commit.

[Now I'm thinking "oh git!"]

echo "The right thing" >> README
git commit -a -m "What I really wanted!"

[detached HEAD 1ababcd] What I really wanted!
1 file changed, 1 insertion(+)

[Search around for solution... Got it!]

git branch temp
git checkout temp
git status

On branch temp
nothing to commit, working directory clean

git checkout master
Switched to branch 'master'
git merge temp

Auto-merging README
CONFLICT (content): Merge conflict in README

[Edit README to merge the conflicts]

git commit -a -m "fixed!"
git status

On branch master
nothing to commit, working directory clean

At this point, the problem is fixed and my new commit is checked in.

You probably want to delete your temp branch, that is what I did: git branch -d temp

how do you increase your runway? really – i’m asking!

In my last post, I mentioned that I’m running a business that’s not “ramen profitable”. That might not be true; it depends on how you define “ramen profitable”. If it means “you can afford to buy enough ramen to live on”, then, in fact, I am ramen profitable! That’s actually pretty cool. But if it means “you can afford to pay for your basic necessities”, then no, I’m not ramen profitable. And that kind of makes me sad. I can afford to pay my groceries on the income from my project. I can’t afford to pay for my health insurance, or my rent, or the gas that I put into my car. Any extra expenses come out of my savings.

more runway is better

In the startup world, your “runway” is the amount of time you have to run your company before it runs out of money. I worked as a software developer for many years before I decided to start my own business. During that time, I saved up a few years of living expenses. So my runway is pretty long. But it’s not indefinite. That means it’s imperative that I find a way to make more money from my current project, or that I figure out some new way to make money. If neither of those options works out, then it’s back to full-time employment for me. That would be more than just a little bit disagreeable, so you could say I’m highly motivated.

In case you are wondering, I’m already aware that you can improve your runway by trimming expenses. I’m pretty good at that, and I’ve done basically all I can do (or am willing to do) in that area.

I wouldn’t exactly call myself a “startup founder”, since I’m not trying to start a company that employs anyone other than me. I’m probably more aligned with people who run “lifestyle” businesses. The truth is, I wouldn’t work at all if I didn’t have to. It always surprises me when people claim that they would work even if they didn’t need to. There are so many other things to do in life, and so much of “work” is completely unproductive nonsense.

These are my ideal situations, in order of preference:

  • Do what I want and not work at all
  • Work on something that’s at least marginally fun, but not full-time, so I have plenty of time for other things
  • Work on something full time, but with flex hours; so, for example, I can go have fun during the week when other people are at work

I’m not even going to put FT work in that list. If I have to go back to the dreaded FT, it will be far from ideal. If it comes down to that, then I guess it will be a win if I can find FT work with flex hours. Not easy, even as a software dev.

So, my current and most urgent problem is that I need to increase my runway. People will tell you to “just take some contract work” in situations like this. This advice leaves me scratching my head. Based on past experience, I am pretty sure that I’m a good software developer and that I am quite capable of doing contract work. However, my experience has been that contract work is hard to come by, unless perhaps you are willing to take temporary full-time gigs. This is something I’d rather not do, because it would mean stopping all progress on my project. And even then, most of the available contract gigs are temp-to-perm. If you take one, you may have to lie, and say that you are potentially interested in going full-time at the end of the contract.

I have this vague feeling that there are tons of software devs out there, chugging along, doing contract work part-time to fund their labor-of-love projects. Is it true? If so, how do you get there??

health insurance

If your employer pays for part of your health insurance premiums, you may be one of the lucky ones who can ignore the turbulence in the health insurance market.

That’s not me, though. I live in the United States, and like it or not, I’m forced to participate in the whacky health insurance system that we have here. I’m self-employed. Last year, I was paying about $5000/year for health insurance premiums. I was on a high-deductible plan that I had bought directly from the insurance company. I’d started on it before the ACA came into effect, and never tried to move off it.

what does a crutch really cost?
how much?

And then, last year, I moved to a new state. I’d estimated that my living expenses would go down if I moved. I knew I’d enjoy an increase in opportunities for outdoor activities, which would make me happier. I had some trepidation about what my new health insurance premiums might be. However, I decided that it was not an option to continue to live in one state for the rest of my life simply due to uncertainty about health insurance. I pulled the trigger, and made the move.

In the ACA, a move to a new state is called a “qualifying event”, and it lets you use the health insurance exchange to buy a new plan. During the search process, I learned that my income was so small that I qualified for Medicaid, and that I wouldn’t have to pay any premiums at all! It was galling, since I don’t think of myself as someone who needs Medicaid. However, I’m also not someone to pay for something that I can get free of charge. So I went on Medicaid.

During the course of this year, I picked up some freelance work to help bolster my income (unfortunately, my business is not even “ramen profitable”, and I do freelancing to pay my bills). Apparently, I am not a shrewd enough business person, however. I did enough freelance work that my income disqualified me from Medicaid. This meant that I was tossed off Medicaid mid-year. Getting tossed off Medicaid is also a qualifying event, so I went searching on the exchange again. “Fortunately”, I’m still making such a minimal income that I qualify for tax credits that pay for almost all of my health insurance premiums. I put “fortunately” in quotes because I don’t think it’s fun to live on approximately $20K of income per year. I’d rather make plenty of money, and have to suffer with paying the premiums myself. But that’s just the way things are going for me right now.

So why am I writing about health insurance premiums? If you live in the USA, health insurance premiums can make or break your plans to bootstrap a business. You can do all kinds of things to reduce your cost of living. Get one or more housemates. Eat ramen. Buy your clothing from thrift shops. Participate in the “gig economy”. However, you have very few choices when it comes to health insurance. You can refuse to pay into the system, and run the risk that you might incur enough medical expenses to bankrupt you (or, possibly, to even wind up killing you). Or you can choose a plan with a high deductible. This is what I’ve always done, but even those plans have become quite pricey. As an example, I’ve now bought into a plan that covers me for the next year. The annual cost will be almost $8000, without taking into account tax credits. And that plan has a deductible of about $7000.

I don’t like the health insurance system in this country. I don’t like that health insurance is heavily linked with employment. I don’t like that my health insurance plan has to change when I move from one state to another. I don’t like that even though I’ve been covered by health insurance for most of my life, I may incur huge expenses if I’m unlucky enough to have an accident or become sick during a brief period when I’m uninsured (and I’ve never been uninsured intentionally – it was always a move or the recent Medicaid fiasco that caused me to become uninsured for a short period of time).

Single payer is the way to go. I’m tired of hearing about how larger companies have more bargaining power with health insurance companies, and that this is why small firms have such high premiums.  If a large corporation has bargaining power, then how much more bargaining power would the entire population of the US have? Oh yeah, and I’m also tired of having my health insurance options decided by people who are disconnected from the health insurance reality that faces less privileged members of our society.

If we can get everyone covered by a single group insurance plan, I’m betting that everyone’s rates would go down. I think the cost of healthcare in this country would go down as well. I don’t have proof, except to point to how much better it works in numerous other countries. The US population has been comfortable ignoring the fact that many less well-off, self-employed people have been screwed by the tight link that formed between health insurance and employment during WWII. As more people lose their full-time jobs and start working in the crappy gig economy, it’s clear that something has got to change. It is time to cut the cord between employment and health insurance!

term does not start in linux mint

A friend of mine just experienced a very strange issue. He uses linux mint (I use Ubuntu, and I don’t know if the same problem occurs in Ubuntu).

He tried to run term from the menu, and nothing happened. He tried running term in numerous ways (CTRL-SHIFT-T e.g.), and again, nothing happened.

Fortunately, xterm could start, so we had a toehold. The first thing we did was to take a look at the logs (/var/log). However, we did not see anything informative there, nor did we find anything useful by running dmesg.

Then we tried running uxterm, another application which we thought might work. It failed by opening with a small window containing an error message that said something like “gnome terminal locale not supported” – together with my friend’s user password, shown in the clear! That was a bit scary – it looked as if his system had been hacked in some way.

An internet search of “gnome terminal locale not supported” turned up a forum link which described a problem with locale. My friend typed in locale -a, as suggested in that thread, and saw his user password appear on many of the output lines – also alarming!

So far as we could tell, locale gets its information from environment variables like LC_TIME and LANG. Where were these being set? At this point, it seemed most likely that some environment variables might have been set incorrectly in some bash script. A quick search of my friend’s home directory (we grepped for the password in all files) turned up the culprit – the corrupt setting was in the .dmrc file. My friend had not knowingly changed this file. Somehow, though, it had been edited so that Language was set to his user password.

He edited the file to switch the Language line back to its correct setting, like this:


After a reboot of the system just to be extra safe, he was now able to open a terminal using term again.

I hope this helps anyone who might have a similar problem. I found a forum post from someone who appeared to have the exact same problem in linux mint, but the thread was locked, otherwise I would have posted the solution there.