A mutt by any other name…

Jeff and Mutt in the SnowI’ve been thinking a bit about dogs lately, and that’s all been triggered by sorrow.  The passing of a beloved dog is a hard burden to bear, especially because that passing is usually at my own request.  But with each passing, I’m reminded anew of all the dogs I’ve loved in my life and how they’ve changed me, loved me in return and made my life richer for it.  That I am a dog person, there is no doubt.  And that goes way, way back to before I was born.  Several lifetimes ago now.

I still don’t exactly know where she came from.  Part of me always thought my dad found her in a sack on the side of the highway.  Part thinks she was a shelter dog that they adopted from the local animal shelter.  But regardless of how she came into my family, she was there before me.  She was a gorgeous Collie / German Shepherd mix, all long legs and long fur with GSD colors.  She was my dad’s dog, until she wasn’t any more.  That part came later, though.

At first, to say she and I got along would be an egregious lie.  Truth is, as a mewling, pink little pup, I had no idea at all, but she did.  I was an invader.  I was a new thing that her people had brought home.  I was not to be trusted.  I was coming between her and her people.  And so she’d give me looks.  She’d bare her teeth and threaten me with a low growl.  Eventually, as I grew, and became more mobile, she’d turn it up a bit until finally she was snarling and snapping at me.  She was the alpha dog and was going to put me in my place in the pecking order.  I was too young to really remember any of this, mind you, so this is based on what my parents have told me.  One day she snapped at me and slunk off when my dad turned towards her.

“Let me catch you again,” he warned, “and you’ll regret it.”

He caught her again, snarling and snapping at me, a dog far larger than I was at that age, capable of killing me should she have put her mind to it.  And she snapped and my dad kicked her hard in the side, launching her across the room with his big work boots that I remember so well.  And from that moment on, she was no longer my dad’s dog.  From that moment on, she was my dog.  In that moment, her place in the pecking order was solidified, beneath me, and she came to accept that, and became my dog.

Growing up, Mutt was my best friend.  When my parents were at work, or sleeping, she was there to keep me company.  When my grandmother was watching soaps and sipping coffee from that old brown mug she had, Mutt was there.  She lived mostly outdoors in an old kennel made of what seemed to be 50 foot high fencing wire attached to old T-Bar iron posts.  She had a dog house that both of us could easily fit inside, made of ply-board, two by fours and roofing shingles.  Every day I’d race out to free her from her confines and we’d be off.  Some days she’d hike with me in the woods where I grew up.  Some days we’d play in the creek together.  Sometimes we’d just lay in the grass, counting puffy white clouds in the Virginia sky, napping in the warmth of the sun.  But no matter what, we had each other.

Sometimes, she’d wander off to who knows where on her own and be gone for a couple days or so.  But she always came back to me, sometimes bringing back something she’d stolen from wherever it was she ventured.  Sometimes it was a carcass from a kill she’d made hunting.  But she always came back to me.

Eventually, I went off to Kindergarten.  I’m sure she missed me during those long days, but she was always there to greet me when I returned.  Tail wagging, ready for me to play, to run, to hike.  She was always there to greet me, rushing to the end of our drive to sit patiently when the bus dropped me off.  As I grew and made friends, sometimes I’d be late coming back and not get to see her that day.  But she’d always greet me with the same joy and enthusiasm every day I got off that bus.

I’m sure that this is why I’m a dog person to this day.  Because I had such a healthy life with a dog so early on, a creature that started out resenting me but then adopted me and became my most loyal and treasured friend.  Tens of thousands of years ago, this was made possible because someone in a camp, huddled next to a fire to ward off the frightening creatures in the dark, gave some food to a starving wolf that wandered in close.  That wolf returned the next night, and the next, always getting some food from the human.  Eventually that wolf had pups and the pups learned to stay near the humans and they too were fed.  And eventually the dog became domesticated and became the definition of “Man’s Best Friend.”  And Mutt was mine.

All those thousands of years of slowly growing a bond with dogs likely saved my life.  I came home from school one day, got off the bus and headed up the driveway as I always did.  It was a nice late spring day, the gravels of the drive nicely heated from the sun.  The kind of heat that snakes love to lay on to warm their bodies.  And a snake was doing just that as I headed up the drive to my home.  As I grew nearer, I didn’t even see it until it reared back into striking position, hissing at me angrily.  I could say I was terrified, but the truth is, I was too young to really grasp the danger represented by that snake.  All I knew was surprise.  But before that surprise could even register, Mutt flew between us like a blur all fangs and fur and intent to do harm.  Hackles raised, head lowered, growling and snarling, my best friend came between me and an angry, or more likely startled, snake.  The snake decided it was not a battle to be fought with this large descendent of the wolf and slithered off into the grass.  Mutt just looked at me, licked my hand and trotted to the house as I followed her.

The problem with young dogs is that they become old dogs.  Mutt grew old without me even realizing it.  I was still too young to really grasp the concept of growing old and death.  My grandmother was ancient and presumably had always been ancient.  My dad was a giant and would always be so.  Even though I’d been to the funerals of family members, including my Grandfather, I really didn’t understand.  That lesson came to me suddenly one evening.

I don’t even remember how I came to be standing there in the local Kroger’s.  Nor do I remember much at all about that time.  What I do remember is this.

We were grocery shopping one evening.  As we made our way from aisle to aisle, I insistently tried dragging my parents to the pet section.  Mutt needed food.  I know I had noticed that her bag of food was gone, so we must be out, and we must need more.  It was there, in the middle of Krogers, that I, a 7 year old little boy (maybe I was eight?), learned the weight of life.  That was where I learned that my best friend, my loyal companion, my protector was gone and was never coming back.  I don’t know why they waited to tell me.  I suppose the plan was to tell me later that night, so I could cry myself to sleep, but I called their bluff in my own ignorance by insisting that we needed more dog food.  I’m good at crashing plans like that.

