Chippendale Mupp

I’ve been reading Dr. Seuss’s Sleep Book many, many times with my son1He seems to get stuck on a book for a week or more where he carries it all over the house and wants to read it at naptime and bedtime every day. I get stuck on the continuity and engineering/science questions in these books, here’s one…

How Long is a Chippendale Mupp Tail?

If you don’t know, the above creature is called a Chippendale Mupp2Chippendale Mupp. He falls asleep each night after biting his tail which acts as its alarm. Its tail is so long that he apparently gets a full night’s sleep before the pain wakes him up.

Pain impulses move at around 2 ft/s 3Speed of Nerve Impulses and it’s safe to say a Chippendale Mupp needs around 8 hours of sleep4How much do animals sleep? and so:

8 hours in seconds = 28,800 seconds

28,800 seconds / 2 ft/s = 14,400 ft

14,400 ft to miles = 2.7 miles

So, for a Chippendale Mupp to get his 8 hours of snooze he has to have a 2.7-mile long tail.

Focus 3 Apple Watch Face

Update 2020-08-17: I got a new Apple Watch so I updated the wallpapers in this article to the new size. It should look much better on the new models. Below there’s now links for Old Model (Series 3 and below) and New Model (Series 4 and 5)

I’ve been consuming a lot of podcasts and media by the Focus 3 Team, Tim Kight and Brian Kight and I made some Apple Watch wallpapers to remind me of key points in their system.

The goal is to become the best version of you. To know what you want and achieve and the discipline required to do it.

Here’s a short explanation of each of the wallpapers included:

  • Doesn’t Matter, Get Better – Did you win? Doesn’t matter, get better. Did you lose? Doesn’t matter, get better.
  • No BCD – Blaming complaining and defending are a waste of time, stop doing them and Do the Work.
  • Do The Work – Figure out what work is required and do it. Stop planning, re-planning and procrastinating.
  • E+R=O – You can’t control the event but you can control your response which influences the outcome.
  • Disciple over Default – There is only Discipline, avoid your default response (e.x. I’m tired, I’ll just watch some Netflix) and overcome it with discipline to achieve the life you want.

Here’s a video to get you started:

How to Do It

Here’s how you set up your new Watch Face:

  1. Save off all the images below (long press and a Save Image or tap the image and use the Share Sheet to Save Image)
  2. Open the Apple Watch app
  3. Go to Face Gallery
  4. Select a Photos Face
  5. Change the Photos to Custom and select all the images you saved in Step 1
  6. Make sure the Time Position is Top
  7. Select your Above Time and Below Time complications if you’d like them
  8. Hit the Add button
  9. Go to your watch and make it the showing watch face

Ruby vs Go – Structuring Data

I’m trying to write a Taskpaper parser in Go.

A very basic Taskpaper file looks like this:

Home:
- Mow the lawn
Don't hit the flowers

Work:
- Fix all the bugs
Seriously, all the bugs

Projects end with a : and tasks begin with a - and any line that doesn’t have that is a note. Projects have tasks and notes and tasks can have notes.

I got totally stuck yesterday on how to structure this data in Go.

If this was Ruby I would do it like this:

class Item
  attr_accessor :parent
  attr_accessor :notes
end

class Project < Item
  attr_accessor :tasks

  def initialize(desc)
    super(desc)
  end
end


class Task < Item
  def initialize(desc)
    super(desc)
  end
end


class Note < Item
  def initialize(desc)
    super(desc)
  end
end

An Item holds generic fields and then there’s a Project, Task and Note classes.

In Go there’s no way to say that a Note struct has just a generic Parent i.e. Parent *Item. To work around this I had to create a ProjectNote and also a TaskNote:

type Item struct {
  Desc string
}

type Project struct {
  Item
  Tasks []Task
  Notes []ProjectNote
  Tags  []ProjectTag
}

type Task struct {
  Item
  Notes  []TaskNote
  Tags   []TaskTag
  Parent *Project
}

type ProjectNote struct {
  Item
  Parent *Project
}

type TaskNote struct {
  Item
  Parent *Task
}

It feels a bit wrong to break these out like this but that’s probably because I’ve been stuck in the OO world of Ruby and Java for too long.

