Using Terraform to Create a Linux Image with Cloud Watch Agent and Amazon Agent

In this installment of my adventures with Terraform.  I want to spin up an Amazon Linux AMI with the Cloud Watch Agent and the Amazon Agent.

The Cloud Watch Agent will configure the ability to send the logs for the EC2 Instance to Cloud Watch.

The Amazon Agent will enable Amazon Inspector to inspect the instance for security vulnerabilities.

The first step is to create a Terraform script that remotely executes a shell script.

Three parts are required.
This provides the ssh connection info in order to connect to the EC2 Instance.
  connection {
    user        = "${var.INSTANCE_USERNAME}"
    private_key = "${file("${var.PATH_TO_PRIVATE_KEY}")}"
File Provisioner 
This allows us to take an arbitraty files and upload it to the EC2 instance, we could just put all of the scripts in the remote-exec, but that would be ugly.
  provisioner "file" {
    source      = "awscli.conf"
    destination = "/tmp/awscli.conf"

  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/",
      "sudo /tmp/",
      "sudo cp /tmp/awscli.conf /etc/awslogs/awscli.conf",
Remote Exec Provisioner
Create a remote ssh session for executing commands on the EC2 Instance.
provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/",
      "sudo /tmp/",
      "sudo cp /tmp/awscli.conf /etc/awslogs/awscli.conf",
So clearly there is some magic missing.  I mean what am i actually deploying?
For that we go to the Shell Script
First part install the Logging Agent
sudo yum update -y
sudo yum install -y awslogs
sudo service awslogs start
sudo chkconfig awslogs on
Here are the amazon instructions
Second part install the amazon agents
sudo bash install
sudo /etc/init.d/awsagent start
sudo /opt/aws/awsagent/bin/awsagent status
Here are the amazon instructions
When you run terraform apply you get a lot of output.
Now we can jump into amazon inspector, use a filter for a tag and see what we find.

aws_instance.linuxec2 (remote-exec): Total download size: 78 k
aws_instance.linuxec2 (remote-exec): Installed size: 240 k
aws_instance.linuxec2 (remote-exec): Downloading packages:
aws_instance.linuxec2 (remote-exec): (1/2): aws-cli-p |  69 kB     00:00
aws_instance.linuxec2 (remote-exec): (2/2): awslogs-1 | 8.8 kB     00:00
aws_instance.linuxec2 (remote-exec): ----------------------------------------
aws_instance.linuxec2 (remote-exec): Total      436 kB/s |  78 kB  00:00
aws_instance.linuxec2 (remote-exec): Running transaction check
aws_instance.linuxec2 (remote-exec): Running transaction test
aws_instance.linuxec2 (remote-exec): Transaction test succeeded
aws_instance.linuxec2 (remote-exec): Running transaction
aws_instance.linuxec2 (remote-exec):   Installing : aws-cli- [         ] 1/2
aws_instance.linuxec2 (remote-exec):   Installing : aws-cli- [#        ] 1/2
aws_instance.linuxec2 (remote-exec):   Installing : aws-cli- [####     ] 1/2
aws_instance.linuxec2 (remote-exec):   Installing : aws-cli- [#####    ] 1/2
aws_instance.linuxec2 (remote-exec):   Installing : aws-cli- [######   ] 1/2
aws_instance.linuxec2 (remote-exec):   Installing : aws-cli- [######## ] 1/2
aws_instance.linuxec2 (remote-exec):   Installing : aws-cli-plugin-clo   1/2
aws_instance.linuxec2 (remote-exec):   Installing : awslogs- [         ] 2/2
aws_instance.linuxec2 (remote-exec):   Installing : awslogs- [#####    ] 2/2
aws_instance.linuxec2 (remote-exec):   Installing : awslogs- [######   ] 2/2
aws_instance.linuxec2 (remote-exec):   Installing : awslogs- [######## ] 2/2
aws_instance.linuxec2 (remote-exec):   Installing : awslogs-1.1.2-1.10   2/2
aws_instance.linuxec2 (remote-exec):   Verifying  : awslogs-1.1.2-1.10   1/2
aws_instance.linuxec2 (remote-exec):   Verifying  : aws-cli-plugin-clo   2/2

aws_instance.linuxec2 (remote-exec): Installed:
aws_instance.linuxec2 (remote-exec):   awslogs.noarch 0:1.1.2-1.10.amzn1

aws_instance.linuxec2 (remote-exec): Transaction Summary
aws_instance.linuxec2 (remote-exec): ========================================
aws_instance.linuxec2 (remote-exec): Install  1 Package

aws_instance.linuxec2 (remote-exec): Total size: 5.9 M
aws_instance.linuxec2 (remote-exec): Installed size: 5.9 M
aws_instance.linuxec2 (remote-exec): Downloading packages:
aws_instance.linuxec2 (remote-exec): Running transaction check
aws_instance.linuxec2 (remote-exec): Running transaction test
aws_instance.linuxec2 (remote-exec): Transaction test succeeded
aws_instance.linuxec2 (remote-exec): Running transaction
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [         ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [#        ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [##       ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [###      ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [####     ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [#####    ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [######   ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [#######  ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgent [######## ] 1/1
aws_instance.linuxec2 (remote-exec):   Installing : AwsAgentKernelModu   1/1
aws_instance.linuxec2 (remote-exec):   Verifying  : AwsAgentKernelModu   1/1

aws_instance.linuxec2 (remote-exec): Installed:
aws_instance.linuxec2 (remote-exec):   AwsAgentKernelModule__amzn__4.4.41-36.55.amzn1.x86_64 0:

Here is a link to the github repo with the working code.
Look in the folder ec2instances.

Setting Different Background Images Per Workspace in Ubuntu – 16.10

Lately i have been doing almost all of my Development at home using Ubuntu.

Things I love:

  1. Muliple Workspaces (I can get this in windows, but you can’t do multiple backgrounds)
  2. Visual Studio Code (I love the fact that I can use on any platform)
  3. A good bash shell
  4. I have been doing a lot of stuff with AWS, and for the most part Linux is the ami of choice, so i just needed to get use to it.

Here is what i did to improve Number 1.

In order to be able to differentiate the workspaces it is nice to have a different desktop image per workspaces

I am using Ubuntu 16.10.

Here is the documentation i started with

There seemed to be a bunch wrong, for example the i could not find the compiz-fusion-plugins-extra I found that the compiz-plugins package must have changed name.

Here is what i ended up with

Go into the terminal

sudo apt install compiz-plugins compizconfig-settings-manager

Opened up the Compiz Config Manager, and navigated to wallpaper.

Make sure to Enable the plugin “Enable Wallpaper.

Click on add, and add the four backgrounds.

I then searched for Image Loading and enabled jpeg and png.

I rebooted and voila i had 4 different backgrounds.

It was pretty straightforward once i navigated all of the different versions of documentation.


Deploying to AWS using Terraform for Local Experimentation

Terraform is a tool used to turn an api into code, and in this case we are going to use with AWS.

The download of terraform is available here

You don’t want aws secrets in your git repo, so this is a basic structure i start out with when i am doing local terraform experimentation.

Terraform Setup on Ubuntu

There is a nice script here that installs terraform.  Just run it periodically to keep it up to date.

I am a noob in the linux stuff so i needed to google to how to make it executable.

sudo chmod +x scriptname

Used to define the set of variables used in Terraform

variable "AWS_ACCESS_KEY" { }
variable "AWS_SECRET_KEY" { }
variable "AWS_REGION" 
    default = "us-east-1"

Defines what api will get ran. Since this is aws we are deploying to we are using the aws provider.  If we were deploying to azure the provider would be azurerm

provider "aws" {
    access_key = "${var.AWS_ACCESS_KEY}"
    secret_key = "${var.AWS_SECRET_KEY}"
    region = "${var.AWS_REGION}


Put this in the git ignore so the secrets stay on your local machine. If we were using a build server an alternative solution would need to be used.  But for a small scripting effort this works great.


This one can really be named anything. It is where all of the resources would get built out.

resource "aws_instance" "example" {
   ami             = ""
   instance_type   = "t2.micro"

Here is the github repo that this is stored in.



Introducing Kids to Programming and the Internet of Things

This Christmas I am looking to introduce some of the kids in my family to the world of programming and the Internet of Things.

(Devices that can do stuff, like hit a button and make an LED light up)

I am not 100% where to start, but I am thinking about first starting out with some basic electronics, moving to programming and then combining them.

This is going to be a multi-year process. Since this stuff is not necessarily easy.

Basic Electronics

There is a pretty clear winner out there for starting the journey into electronics.

Snap Circuits SC-300 Electronics Discovery Kit


The snap circuits have won many awards including: The National Parenting Center-Seal of Approval, Dr. Toy 100 Best Children’s Products, Dr Toy Best Educational Products

Basic Programming

  • Scratch
    • Scratch has been around a while and was developed by the MIT Media Lab
    • They have a vibrant community with lots of examples.
    • Developed by Microsoft.
    • They have a partnership with the BBC micro:bit project that is rolling out about a million devices across the UK schools.
    • The video and editor are easy to use.
  • Code Studio This one was is used by and comes with a bunch of great lessons.
    • There is a minecraft themed lesson, that would appeal to a whole lot of kids.
    • There are many very user friendly lessons.

Each programming environment works with various devices. So it important to know which device each works with, to understand the long term capability.

Programming and Devices

The Pi’s


Programming Environment Raspberry Pi 2 arduino
Scratch Great support

You can use scratch on the raspberry pi with no computer.

Touch Develop A bit of work A bit of work
Code Studio

Scratch also works with something called the PicoBoard


It is not a full board and requires a computer to really do anything.

It is a start, but you would end up buying an Arduino or Raspberry Pi if you wanted to do something serious.

Other Devices

I have had a gadgeteer board for a couple of years now.

To be exact it is the FEZ Spider, but it is way more expensive ($149.99) and you are asking a kid or parent to download and setup visual studio.  It can be messy. Before Windows 10 IoT it was really the best option to build and deploy .Net code to a device and watch it run. I will say I am biased towards Microsoft technologies, and that is mainly because I want to be able to provide some guidance and tech support.

My Recommendation is to go with scratch and the raspberry pi.

Raspberry Pi has great support and it ends up to be a computer you can put in your pocket. Plug an Hdmi into and program on your tv.

Creating a Segregated Searchable/Editable Map in ArcGISOnline

I would like to create a map that stores core company location data, that anyone in the company can search and a select few can add data points

ArcGISOnline has many features to jump start your project.

The Architecture/Plan


Basic Parts

These are my interpretations of the pieces*

  • Feature Layer
    • A Feature Layer is the hosted data.  It is where you would upload your shapefile/geodatabase.
    • It is the data store.  A Web Map is made up of one to many Feature Layers.
  • Web Map
    • It the most basic viewer of the Feature Data.  It is where you add your features and define how your points show up.
  • Web Mapping Application
    • There are two ways to create
    • Web App Builder for ArcGIS
      • Allows you add various widges
    •  Templates
      • A template is a pre-built website that has a purpose built function.  ESRI has put all of their templates on GitHub so you can download and customize them in order to meet your mapping needs.
      • Examples
        • Basic Viewer – Presents a map in a general purpose app with a collection of essential tools including edit and print.  Download
        • Compare Analysis – Compares geographic phenomena at one or more locations with multiple side-by-side maps.  Download
        • Crowdsource Manager – Provides the ability to review crowd sourced information and update attributes such as status, assignment, etc. Download


Lets Get Started


Step One

Create a Layer that will store the data.

Since I live in Minnesota I created a Shapefile with the Coordinate System

Projected Coordinate System:
Name: NAD_1983_UTM_Zone_15N
Geographic Coordinate System:
Name: GCS_North_American_1983
Here is the Data I am working with


I created Attributes for

ProjName, CreateDate, Company, ProjType

So we have some good things to search for once the data is uploaded.


The First Step is to zip up my shape file data.

It is all of the data that begins with your shape file name.


In My Content go to Add Item / Select My Computer and choose the zip file you just created.

Now we have a Feature Layer that we can use as a foundation for our web maps and templates.

You can go into the Feature Layer click on Edit and Check the box for “Enable editing and allow editors to: Add, update, and delete features”

Note: You can re-upload an updated shape file by clicking on overwrite and picking a file.  This is also a nice way to manage updates if you don’t need a way for novices to edit the data.


Step Two

In the Content Area go to Create

Now create a new Map.  — This will create a new Web Map

This will bring into Edit Mode.  Go to the top of the now editable web map and add the layer we just created in the previous step.


Save it


Creating the Editor

I initially tried the template Basic Editor.  I found this template to be pretty useful in terms of editor.

The nice part is you can add points and edit the data.

The Search is not very good, when you enable it.  If you search for a feature like Company Name, it will go to the first point it finds, and you cannot go to the next result.

In contrast the Find/Edit/Filter Template works great for filtering, but does not allow you to add points.


Due to the trade-offs, and some of the weird complexity I decided to use the Web App Builder for ArcGIS.  This allowed me to customize the filters and Edit Widget. I am sure the downside to the Web App Builder is the code is not available so I can’t create a brand new variant.

I have no desire to do that, so this should be good.

The Filter Setup is a breeze, and once it is done it looks great.  You can even customize how the results look.  A drawback on some of the templates.


Filter Setup


Once we are finished you have a nice filter interface with a marginally slick editor interface(who are we kidding, editing a map nicely in an web app is a pretty hard task)



Creating the Searchable Viewer

I had tried using some of the Filter Templates

At the end of the day I found the Web App Builder worked great.

I just created a Web App Builder and did not include the edit widget.

In this case I could just use sharing to manage who had permissions to what functions.


At this point I am done.

I created the feature layer, Web Map, and two web apps that should expose segrated edit/filter capabilities to your different user types.


Data Analysis with Python – The Tools and the Data

Welcome to the Inaugural Post for my Learning Python Series

The Post is the start of a series of walk throughs from Start to Finish of my journey into Data Analysis and Data Science with Python


The Tools and Loading the Data

What are the tools to download in order to get started building in Python

How do I load the data and construct the domain

How do I do some basic analysis on the data to get a feel for the relationships.

The Next Part

The next post will utilize Panda to perform quicker more structure data analysis.



The Tools

I downloaded and installed the Anaconda distribution along with the Visual Studio Python Tools

The Anaconda distribution is a python distribution that contains many many scientific libraries.

The Data

Fortunately there is a massive amount of data that you can have fun and experiment with.

The UCI Machine Learning Repository has a huge amount of data.


  • Mice Protein Expression
    • Expression levels of 77 proteins measured in the cerebral cortex of 8 classes of control and Down syndrome mice exposed to context fear conditioning, a task used to assess associative learning.
    • Mice Protein
  • Car Evaluation Data Set
    • Derived from simple hierarchical decision model, this database may be useful for testing constructive induction and structure discovery methods.
  • Adult Data Set
    • Predict whether income exceeds $50K/yr based on census data. Also known as “Census Income” dataset.

I am going to use the Adult Data Set in my Examples.


Loading the Data and Graphing the Data

Grab the Data from

import csv

with open('C:\adult.test','r') as f:
    for line in f: 
        reader = csv.reader(f)
        for row in reader: 
            age = row[0]
            workclass = row[1]
            fnlweight = row[2]
            education = row[3]
            educationnum = row[4]
            maritalstatus = row[5]
            occupation = row[6]

            print workclass

This will print out the workclass column in the data.

Resulting in an output like


In order to start to looking into the data we can use someone of Python’s built in magic to bucket the data and create some histograms.

Histograms will tell us how the data is distributed and start to give us clues about the shape of the data.

In order to create a histogram we will use the collections library to count the data


def create_histogram(labels, values, bucket_size, title):, values)

agelist = list()

with open ('C:\Users\Jon\Documents\adult.test','r') as f:
	for line in f:
		reader = csv.reader(f)
		for row in reader:
				age = row[0]

			except IndexError:

agelistfloat = [float(x) for x in agelist]
agedist = Counter(agelist)

labels, values = zip(*agedist.items())

valueslistfloat = [float(x) for x in values]
labelsliststring = [float(x) for x in labels]

create_histogram(labelsliststring,valueslistfloat,5,"Age Distribution Simple")

Once I get the file

I take my agelist and run it through Counter.

Counter allows for rapid tallying of data.  It returns a defaultdict object that list each age and how many occurences there were.

We then unzip the list to labels and values.  * reverses the zip operation.

We then call the, values) to show the graph.

Simple Histogram

We can see that our data is a right-skewed distribution.  When you look at the data you can see it is evenly distributed over the income generating population.  At around 18 it starts and starts to gradually tail off at the peak of around 40.


First Refactoring – Making the code a bit more compact and readable

I mapped each row to a named tuple in order to iterate through the data a bit more intuitively

First I created a dictionary of the columns in the data.

    economic_columns = ['age', 'workclass', 'fnlwght', 'education', 'educationNum', 'maritalStatus', 'occupation', 'relationship', 'race', 'sex', 'capitalGain', 'capitalLoss', 'hoursPerWeek','nativeCountry', 'income']

    EconRecord = collections.namedtuple('econ',economic_columns)


I then created a object that would represent the named tuple.

    rowlist = list()

    for econ in map(EconRecord._make, csv.reader(open('C:\Users\Jon\Documents\adult.txt', "r"))):

I used the EconRecord and the map function to apply EconRecord._make to every record in the collection.  Creating a new econ record for each row in the file.

The result is being able is being to aggregate the items in a bit more cleanly with more concise readable code.

    agelistint = [int(x.age) for x in rowlist]
    agedist = Counter(agelistint)
    labels, values = zip(*agedist.items())

The Next Series we will start to scatter plot and look for relationships in the data using Panda.



Python Lists

The Book – Data Science from Scratch

Beautiful Plots With Pandas and Matplotlib


CSV  – Python

Python Structure 

New Router – Asus RT-N16 and Tomato Awesomeness

Jeff Atwood has an excellent article recommending this router.

It can be found here.

In the article is a guide to flashing the firmware with tomato.

The one caveat that I would add is.

You have to reset the NVRAM via key presses which means

    1. Power off the RT-N66U
    2. Press and hold down the WPS button
    3. While holding the WPS button, plug in the power cable to turn RT-N66Uon
    4. Keep holding the WPS button for 30 seconds before releasing
      The router should reboot
    5. Congratulations. The NVRAM has been cleared.

I was not able to reach the web address so I was not able to perform the operation via the web admin, so the key press option was my only option.


In performing this process. I found the instructions and distribution of Easy Tomato to be fantastic.

Easy Tomato is by far the best router firmware I have ever used. 


It makes the things that should be easy, easy and allows the advanced settings to be found easily.


A couple of examples

You can block any and all adult sites with a single checkbox.(bam)

You can define groups and drag the devices on your network into groups.  Yeah I said drag(holy web 2.0 interface batman)

Each group can then have access rules defined for it.


I highly recommend Easy Tomato and the Asus RT-N16 router.

Superior Biking Trip 2013


On October 28th my brother and I set out on a Bike ride from his house to Superior WI. Our plan was to take the Gandy Dancer Trail from Milltown to Superior.  We brought gear to camp and food to eat.  The bikes were geared up and ready to go.

Here is the Google tour that goes over the bike route.(Google Earth Plugin is Required)

Google Tour

Day One – To Danbury

We set out on the Gandy Dancer Trail

It is a nice limestone trail that runs from St. Croix to Danbury.

Originally we thought it was a nice bike trail all of the way up to Superior.

We were wrong.  It turns to crap at Danbury.


A nice river bridge over the Yellow River

We ended up camping a ways down on the Gandy Dancer after Danbury.  It was a pretty cold night.  I bet it was in the neighborhood of 30.

In the morning our bikes had a healthy layer of frost.

Day Two – Danbury to Superior

Since the Gandy Dancer was a rough four-wheeler trail from Danbury to Superior we decided to take highway 35 up to Superior.

Highway 35 is a state highway that runs on the Wisconsin side.  It is pretty nice road.

It was about 40 and flurries on the way up.  Sun would have been great, but it was better than rain.

WP_20131029_001 (1)

We stopped at the Drydock in Chaffey to warm up.

Day Three – Superior

We decided to take a two night break in Superior and rest up.

After a night of camping, and being next to a hotel. It seemed pretty silly to not stay in a hotel.



During our time we biked to Grandma’s saloon and had dinner with our niece Allison.

Day Four – Duluth – Moose Lake

We decided to take the Willard Munger Trail back.

It is a nice paved trail from Duluth to Hinckley.


Stopping to change into Rain gear


There is a really nice rail bridge over the St. Louis River.


There is a fantastic Sausage shop in Mahtowa

TJ’s Country Store

The Cheddar Wurst is fantastic.


We stayed over night in Moose Lake at the Moose Lake Hotel.

Day Five – Moose Lake – Hinckley

The next day was pretty short and ended at about 1:00pm

Mom picked us up at Grand Casino Hinckley.


Overall it was a nice ride. It was too bad that the Gandy Dancer Trail was not able to take us all of way up.

It would have been possible to take 77 over to Hinckley from Danbury and then we could have taken the Willard Munger there and back.

Maybe next time…

My Top 5 Strengths


You love to learn. The subject matter that interests you most will be determined by your other themes and experiences, but whatever the subject, you will always be drawn to the process of learning. The process, more than the content or the result, is especially exciting for you. You are energized by the steady and deliberate journey from ignorance to competence. The thrill of the first few facts, the early efforts to recite or practice what you have learned, the growing confidence of a skill mastered—this is the process that entices you. Your excitement leads you to engage in adult learning experiences—yoga or piano lessons or graduate classes. It enables you to thrive in dynamic work environments where you are asked to take on short project assignments and are expected to learn a lot about the new subject matter in a short period of time and then move on to the next one. This Learner theme does not necessarily mean that you seek to become the subject matter expert, or that you are striving for the respect that accompanies a professional or academic credential. The outcome of the learning is less significant than the “getting there.”


You look for areas of agreement. In your view there is little to be gained from conflict and friction, so you seek to hold them to a minimum. When you know that the people around you hold differing views, you try to find the common ground. You try to steer them away from confrontation and toward harmony. In fact, harmony is one of your guiding values. You can’t quite believe how much time is wasted by people trying to impose their views on others. Wouldn’t we all be more productive if we kept our opinions in check and instead looked for consensus and support? You believe we would, and you live by that belief. When others are sounding off about their goals, their claims, and their fervently held opinions, you hold your peace. When others strike out in a direction, you will willingly, in the service of harmony, modify your own objectives to merge with theirs (as long as their basic values do not clash with yours). When others start to argue about their pet theory or concept, you steer clear of the debate, preferring to talk about practical, down-to-earth matters on which you can all agree. In your view we are all in the same boat, and we need this boat to get where we are going. It is a good boat. There is no need to rock it just to show that you can.


Excellence, not average, is your measure. Taking something from below average to slightly above average takes a great deal of effort and in your opinion is not very rewarding. Transforming something strong into something superb takes just as much effort but is much more thrilling. Strengths, whether yours or someone else’s, fascinate you. Like a diver after pearls, you search them out, watching for the telltale signs of a strength. A glimpse of untutored excellence, rapid learning, a skill mastered without recourse to steps—all these are clues that a strength may be in play. And having found a strength, you feel compelled to nurture it, refine it, and stretch it toward excellence. You polish the pearl until it shines. This natural sorting of strengths means that others see you as discriminating. You choose to spend time with people who appreciate your particular strengths. Likewise, you are attracted to others who seem to have found and cultivated their own strengths. You tend to avoid those who want to fix you and make you well rounded. You don’t want to spend your life bemoaning what you lack. Rather, you want to capitalize on the gifts with which you are blessed. It’s more fun. It’s more productive. And, counterintuitively, it is more demanding.


You are inquisitive. You collect things. You might collect information—words, facts, books, and quotations—or you might collect tangible objects such as butterflies, baseball cards, porcelain dolls, or sepia photographs. Whatever you collect, you collect it because it interests you. And yours is the kind of mind that finds so many things interesting. The world is exciting precisely because of its infinite variety and complexity. If you read a great deal, it is not necessarily to refine your theories but, rather, to add more information to your archives. If you like to travel, it is because each new location offers novel artifacts and facts. These can be acquired and then stored away. Why are they worth storing? At the time of storing it is often hard to say exactly when or why you might need them, but who knows when they might become useful? With all those possible uses in mind, you really don’t feel comfortable throwing anything away. So you keep acquiring and compiling and filing stuff away. It’s interesting. It keeps your mind fresh. And perhaps one day some of it will prove valuable.


Your Achiever theme helps explain your drive. Achiever describes a constant need for achievement. You feel as if every day starts at zero. By the end of the day you must achieve something tangible in order to feel good about yourself. And by “every day” you mean every single day—workdays, weekends, vacations. No matter how much you may feel you deserve a day of rest, if the day passes without some form of achievement, no matter how small, you will feel dissatisfied. You have an internal fire burning inside you. It pushes you to do more, to achieve more. After each accomplishment is reached, the fire dwindles for a moment, but very soon it rekindles itself, forcing you toward the next accomplishment. Your relentless need for achievement might not be logical. It might not even be focused. But it will always be with you. As an Achiever you must learn to live with this whisper of discontent. It does have its benefits. It brings you the energy you need to work long hours without burning out. It is the jolt you can always count on to get you started on new tasks, new challenges. It is the power supply that causes you to set the pace and define the levels of productivity for your work group. It is the theme that keeps you moving.

Learned from

My Utility for one user is now deployed across the enterprise

You created a simple Utility to aid in doing your job. You give it to one user, and he/she gives it to someone else. 

Everyone is singing your praises.  Great Job.  I love this app.

Now 30 people have it.  Cracks are appearing, the app is not ready for the load.

People are starting to complain.

You were the hero, now you are constantly defending yourself for an unstable application.


What do you do?

Sell it

  • Get your users to quantify the value.
  • Get Feedback on new features and figure out the value.
  • Estimate the time.
  • Acknowledge the risk (It could 20% more because I don’t understand widgets)
  • Put together a presentation
  • Sell it to people who are willing to pay.
  • Execute.