But Mutt had, without me even noticing it, grown old and tired.  Her hips were sore and gone were the days of running tirelessly through the field or up in the hollow.  It was her time to go, and my dad had taken care of it.  All I knew was anger for taking my dog away.  I knew grief, I knew sorrow, and I blamed them for being so cold and heartless.  It wasn’t until much later in life, when our next dog, Brittany was at the end of hers, that I really understood.  It was then, as I snuggled Brittany for the last time, said my goodbyes and told her how great a dog she was that I finally understood the weight of it all.  It was even later than that before I finally understood just how difficult it is to make that decision, and years later than even that before I finally came to terms that while I could order up death with a phone call, doing so was the greatest act of love you can give someone who has given their entire life in devotion to you.

A piece of me dies each time I have to make that call myself, and every time I do, I’m that little boy standing in Krogers, and that twenty-something sitting in the floor with an old Brittany Spaniel, and I’m that thirty something holding my boy Jack tightly to me as the doc pushes the plunger on the syringe, and I’m that inconsolable mess as my heart dog, Patches, stops breathing, giving out that one last sigh as I whisper in her ear and I’m that crying, blubbering forty-something bearded biker carrying an empty collar out of the vet clinic having ended the incredible pain that Jazz was suffering, and I’m the gentle giant, crying into the cold, dark night, wrapped in a sleeping bag on the hard wooden deck to comfort and old Husky who was finally, after 16 years, ready to leave this world.  I’m all of those at once.

And it all started with a mutt named Mutt.

A Tale of Two Model Ms

It was the best of keyboards, it was the worst of… wait, no it was the Best of Keyboards, period.

Unicomp Classic and IBM Model M

A long time ago, someone brilliant at IBM (IBM was full of brilliant people) came up with an idea for a keyboard.  This keyboard was constructed of steel and plastic.  It was murderously heavy.  No, seriously, you could kill someone with it.  It had replaceable, cleanable key caps.  It used a buckling spring mechanism over a capacitive PCB and was designed in the early 80s to allow people to type all day long on these new “Personal Computers” that IBM was producing.  It was called the Model F.

The Model F’s were pretty complex bits of machinery themselves, and as with any bit of complicated engineering, there are always ways to make them better, or less expensive to produce.  Thus mid-way through the 80’s, IBM re-designed the Model F slightly and debuted the Model M.  The Model M was nearly identical to the Model F, thought it used a membrane rather than a PCB underneath the keys.  Additionally, the body of the Model M was made from injection molded plastic, rather than the painted plastic of the Model F that was prone to cracks and failure through abuse.  There were other improvements or cost saving measures (depending on how you view it) and that became, arguably, the greatest keyboard ever made for computers.

The Model M was introduced around 1985 and built by IBM until the early 90s when IBM sold off parts of it’s manufacturing and design teams with Lexmark picking up the bits of the company that made keyboards.  Lexmark continued producing the Modem M into the 90s.

I picked one of these up at the IBM junk shop at the RTP campus when I worked there.  The Junk Shop (my term) was a wonderland of outdated equipment of all manner.  You could pick up oscilloscopes, microscopes, old computers, office furniture, equipment and all manner of things that the company no longer needed.  As I perused the aisles of junk, one day, I noticed a curled cord with a PS/2 plug on the end sticking out from a pile of old boxes.  Underneath that was a worn IBM Model M keyboard.  I paid, if I recall correctly, about $3.00 for this old workhorse.  It was born on 13 July 1989 and was model 1391401, the most common variant of the Model M.

I returned to my desk in the SuperLab and after digging up a PS/2 to USB adapter, plugged the old Model M into my Thinkpad and never looked back.  I’ve used that keyboard daily for nearly 10 years now whenever I am at my desk, be it at IBM, or now at my home office working for Canonical.  I’ve used my Model M on Thinkpads, on desktop machines, servers and evan on a MacBook Air and it worked flawlessly until a week or so ago when, frustratingly, the M, B and Space keys stopped working.  Sadly, after 26 years of faithful service, my IBM Model M was ready for retirement.

This started the quest for an adequate replacement.  I searched High and Low for another Model M, finding them everywhere, but often for a significantly more than what I paid for mine back then at the Junk Shop.  Frustration mounted until I stumbled across a company called Unicomp, which, as it turns out, now owns the rights and designs to the IBM Model M that both IBM and Lexmark produced.  The decision was made and that afternoon, I had ordered and received the shipping notice for a new Unicomp Classic M, based on the same designs as the IBM Model M that I loved.

The Unicomp Ms are based on the same designs as the old IBM M’s, as Unicomp owns the designs, having purchased them from IBM.  So with that in mind, they should be identical, and they almost nearly are.  The issues I’ve encountered are more in build quality than anything else.  My IBM Ms were all very heavy, very solid keyboards.  The Unicomp models are also weighty, and honestly not that bad in terms of quality.  However, the cases have some fitment issues making them just a bit creaky, especially in the corders.  But they’re fresh, new, and have that satisfying clicky sound that makes buckling spring keyboards so great.  And they keys and mechanisms are solid, and stand up to all manner of abuse.

My Unicomp Model M lasted for a year and a half before I broke it.  Unfortunately, unlike the IBM Ms which came with drain holes and could stand up to a lot of abuse, the Unicomp M I had seemed a bit weak when it came to spilled coffee.  My morning cuppa was it’s downfall ultimately.  Half the keys stopped working after that so I was forced to revert to a cheap, wireless backup keyboard until I could source a replacement.