Brief Thoughts On Task Management

  1. No task management means you’re completely interrupt-driven. Whatever email arrives or whoever stops by your office always gets first priority. A lot of bosses will reward you and promote you for this because you’re reacting to their every whim, but that doesn’t mean it’s the best for the company. No task management means you’re not working on anything that’s important yet not urgent (at least not yet). There’s no goal-oriented, strategic thinking there.
  2. Paper task management lacks the far future tasks (like sign up for a conference three months from now) and recurring tasks that make digital powerful. It also lacks scalability, if you’re managing a hundred projects1Not unheard of if you go by the GTD definition of a project. paper will make it impossible. Though, maybe if life starts going past what can be managed with paper than it’s too complicated? Maybe there’s something to be said about putting a physical limitation on how many projects you can juggle at once; if managing your life with paper is sufficiently annoying it will encourage you to cut things out.
  3. Digital task management lacks the physical limits that paper has, so cruft builds quickly. You have to constantly trim, review, and cut to keep it from getting out of hand and out of date quickly. It tends to attract way more things than you can possibly get done in a year and since it’s not taking up any space in the physical work you’re more apt to let those far-out tasks stick around in the system for longer and longer.
  4. Digital task management also lends itself well to switching between multiple apps. If you’re doing paper task management and you’re switching between notebooks or from a Franklin-Covey planner to a Hobonichi Techo you will have to rewrite at least everything that’s going into the future and then carry the other one around to reference for the past information until you’ve switched for long enough. It’s all too easy to switch between apps once a month (which is a great form of procrastination) and never land on one you fully adopt.

All of that said, I’m using Todoist and I’ve committed to it for a year (to avoid switching to whatever the new and shiny thing is that just came out). The way they represent projects makes having too many painful which I think is a good thing. Omnifocus allows for too many projects and would be way too fiddly for my personality (especially since you can script it)

Taming Nightstand Device Charging

Like most modern-day geeks I have too many devices that need to be recharged regularly. The constant accumulation of new wall warts has turned into this situation next to my nightstand:

I decided to use one of the new desktop USB chargers to get this mess of cords cleaned up.

Having it sitting onto of my nightstand really didn’t solve the problem so where’s what I did.

Materials List

First attach the charger to the back of your nightsand using a 3M strip. You’ll have to figure out the best height for your cord lengths:

I used a USB extension I already had laying around for my Fitbit charging cord since so short:

Slot the cords through the Quirky Cordie:

Plug it all in:

And here’s the final product, much neater. The extra cord length drapes down the back along with my surge protector:

Running Teamspeak 3 Server As a Regular User

In my previous article on How to run Teamspeak3 on Digital Ocean the instructions have you create a teamspeak3 user and change ownership of the files. I noticed in some of the comments over there that people noticed it was running as root, not the greatest thing for security.

I noticed my server was also running as root, here’s how to fix it if you used my instructions:

Shut down Teamspeak:

sudo service teamspeak3 stop

Remove the /etc/init.d/teamspeak3 soft link:

sudo rm /etc/init.d/teamspeak3

Now edit /etc/init.d/teamspeak3 and set the contents to this:

#!/bin/sh

su -c "/usr/local/teamspeak3/ts3server_startscript.sh [email protected]" teamspeak3

Set the file to be executable:

sudo chmod u+x /etc/init.d/teamspeak3

Fix permissions, many of the Teamspeak files are probably owned by root now which would prevent the server from starting:

sudo chown -R teamspeak3:teamspeak3 /usr/local/teamspeak3

Start the server back up:

sudo service teamspeak3 start

Use your client software to connect and make sure everything is operating properly and you’re done.

Seven Years is too Long

I was at my last company for seven years. I moved between locations, projects, positions and responsibilities but I was at the same company for seven years, not really even thinking about moving.

I worked for one of the major defense contractors and at the time it was fun and we were doing interesting work. It was mostly short-lived research contracts for the service labs and the DoD so it was always something new. It stopped being fun though when the money started to dry up and belts started to get tightened. I could see the writing on the wall and it was time to make a move1About all I got right was the timing.

My interview skills were rusty, my resume was completely neglected and it took time to get everything in line before I started breezing past the phone screens and into interviews at companies I could really work for.

Looking back now after a year working at my new company here’s what I would’ve done differently.

1. Know the Companies in the Area