Ultimately, I ended up with a Unicomp M of a slightly different design.  The new one is just a bit slimmer (it’s not quite as deep as the Classic M) and includes a TrackPoint built into the keyboard.  I had hoped that the TrackPoint would be the same as the IBM TrackPoint which were pretty solid pointer devices, once you got used to using them.  Unfortunately, the Unicomp parts are less well built, so the TrackPoint feels loose and inaccurate.  It’s annoying, and I don’t care to use it for anything needing precision, but it makes it easy to swap between console windows without having to reach over for my trackball, so I won’t complain too much.

I’ve now had four Model M keyboards.  They are arguably the best keyboards ever made, the design is ancient but still relevant, especially in this age of cruddy chiclet keyboards and non-feedback designs that have no soul.

Actually Useful Getting Started Guide to LXD on Ubuntu

OK, this will still be kinda brief, but hopefully helps get you going with LXC containers (via LXD) quickly in a way that’s actually useful.

I have typically used things like Digital Ocean and AWS to quickly launch a testbed, deploy some modified packages and, check the changes and then tear it all down quickly.  This works well for me but I’ve recently been trying to break my dependence on foreign services for this work.  So I’ve been using LXD more and more which is just as fast, and is local so I can do this sort of work without an internet connection if need be.  Below, I’ll outline a few very quick things to make using containers a bit more easy.  Note, all of the info below assumes you are using Ubuntu 16.04 LTS or later, with LXD installed (LXD is installed by default on 16.04 and newer).  Also, you should have at least some familiarity with lxc and lxd.  For more information on those, see https://linuxcontainers.org/lxc/introduction/.

Tip 1:  import images locally with useful aliases.

By default, when you launch a container, the image will be pulled from the internet if it does not already exist.  Also, if you want to use that container base again locally, you sometimes need to find an ugly fingerprint ID to reference it with.  I’ve prefer to locally import the images I want.  Not only does this let me create my own, easily remembered names for this, I can pull a variety of images from various sources and have my own local, off-line catalog of LXD images to create containers from.

First, see what images are available.  Since I do all my work on ubuntu, I only need to check the default ubuntu remote.  This is done with the ‘image’ command for lxc:

 

bladernr@galactica:~$ lxc image list ubuntu:
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| p (5 more) | 4c1e4092ead8 | yes | ubuntu 12.04 LTS amd64 (release) (20170417) | x86_64 | 156.78MB | Apr 17, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| p/armhf (2 more) | 68a83fae9fd3 | yes | ubuntu 12.04 LTS armhf (release) (20170417) | armv7l | 135.58MB | Apr 17, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| p/i386 (2 more) | 056784ac045d | yes | ubuntu 12.04 LTS i386 (release) (20170417) | i686 | 141.27MB | Apr 17, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| t (5 more) | 536ea2799fc7 | yes | ubuntu 14.04 LTS amd64 (release) (20170405) | x86_64 | 119.89MB | Apr 5, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| t/arm64 (2 more) | 26b9b1fb1b15 | yes | ubuntu 14.04 LTS arm64 (release) (20170405) | aarch64 | 110.96MB | Apr 5, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| t/armhf (2 more) | 5e367a0ad31c | yes | ubuntu 14.04 LTS armhf (release) (20170405) | armv7l | 111.58MB | Apr 5, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-----------------------------lets--------------------+---------+----------+-------------------------------+
| t/i386 (2 more) | 38df07c91eac | yes | ubuntu 14.04 LTS i386 (release) (20170405) | i686 | 118.24MB | Apr 5, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+

There are a LOT of images available so I’ve trimmed the output significantly.  I’m mostly interested in Trusty for now, which has the alias ‘t’, so let’s import that image locally using the ‘copy’ subcommand of the ‘image’ lxc command:

bladernr@galactica:~$ lxc image copy ubuntu:t local: --alias=ubuntu-trusty
Image copied successfully!
bladernr@galactica:~$ lxc image list
+---------------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+---------------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+
| ubuntu-trusty | 536ea2799fc7 | no | ubuntu 14.04 LTS amd64 (release) (20170405) | x86_64 | 119.89MB | Apr 24, 2017 at 10:58pm (UTC) |
+---------------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+
| ubuntu-xenial | f452cda3bccb | no | ubuntu 16.04 LTS amd64 (release) (20160627) | x86_64 | 310.30MB | Jul 15, 2016 at 5:55pm (UTC) |
+---------------+--------------+--------+---------------------------------------------+--------+----------+-------------------------------+lets

What this does is download a copy of the arch appropriate trusty container image hosted on the default Ubuntu image store and make it available locally on my desktop.  As you can see, I have both Trusty and Xenial images, with nice aliases that can be easily remembered later on when deploying containers.

I have the release versions of the images, that’s all I need.  Because I’m just prototyping and testing locally, I don’t really worry too much about the latest package updates being installed on my containers.

Ubuntu has two different remotes (streams) to get images from:

bladernr@galactica:~$ lxc image list ubuntu: |head -10
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| p (5 more) | 4c1e4092ead8 | yes | ubuntu 12.04 LTS amd64 (release) (20170417) | x86_64 | 156.78MB | Apr 17, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| p/armhf (2 more) | 68a83fae9fd3 | yes | ubuntu 12.04 LTS armhf (release) (20170417) | armv7l | 135.58MB | Apr 17, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| p/i386 (2 more) | 056784ac045d | yes | ubuntu 12.04 LTS i386 (release) (20170417) | i686 | 141.27MB | Apr 17, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-------------------------------------------------+---------+----------+-------------------------------+
| t (5 more) | 9e0493502f9d | yes | ubuntu 14.04 LTS amd64 (release) (20170424) | x86_64 | 120.03MB | Apr 24, 2017 at 12:00am (UTC) |


bladernr@galactica:~$ lxc image list ubuntu-daily: |head -10
+--------------------+--------------+--------+-----------------------------------------------+---------+----------+-------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+--------------------+--------------+--------+-----------------------------------------------+---------+----------+-------------------------------+
| p (5 more) | 12bb0982a94b | yes | ubuntu 12.04 LTS amd64 (daily) (20170424) | x86_64 | 155.64MB | Apr 24, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-----------------------------------------------+---------+----------+-------------------------------+
| p/armhf (2 more) | d95c2d1be3f8 | yes | ubuntu 12.04 LTS armhf (daily) (20170424) | armv7l | 136.64MB | Apr 24, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-----------------------------------------------+---------+----------+-------------------------------+
| p/i386 (2 more) | 4f516ec69c8f | yes | ubuntu 12.04 LTS i386 (daily) (20170424) | i686 | 139.71MB | Apr 24, 2017 at 12:00am (UTC) |
+--------------------+--------------+--------+-----------------------------------------------+---------+----------+-------------------------------+
| t (5 more) | 9e0493502f9d | yes | ubuntu 14.04 LTS amd64 (daily) (20170424) | x86_64 | 120.03MB | Apr 24, 2017 at 12:00am (UTC) |

The first of those contains only the “release” versions of the Ubuntu images.  That is, the versions that appear on each GA Release Day, or LTS Point Release Day.  The second, ubuntu-daily, provides images from the daily builds of Ubuntu, which are updated far more frequently.  This also gives you access to daily builds of the latest development / interim release such as the soon to be opened Ubuntu 17.10.

Tip 2: Configuring a user for easy login and actually getting work done.

The default Ubuntu images are missing two very important things, ssh keys and a default password for the ‘ubuntu’ user.  There are a few different ways to tackle this.  If a root access is all you need, then this will suffice:

bladernr@galactica:~$ lxc exec subtle-marlin /bin/bash
root@subtle-marlin:~#

This will get you a root login, but I often need to have a non-privileged login.  So the first thing we need to configure the user.  This is accomplished using cloud-init and can be set using the profiles for lxc.  Specifically, I’m setting this in the default profile.  To access/edit this profile, as of lxc version 2.0.7-0ubuntu1~16.04.2, you need to use the lxc profile command to edit the default profile and add a few things.