Keep up with what the great companies are in the area, the technologies they use and the kind of positions they look for the most. Shop for companies that match what you want as far as benefits, culture and your skill set. If you target a specific set of companies you know already match what you want you will save a lot of time by not peppering Monster with a million resumes and getting a ton of replies from people who don’t know how much you’re worth.

Go to the user groups in your area. If you want to stay in the same technologies or branch out, it’s a perfect way to find out who is in the area. Many companies sponsor these as a way to recruit new employees. This is also a great way sharpen your presenting skills. You can start with a lightning talk and move from there.

2. Interview at Least Every Other Year

You might not be ready to leave your current company but you should at least stay in practice. Most programmers have enough recruiters calling that you could answer the phone every once in a while and do a phone screen and see how it goes.

Doing this regularly helps you overcome the interview jitters.

3. Practice

  • Find a sample interview programming question on the web and work through a few with a timer.
  • Review the Big-O notation of some of the common algorithms.
  • Work with a whiteboard to talk through an overview of some software you wrote recently.

4. Perfect Your Pitch

You know the companies now, you’ve talked to a few people, now change your pitch.

Incorporate what you’ve learned from your practice interviews. For me people were worried that I worked on some ancient radar system mad had no relevant skills. I emphasized that I worked for a research group and worked on new technology like Ruby on Rails and did networking research.

Another important area I had to work on was how to concisely describe the projects I worked on and how to taylor that description to technical and non-technical people. This is where face time is great, if you start seeing someone’s eyes start glazing over while you’re telling them about the distributed test infrastructure you setup and the long list of all the technologies you used you know that you have to change tact.

5. Time Your Move

Don’t leave a job you love for no good reason but also don’t blindly trust that they are paying you what you’re worth and will take care of you for the next forty years. Dan Benjamin of 5by5 and Quit! fame emphasizes this point: when push comes to shove, if they have to let you go they will.

If you see the business going downhill or in a direction you don’t agree to you can make your move quickly before everyone sees the writing on the wall and starts peppering local companies with resumes. You won’t have to blindly apply to all the job board postings you can if you’ve already established good contacts in your local user groups and know exactly for which companies you work.

6. Wear a Suit

Make more excuses to wear a suit or get dressed up. This will make you feel more comfortable and less out of place when you do have to put one on to go to an interview. It will also limit the surprises when something doesn’t fit or the TSA zipped your suit pants into your suitcase ruining your favorite suit 2Not that I’m bitter or anything.

Conclusion

Being on top of the above items can save you months worth of hassle and get you onto your next job more quickly and painlessly.

Bought and Unread Books

The Inspiration

I also have a lot of books I’ve purchased and barely cracked the binding. This is an awesome goal to shoot for so I started thinking about how I would do it, here are my thoughts.

My Books

Scary Books

These aren’t separated out but they warrant talking about. These books have been raised to such a level through fame and infamy that I’m scared to touch them. GEB and SICP and are firmly in this category for me. So is The Annotated Turing, even though Charles Petzold is a great writer (go read Code), then chapter two starts talking about transcendental numbers and degrees of infinity my long seated math fear comes to the surface.

I need to get over this fear and dive into one of them. If you’re in the Philadelphia area the Clojadelphia user group is starting a SICP study group set to meet Febuary 5th.

The Projects

This pile mainly consist of books that I need to do projects and exercises along with reading the content to really learn.

Reference

I will probably never read these books straight through but it would be good to skim through so I know what is in them so I can use them more effectively. 1I bought the AOCP in college for way too much money relative to how much I had in my bank account. I didn’t get to use it until my master’s level algorithms course but it did come in handy (finally).

Branching out

This stack is mostly about reading outside my field though somewhat tangentially. I tried to start the Black Swan a while back but couldn’t get into it. I also got about half way through GEB on vacation one year but got pretty lost when I picked it up again a few months later.

Get organized

Here’s my attempt to get better organized and learn more about project management. I’ve read through David Allen’s Getting Things Done several times but I can always read it again. It’s packed full of useful information and you don’t have to take the whole system as written, you can start using some parts and go from there.

Fiction

I’m actually surprised that this stack is so short. I really thought I had way more fiction books in the physical / already bought queue (not shown here: Catch 22).

Math and Poor Perl