To edit it use the command lxd profile edit <name> (Note, this command may be different on other versions of lxc, such as lxc edit profile <name>.

bladernr@galactica:~$ lxc profile list
default
docker
juju-controller
juju-default

Note that there are several profiles already created by default.  We’re only interested in the ‘default‘ profile, so let’s edit that:

### This is a yaml representation of the profile.
### Any line starting with a '# will be ignored.
###
### A profile consists of a set of configuration items followed by a set of
### devices.
###
### An example would look like:
### name: onenic
### config:
### raw.lxc: lxc.aa_profile=unconfined
### devices:
### eth0:
### nictype: bridged
### parent: lxdbr0
### type: nic
###
### Note that the name is shown but cannot be changed

config:
 user.vendor-data: |
  #cloud-config
  users:
  - name: ubuntu
    ssh-import-id: bladernr
    lock_passwd: false
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
description: ""
devices:
 eth0:
  name: eth0
  nictype: bridged
  parent: lxdbr0
  type: nic
name: default

In that example, I have added modified the user.vendor-data section to set a few items for the “ubuntu” user.  First, I used ssh-import-id to import my own ssh keys.  I believe this pulls from launchpad, but it may pull locally.  I’m honestly not sure which.  Next, I set lock_passwd to ‘false’.  letsIf you leave this unset, it defaults to ‘true’ which will prevent password logins.  Of course, the ssh logins via key are MUCH more secure, but as I mentioned before, these are very short lived development instances, so security is of no concern to me, as proven in the next line.

On this next line, I tell cloud-init to setup sudo privileges for the ‘ubuntu’ user so that no password is required when performing ANY task via sudo.  That is about as close as you can get to using the root user instead.  It is VERY dangerous because anyone who gains access to ‘ubuntu’ now has full, unfettered root access.  So don’t do this at home.  Again, for my use, these are short lived test and dev instances where security is not important.  I would NEVER do this on anthing that is even close to production level.

In fact, on a production system you should probably consider leaving only the ssh-import-id set to only allow logins via ssh and key-based authentication.  You should definitely NOT set sudo as I have done here, also.

Finally, I set the shell to /bin/bash so when I ssh in, I’ll have a nice bash shell.

There are other items you can set in here, such as password, ssh authorized_keys, group membership and so on.  You can find out more about cloud config in the cloudinit documentation.

Conclusion

So there you go.  Those two tips should help setting up LXC/LXD to be much easier and less hassle when launching instances for testing your code, prototyping and other needs.  Please do remember that I do some fairly ugly things (security wise) and you should make better choices there for production.

Once you have those things configured, you should be able to quickly launch instances and connect to them via SSH and be able to perform whatever tasks you need.

 

 bladernr@galactica:~$ lxc list
+---------------+---------+----------------------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------------+---------+----------------------+------+------------+-----------+
| subtle-marlin | RUNNING | 10.148.80.232 (eth0) | | PERSISTENT | 0 |
+---------------+---------+----------------------+------+------------+-----------+
bladernr@galactica:~$ lxc launch ubuntu-trusty demo
Creating demo
Starting demo
bladernr@galactica:~$ lxc list
+---------------+---------+----------------------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------------+---------+----------------------+------+------------+-----------+
| demo | RUNNING | 10.148.80.217 (eth0) | | PERSISTENT | 0 |
+---------------+---------+----------------------+------+------------+-----------+
| subtle-marlin | RUNNING | 10.148.80.232 (eth0) | | PERSISTENT | 0 |
+---------------+---------+----------------------+------+------------+-----------+
bladernr@galactica:~$ ssh ubuntu@10.148.80.217
The authenticity of host '10.148.80.217 (10.148.80.217)' can't be established.
ECDSA key fingerprint is SHA256:gyn682YAhs+LyZc7i0s9akfBoZCOnSYErMeds4MbaKI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.148.80.217' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-70-generic x86_64)

* Documentation: https://help.ubuntu.com/

System information as of Tue Apr 25 13:30:23 UTC 2017

System load: 0.77 Memory usage: 0% Processes: 15
 Usage of /home: unknown Swap usage: 47% Users logged in: 0

Graph this data and manage this system at:
 https://landscape.canonical.com/

Get cloud support with Ubuntu Advantage Cloud Guest:
 http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

ubuntu@demo:~$

What grown man doesn’t want a sixteen year old girlfriend?

On the way home from a doctor’s appointment, I was rocking out to the 50s channel on SiriusXM. I grew up listening to 50s and 60s rock and developed a fondness for it early on. I can probably sing more 50’s songs than I can 90’s songs, truth be told. But one thing I also enjoyed about the “innocent days of rock and roll” was the amount of creepiness that pops up if you pay a bit of attention to the songs.

Case in point, “You’re Sixteen” originally sung by Johnny Burnette.  Right off the bat, we know he’s in love with a teenage girl who just turned sixteen, and we know he appreciates her… physical attributes:

You come on like a dream, peaches and cream
Lips like strawberry wine
You’re sixteen, you’re beautiful and you’re mine

So his now sixteen year old lover tastes like strawberry wine, and she’s all his, coming on like a dream, something about peaches and cream…  It sounds sweet.

You’re all ribbons and curls, ooh, what a girl
Eyes that sparkle and shine
You’re sixteen, you’re beautiful and you’re mine

This paints a slightly different picture, a young girl all “ribbons and curls”, but “ooh, what a girl”.  Does he prefer little girls all ribbons and curls, something traditionally attributed to children?

You’re my baby, you’re my pet,
We fell in love on the night we met.
You touched my hand, my heart went pop,
Ooh, when we kissed, I could not stop.

Now we see that she’s his pet, a bit of ownership there.  But they fell in love on the night we met.  The turn darker, because he’s singing about how she just turned sixteen, so presumably, they met and fell in love and there was a lot of kissing when she was much younger.  How much younger? We never really know, but certainly younger than sixteen.

thatsYou walked out of my dreams, into my arms,
Now you’re my angel divine.
You’re sixteen, you’re beautiful, and you’re mine.
You’re my baby, you’re my pet,
We fell in love on the night we met.
You touched my hand, my heart went pop,
Ooh, when we kissed, I could not stop.
You walked out of my dreams, into my car,
Now you’re my angel divine.

So at some point prior to her sixteenth birthday, she walked into his arms and she’s all his.  She’s his pet.  His baby.  Makes his heart go pop.  Again, lots of kissing with the 14 or 15 year old girl he’s in love with.  In his car… car.  She got into his car.  The plot thickens.  Given the innocence of the 50s, this sounds like a sweet tale of teenage love, two kids out for dates at the malt shop, seeing a movie, getting into her older boyfriend’s car and driving out to “Lover’s Lane” where I’m sure more than kissing was going on.  It’s sweet, and reflective of young love.  Until you realize that Johnny Burnette was 26 when he released this song.

Twenty.  Six.

Here’s a man of 26 years, singing of love for a girl who just turned 16, whom he’s been at least making out with since before she was sixteen.  And before you say that he’s just singing the song, someone else wrote it, that’s true.  It was written by the Sherman Brothers, who, if the song was written as late as possible, 1960, were even older than Johnny Burnette.  Johnny was 26 at the time he sang and released the song.  Robert Sherman would have been 35, and  Richard Sherman would have been 32.  So what exactly did two thirty year olds in the late 1950s know about kissing the strawberry wine lips of 14 and 15 year old girls?

(Note, the above is accurate, but meant to be somewhat tongue in cheek.  The world was a different place in the late 1950s and early 1960s, and this was the equivalent of modern teenage pop songs).

Getting started with Juju 2.0 on AWS

This is a bit of a first timers guide to setting up Juju 2.0 to work with AWS.  To be honest, it’s been quite a while since I really messed with Juju and AWS (or anything outside of MAAS), and this is the first time I’ve really looked at Juju 2.0 anyway.  So this is me sharing the steps I had to take to get Juju 2 talking to my AWS Virtual Private Cloud (VPC) to spin up instances to prototype things.

First, let’s talk about the parts here.   You should already know what Amazon Web Services is, what a Virtual Private Cloud is, and have an account at Amazon to use them.  You should know a bit about what Juju is as well, but as this is a first timer guide, here’s all you really need to know to get started.  Juju is an amazing tool for modeling complex workload deployments.  It takes all the difficult bits of deploying any workload that has a “Charm” in minutes.  All the brain-share needed to install and configure these workloads is encapsulated in the “Charm”.  To configure, you can pass YAML files with full deployment configuration options, use Juju commands to set individual configuration options, or pass them via the juju gui.  Juju is very extensively documented at https://jujucharms.com, and I highly recommend you RTFM a bit to learn what Juju can do. Continue reading

Lets get dangerous…

Here I sit, spitting off this quick missive before I get into my car and drive possibly into the end. We shall see. There’s less than 2% chance that anything will go wrong, and even farther less than that that the thing going wrong will see me shuffle off this mortal coil.

(Hint: if I do kick off, some friends of mine are about to inherit some pretty awesome stuff).

My brother needs stem cells. I have those stem cells. It’s as simple as that. So some nice surgeons are going to DRILL, BABY, DRILL! into my rear parts, and literally suck out all the marrow of life, or at least a couple liters of the marrow of life. I guess I won’t be going to the woods to live deliberately for a while.

If successful, I wake up, get some killer pain meds, and a week at home resting up and healing from having so many holes drilled into my body while THEY. DRINK. MY. MILKSHAKE!. If successful, my brother gets a stem cell transplant tomorrow from me, and he inherits the moustache gene, gets better and goes home to his family.

I had a career at one time being a lifesaver, an ALS provider on both county and privately operated ambulances. This is just a natural extension of that, I guess. I, the guy who still carries a stocked trauma kit, who still stops to render aid to strangers. I, who have faced death and said “Not today.” Now I go forward once more so that others may live.

So here’s to hope. And here’s to being completely knocked the fuck out while my ass is being drilled.

Once more unto the breach, dear friends, once more.

Also, check out James’ blog:  thejameslane.rocks

 

So it’s time to say Goodbye, yet again…

Faith at the BeachIt started innocently enough.  Faith had had decreased appetite when we were at the beach and at the time we attributed that to her not wanting to stand on a slick, hardwood floor to eat (she is old, and weak, and so keeping her legs under her on a slick surface is a chore).  But when that continued after getting home, we took her in after realizing some of her back teeth had rotted to the point of being painful.  It seemed simple enough, she’d go on antibiotics and pain meds for a week to clear up any tooth infection and then we’d take her in to be sedated and have several teeth removed.

This morning, I dropped her off at the vet.  The vet called me back a lot faster than I expected.  As part of the pre-op routine, they ran bloodwork and found that her liver enzymes were out of spec by a significant amount.  So that led to a full liver panel and an ultrasound.

I just got the call with an update and the news is as I had feared.  She has definitive tumors all over her Liver and Spleen.  This is exactly the same diagnosis that Jazz got when Jazz stopped eating.  Funny coincidence, since Jazz was one of Faith’s puppies.  Mother and Daughter, dying from the same cancer, but this one much more definitive.

That means there is only one option, so with a very heavy heart, as I listened in on a work meeting with one ear, the phone with the vet pressed to the other, I made the decision that it’s time to let her go.  We’ve scheduled it for Monday afternoon, here at home.  We took Jazz to the Vet office to have it done and that was a mistake.  Faith mourned her disappearance for a long while, and the other dogs seemed off as well, noticing that I took Jazz away and never brought her home.  Now, not even two months removed from that loss, it’s time to suffer loss once more.  It’s time to say goodbye again.

On Monday, Faith will end her suffering, here at the only real home she’s ever known while being surrounded by the love of our diminished pack, hopefully with Jazz, Patches, and Jack ready to guide her to the bridge on the other side.

Jazz and Faith

Jazz and Faith on the last day they were together. They’ll soon be together again.

They had named her Jazz…

 

image

Our last evening together

The trees rushed by the window in a blur of browns and greens topped with the myriad shades of grey that make up an overcast sky.  We sat in the car, my arm around her, holding her tightly to me as we both watched the cascade of colors racing by.  She barely had the strength to keep her head lifted, but she did.  The ride passed in silence, each passing tree trunk a marker counting down the minutes and seconds of life. The past paraded by amidst the dancing colors outside the glass and that’s where we journeyed: back to the beginning, over twelve years ago.

Faith was a good dog.  An Alaskan Husky, she weighed no more than thirty-five pounds with a soft, thick coat.  She came to us out of nowhere, one of those random, stray mutts that just shows up one day and refuses to leave.  In fact, her persistence is how she got her name, but that’s a story for a different day.  For today, all that matters is that Faith was here, and she was about to get spayed.  Unfortunately, she managed to slip her collar and get herself knocked up by our resident rogue, known only as “Brown Dog”, just days before her appointment.  So instead of being spayed, she carried several wriggly puppies to term and gave birth in our home in January of 2004, and that’s where our story begins.

It was cold outside, I remember that much.  A frigid winter afternoon and Faith, fat with a litter of pups, started yelping and bleeding and to be quite honest, it was terrifying until the first puppy popped out and we realized what was happening.  We quickly moved her into the utility room on an old blanket and set up an electric space heater to keep her warm on a floor that was easily mopped.  Out they came, one at a time, a hodgepodge of little, wiggly furballs.  Two were brownish but the rest were almost pure black with the exception of some stark white markings.  This particular one was solid black save for the very tip of her tail which was pure white.  For the time she was with us, her name was “White-Tipped Girl” and she was my favorite of the litter.

As the weeks passed by, the puppies grew and began to explore and found their legs and strength until it was time to find them forever homes of their own.  One-by-one, each puppy was taken in by a family we had found, including my little white tip girl, and our home was quiet again.

puppies

Puppies!

It was several months later when the family that took her called us and took us up on our standing offer.  As each one was adopted out, I told the adoptive families, “If, for any reason, this doesn’t work out, call me any time and I’ll come take them back with us.”  To this day, only one family asked us to take a pup back, we can only speculate and hope that the rest of the pups had long and fulfilling lives.  I rode into town the next afternoon and remember feeling so bad that I was taking the puppy back.  The kids weren’t supposed to be home, yet there was the son, greeting me as I got out of my vehicle, wondering why I was there.  I left it to his mom to explain why I was taking his new puppy away, along with the dog house she had been living in.  It was up to them to explain that they had failed to mention getting a dog to the landlord, who made them give her up.  It was up to them to convince their kids that the dog was going to somewhere safe.  I still felt like crap for doing it in front of him, but once loaded, I turned for home and never looked back.  My White-Tip Girl was sitting in my lap, licking me and nuzzling. They had named her Jazz.

I will admit that this is where I really failed her.  Since she’d been an outdoor dog thus far, I didn’t feel too bad for putting her back in the kennel where the puppies had stayed until they had been adopted out, but later on in life I would regret this time, because it was really more a matter of convenience for us than a practicality.  We already had four dogs and three cats in the house and there was just not enough room in the inn.  So for the next two years, Jazz lived in her kennel, in a warm dog house with fresh water and food.  We’d play with her, walk her, socialize her with our other dogs, but at the end of the day, she’d go back to her kennel and the rest would go inside.  I do hate myself for that time in her life, but she was never neglected, and to be honest, I think she enjoyed being out in the fresh air, with birds, rabbits, squirrel and deer for company.

Two years later, we lost Jack, our Border Collie / Lab mix and moved Jazzy into the house for good.

JazzThe rest of her life was fairly uneventful, and that’s good for a dog.  I finished fencing in an area out back for the dogs to run without risk of running off, so they could spend their days playing in the sun and chasing critters, barking at every noise and movement.  Then at night, we’d all huddle in our cave together, sheltering in the dark until the next morning.  Dana and I would work our jobs and on vacation, they would all head to the Doggy Day Camp where they’d spend a week socializing with several other vacationing dogs and we’d spend our week doing whatever it was we did on vacations back then.jazzy-yard

Jazzy grew into a beautiful dog.  Solid black and lean, she never weighed more than about 50 pounds.  Her father, the infamous “Brown Dog” looked like a German Shepherd mix of some sort, and she inherited that look from her dad.  As she grew, her white tip faded and she became a solid black GSD looking dog with a face shaped like a Husky.  She had the same soft, thick fur and twice a year like clockwork, her undercoat would fall out in giant clumps all over the house.  Her bark was fierce and her low, ominous growl at strangers was enough to give anyone pause as they approached our door, but the few who were invited in quickly realized that she was the classic case of all bark and no bite.  She was the sweetest, most gentle and tolerant dog I’d met.  She loved everyone and really wanted nothing more than to have that space behind her ears scratched, or her belly rubbed if she really liked you.

She was the only dog we’ve ever had that probably could have made a good guard dog, and she kept us safe from all threats, real or imagined.

I remember one night we took her for a walk out on Sunset beach.  We walked about half a mile or so along the shore and sat down in between dunes with Jazz and Patches.  We sat there in the dark enjoying the stars above and the sounds of waves crashing in the darkness ahead.  We drank daiquiris and joked while watching families walk up and down the waterline with flashlights and buckets trying to catch the crabs that would run around onshore feeding in the ebb and flow of the ocean.  At one point someone approached us a little too close, and Jazz let out a low, barely audible rumble.  At that point she was almost invisible from more than a few feet away as we were sequestered in the darkness on a moonless night.  The person approaching us let out a yelp and quickly went around us, despite our laughing and promising the strange shadow that Jazz was actually gentle and just startled by the movement.

When we’d take her to the big Flea Market out at the Raleigh Fairgrounds she was the delight of everyone who met her.  She was horrible on a leash, mind you, but eventually she’d settle in as best she could and was always ready for a scratch or a treat from some passing stranger and everyone wanted to feel her fur it seemed.  We didn’t do that too often though.  She was a solid black and thickly furred dog, so keeping her cool was not an easy job.

jazz-kitten

She was such a gentle soul, especially around our foster kittens

I like to think that she loved living with us.  We certainly loved her, soft and cuddly and easily the most huggable dog we’ve ever had.  She had a way of just laying her head on your knee and staring at you with her big brown eyes that just forced you to scratch her behind her ears, easily melting away any frustrations or anger or stress you had.  When she was excited, she’d wiggle and dance and hop around, even until just shortly before the end.  At the ripe old age of 12, she was still a bouncy, pouncy, roly-poly puppy.  She never really got into toys, and wasn’t even very food motivated.  She was stubborn but loyal, loving and kind.  She knew her pack and protected them the best way she knew how.

Just after her 12th birthday, in January of 2016, is when things started to fall apart.  She started vomiting after meals.  At first it was just every now and again, but soon became almost every meal.  Sometimes she could hold in the morning meal but would lose the evening meal, sometimes neither would stay down.  Thinking she was just making herself sick, she had a penchant for eating dirt in the garden, we altered her food amounts and she quickly started shedding weight.  When we took her to the vet, the inevitable happened.

After a consult and an ultrasound, we were told Jazzy had growths on her liver, her spleen and elsewhere in her abdomen and fluid was starting to collect there for some reason.  We came home with some nausea medicine and advice to consider taking her to N. C. State for a lengthy and expensive surgery that would simply biopsy whatever was in there.  We waited a week until the nausea pills ran out and then headed back for a follow-up and second opinion from the more seasoned vet at the practice, the one we’ve taken all our animals to for nearly 15 years.  After a second ultrasound, the second opinion was worse.  Things were bigger, there was more fluid.  She could have days, weeks or months.  We could still go to N. C. State, but even if we had the week before, there was really nothing that could be done beyond confirming what we were already 90% sure of.  She had cancer and was dying.

That week simply painful.  I knew what was coming, and I knew what I had to do no matter how much I didn’t want to do it.  We had more medicine for her and that helped to keep her food down until she finally decided she’d had enough.  The day she stopped eating was the day I made the call.

our-packI admit, I’m selfish.  I wanted nothing more than another month.  Another week.  Another weekend.  I just wanted to recreate that scene from Star Trek: Insurrection where Picard is shown how to take a moment in time and slow it down so it lasts forever.  I wanted nothing more than to wrap my arms around her and make that day last forever.  But wishes and wants are seldom really fulfilled.  I made the appointment for Monday, giving us one last weekend together.  But by Friday, it was evident that Jazzy was ready to go.  It broke my heart to make that call, asking them if the vet could come to the house Friday evening or Saturday morning to send her on her way.  But no, even that couldn’t happen.  The only thing we could do was take her to the vet’s office.  No house calls on that Saturday.

And this is where I felt the worst.  For Patches and Jack, we were able to have the vet come out to us so they could die at home, surrounded by familiar smells and faces, basking in the warm sunlight, lying in the soft green grass.  For Jazz, we’d have to drive her into town so they could do the job in a cold, clinical setting.  jazzy-bed

Her last full day was fairly uneventful.  She wanted to be outside more than in so I let her stay outside most of the day.  She’d lay in the sun snoring, or sit at attention, ears alert for sounds only a dog can hear.  She neither barked nor growled.  She just sat there mostly, taking it all in as though she knew the end was near and she wanted to see, smell, hear and feel as much of her world as possible in these last few hours of life.  At dinner time she ate a few bites of boiled chicken but the rest went to the other three dogs, seemingly oblivious to what was going on around them.  I wanted that day to last for a month, but it had to come to a close.  Jazz laid down at the foot of our bed one last time, where she had guarded us for so long, protecting us from the bogeyman and shadows and cats.  I lay with her, across the foot of the bed, curled up so I could reach down to intertwine my fingers in her thick fur, to feel her warmth on my skin and her chest rise and fall in slumber.  And we slept like that the night through.

At 6am I awoke and she shot up, eyes bright, ears perked, alert and ready for whatever was to come.  Seeing it was just me stirring, she huffed a bit and laid back down until I got up and padded out into the kitchen.  She followed me out, passing me by and heading straight for the door.  I opened the door to the morning rays and crisp, moist air and she took up her place on the ramp leading off the deck, sitting at attention, listening to the birds sing their morning songs while the wind gently bent branches and rustled leaves.  I fixed a cup of coffee for myself and came out to sit with her on the deck and we sat there together in silence as the air warmed around us, listening to the cacophony of nature in all her beauty and glory.jazzy-hug

 

I sipped my coffee and Jazz just observed the world around her.  I got up and took some pictures and she watched the clouds move overhead.  I got dressed and the time passed by more quickly than before and she sat, alert to every buzz and bump and screech and chitter.  At 8:00 am I began feeding her valium hidden in lumps of peanut butter.  She greedily licked the gobs of peanut butter from my finger, never realizing that each one contained another dose of sedative. With each pill I felt as though I was betraying her anew, drugging her against her will.  With each pill it became harder and harder as my eyes filled with tears and the sobs started to come over me.  With the final pill delivered, I sat back down with my White Tipped Girl and whispered in her ear what a good dog she was.  I put my arm around her and hugged her tightly, crying into her soft warm fur, listening to her breathe.

jazzy-jeffThe drugs started to kick in.  She became dizzy.  Her head drooped now and again and she became weak.  It became harder and harder for her to stay upright.  Her strength waned and her feet slipped.  I leaned into her, propping her up with my weight, resting her head on my shoulder.  I held her tight and told her I’d hold her up.  I’d be her legs and I’d be her strength.  I told her I’d carry her the last mile, I’d be with her until the end.  I cried and I cried as she trusted me to keep her from falling and then it was time.

I picked my Jazzy girl up in my arms and carried her back into the house.  She was weak, but still alert, still observant.  The other dog still didn’t know what was happening as I carried her through the door and out to the car.  Dana had arranged a bed in the back of the car for her, but at the last minute I knew she needed to be next to me so I had Dana reset the rear seats and I gently sat into the back of the car with my girl and I held her close the whole way.

The trees rushed by the window in a blur of browns and greens topped with the myriad shades of grey that make up an overcast sky.  We sat in the car, my arm around her, holding her tightly to me as we both watched the cascade of colors racing by.  She barely had the strength to keep her head lifted, but she did.  The ride passed in silence, each passing tree trunk a marker counting down the minutes and seconds of life.  The trees gave way to light posts and buildings as country became town.  The smooth Rrrrrrrrr of tires on pavement became the crunch of gravel as we pulled into the parking lot.  The three of us sat there in the car watching the clock tick closer and closer to 9:00.  The appointed hour was on us and Dana went in to announce our arrival.

The vet techs had cleared a room for us and laid out a ratty old blanket for Jazz to lay on.  At least the floor would not be so hard and cold.  She stretched out weakly, the valium having put her into a stupor at this point, and we laid down with her on this blanket, tears in our eyes while just on the other side of the wall were the sounds of a busy vet practice, barks, growls, meows and howls.  People conducting business.  Laughter.  Life.  It made me angry, to be honest.  She deserved peace when she died.  She deserved a warm breeze and soft grass and close friends and family.  Instead she got a room in a clinic, cold, medicinal and methodical.

The staff was great, don’t mistake my anger at the situation for anger at them.  As always, they treated us with care and compassion.  It was just the part of me that rebelled against bringing her here that was lashing out.  The part that wanted her to have the perfect ending to a not always perfect life.  Jazz rallied her strength and fought through the druggy fog to turn her head to look first at Dana and then at me.  Her strength gone, she laid there using her reserves to be what she always was.  Alert.  Aware.  My Jazzy died staring into my eyes and I cried again.

It wasn’t until today, a perfect pre-spring afternoon, as I rode my motorcycle into town to collect her ashes from the vet’s office that it finally occurred to me.  I HAD given her the perfect ending.  She was with the two people who loved her most in this world, and the very last thing she saw was the love and pain in my eyes.

image

Jazzy is home…