Here are a few math books I’ve meant to read. I used a fair bit of linear algebra in my masters program even though I sucked at it in my under grad days. Discrete math always seemed the most relevant but this class was during a too-many-credits-in-one-semester haze so I’d love to work through it again.

The Hawking book was a random purchase and while I’ve skimmed it I can’t say I’ll ever read it cover to cover.

And then there’s Perl. It’s not in the reference category because I just don’t do Perl anymore though it was the first programming language I fell in love with. I can’t get rid of this book2Much like the TI-99/A programmer’s manual and my COBOL book. because I spent so much time in this book.

The Work Shelf

I used to have almost all my books at work at my last company and almost never used them. This is the subset I decided to take in or work bought for me. I think they pretty much match up with the categories I already setup.

Conclusion

I think the goal is still achievable, especially if you consider not reading the reference stack though the Project books would be a bit intense to work through in a single year.

Also, I think Fogus’ Reading for the Rushed also applies to all of these books. If I don’t find Black Swan interesting I should probably just donate it instead of suffering through it, for example.

Running a Teamspeak 3 Server on Digital Ocean

Digital Ocean provides a Virtual Private Server for just $5 a month. It also happens to be perfect to run a Teamspeak 3 server on. Teamspeak is a great way to chat with friends while playing games or pair programming.

This how-to assumes you’re running Ubuntu 12.04 (or something close to it) and that you already have your server spun up and ready to SSH into. Visit the Community section of Digital Ocean if you need further help.

Step 1 – Get TeamSpeak 3

Our first step is to download the TeamSpeak 3 server from teamspeak.com. Make sure you’re in a directory you own and then execute the following command:

wget http://dl.4players.de/ts/releases/3.0.12.4/teamspeak3-server_linux_amd64-3.0.12.4.tar.bz2

Step 2 – Create the teamspeak3 User

Next, we need a user for the server to run as:

sudo adduser --disabled-login teamspeak3

You can hit enter for all the questions to take the default answers.

Step 3 – Extract the Teamspeak 3 Software

The following step will extract the software we will need:

tar xjf teamspeak3-server_linux_amd64-3.0.12.4.tar.bz2

Step 4 – Move the Software Into Place

We need to move the extracted software to a better location:

sudo mv teamspeak3-server_linux-amd64 /usr/local/teamspeak3

And then give the user we created permission to our new directory:

sudo chown -R teamspeak3 /usr/local/teamspeak3

Step 5 – Have TeamSpeak 3 Start on Droplet Boot Up

The TeamSpeak software package comes with an init script that we have to run as a the teamspeak3 user.

Create and set the content of the /etc/init.d/teamspeak3 file to this:

#!/bin/sh

su -c "/usr/local/teamspeak3/ts3server_startscript.sh [email protected]" teamspeak3

Set the file to be executable:

sudo chmod u+x /etc/init.d/teamspeak3

And then tell the server to start TeamSpeak when the Droplet starts

sudo update-rc.d teamspeak3 defaults

For the first time we will start it by hand:

sudo service teamspeak3 start

You should see the output similar to the following:

Copy the output from this step and save it somewhere safe, you will need it in a later step.

Step 6 – Open the Firewall Port

If you’re running a firewall on your droplet you will have to open the TeamSpeak 3 server port, 9987. Here’s how to allow that port using UFW – Uncomplicated Firewall:

sudo ufw allow 9987/udp

Step 7 – Verify the Server Is Running

  • Install the client locally for your operating system from TeamSpeak – Downloads
  • Connections -> Connect…
  • Enter the IP of your droplet and connect

Step 8 – Take Ownership

When you first log into your fresh TeamSpeak 3 server you should see the following dialog:

Copy everything after the token= and paste this:

Now you’re the server administrator:

Step 8 – Set a Password and Server Name

Right click on the TeamSpeak ]|[ Server item in the left-hand panel and click ‘Edit Virtual Server’:

Rename the server by changing the Server Name field and also set a password to access the server:

Now only the people you choose can access your TeamSpeak server.

Conclusion

Now you have a great way to chat with friends using a server you control. Just distribute the your droplets address plus the password and you’re set.

More help and advanced server setup articles are available in the TeamSpeak 3 Knowledgebase

Update (05/28/2014): incorporated instructions on how to install as a regular user into this article. Here’s How to Run Teamspeak 3 Server as a Regular User