CBlog(handziuk)

Bradley Handziuk's blog

Chicken Coop Lessons Learned

If you didn't see the previous multi-part blog post series, we built a chicken coop and are living with 5 chickens. They are healthy and happy but there a several things I'd do differently if I had to do it again 9which I likely will when we move).

Door construction

Make-shift doors (that is doors made from 2x4s and ply wood and not a typical panel door) should be made with the 2x4s oriented in the skinny direction not the wide direction. Making them the wide way for the frame means the door will probably not swing properly.

Door-floor elevation difference

Door access should have been elevated/the floor should have been recessed. Because we would like to do the deep litter method except I made the doors flush with the ground I ended up needing to install some boards in the doors to contain the litter from spilling out. It works ok but will not contain a 12" deep litter like some people do.

Nest box location

The nest boxes should be on the exterior/physically separated from the roost area. Where they are right now is OK except that we needed to add a little roof over the one nest box where the chickens have chosen to lay their eggs because the roost is right above it and if we didn't put something there they'd just poop all over their nest box in their sleep. The extra roof is slanted but has some sticks on it for traction so the hens don't slide off when trying to get into the roost.

Somethings stay the same

Then there are some thing's I'd do the same because I really liked how it turned out.

Chicken door opening mechanism

Two things I really like about the chicken door opening mechanism. One is the rope I used. We tried several things before landing on the thick nylon rope like sisal (scratchy on your hands and abrasive), picture hanging wire (not meant to have the friction of going around bends), and thin nylon rope (difficult to pull on because it was so thin).

Ultimately the thick nylon rope could be tied off on the clean easily, was easy to pull because the diameter of the rope did not dig into your hand, it was tough and doesn't wear that easily from rounding the bends. The whole mechanism

Exterior clapboard

I really like how the exterior looks. The only minor change I'd make here is I'd try to find some more old fence board for the one wall where we ran out to match the the pattern everywhere else. Not much I could do about that though. 100% of the tree house fence board was used.


Chicken Coop Project Part 2

Disassembling the tree house

I was very lucky that a recent storm blew down a tree in my co-workers yard. That tree contained a tree house he'd built for his daughter many years ago. Also, lucky for him the tree/tree house did very minimal damage to his house.

Emma and I went over on a Saturday and disassembled the tree house and brought it home. I was shocked how much wood we were able to fit into my little Honda Civic. This pictured doesn't do it justice but everything that's in the driveway was the first car load. The body of the car was stuffed and the roof was totally laden with wood. In the trunk is the second load which is the rest of the tree house and a trip to Home Depot. So also included are 6~70 lb 12 in x 12 in x 8 in concrete blocks, 6-60 lb bags of gravel, a roof full of 4x4s, as much cedar fence board as I could fit in the car and lots of other miscellaneous stuff. The car was sitting low on that trip.

Breaking Ground

With most of the supplies ready at hand we decided for sure where in the yard we wanted the coop and started making it so. The first step was getting the foundation level. What I'd seen in many other people's coops when doing the research was that people used a foundation of cinder blocks on top of which they'd build the coop. I wanted to avoid doing that for two reasons

  1. The ground was so not level and making a perimeter of cinder blocks would mean trenching out lots of ground. Digging and checking of level and checking if square. That didn't sound like a lot of fun.
  2. We wanted to maximize the amount of usable space for the chickens and if we are able to elevate the coop then the chickens can walk underneath it too. This gives them another 20 square feet of space to play in during the day. If the coop rested on the cinder blocks this would not be possible.

So instead we have the 4 corners on level, square concrete blocks. Underneath the blocks is about 60+ lb of compacted gravel. Two of the blocks are dug into the ground about 8 inches and the other two are basically resting on the surface.

Squaring them up meant measuring the distance from each corner to the nearest neighbouring corner and the diagonal. As soon as all those were equal it was square. Making sure it was level was a lot of putting a 2x4x8 board between the corners, resting the 4 ft level on it then sprinkling some gravel under the low corner.

Framing

This being my first time making such a big structure I wasn't 100% sure how to go about it. I didn't want to frame it like a house per se because I only have so much money and it's a chicken coop but I also wanted it to be strong. Many of the chicken coops I saw were made out of much flimsier material that what I had in store. They'd be framed from 2x2 cedar and the "walls" are 1/2 inch cedar boards. I suppose this is sufficient because many, many people use coops like that without issue.

Because I have all the scrap wood from the tree house available I thought I'd meet in the middle. The corners are framed with 4x4 pressure treated (except 1 corner is 2-2x2 studs because I ran out of tree house 4x4 scrap of appropriate size). The floor is 2x6 joists.


After the verticals and the floor joists were set the floor went in. It was two pieces of tongue and grooves 3/4 inch plywood. The joint between the two pieces is on one of the joists. After the floor was screwed in the verticals got a little more sturdy. If you push on them though they are still very wobbly.

The walls went up mostly all from the tree house. I had to buy a few studs for one of the walls. You can see the fresh wood in that back right wall. there i something unique about each of the walls. The largest wall (back left) will have a window . The smallest wall (front right) will have the nest box doors. The far angled wall will have the chicken sized door providing chicken access to the run during the day. The left angles wall will have the large, human sized door providing access to the inside for cleaning and checking up on the birds.


Getting those angles right was tricky. Whatever mismatched cuts of wood you can see here though will be well hidden by the time it's done. Pushing on the corners shows the whole thing is still kind of flimsy but only on the diagonals. Pushing straight into the wall is pretty solid but the diagonals are shaky.


I needed to purchase some new pressure treated 2x4 for the roof frame. The roof plywood is the same as the floor; 3/4 inch tongue and grooved. I didn't put anything on the left and right edges of the roof. I don't know why I didn't.

During construction we had a little visitor. This pretty Blue Heron would come by every one and a while and sit on the roof of our house leering down at the pond. This picture was taken through our binoculars. I'm always impressed that works.

Getting the Chicks

During the framing we also bought the chicks! We bought 6 chicks form Portage Bay Grange

Taking pictures was hard because they were under a red heat lamp 100% of the time while they were young but rest assured they were very cute.


We decided on the breeds because of what we read in the My Pet Chicken Handbook book. There was a whole chart about the benefits and pitfalls of each of the breeds. We got a mix of docility, winter heartiness, winter laying rate, general laying rate and some other factors.

Next time I'll talk about finishing the coop, making the run and watching the chickens grow up.


Seattle Uraban Farm Tour Surprise!

For weeks now Emma has been holding in a surprise event for this weekend. The weekend is here and she actually didn't spill the beans. We left the house and I had no idea what we were doing until we got to the mysterious event. It turned out to be  an Urban Farm Tour by Seattle Tilth!

We biked to the first place, which makes chicken coops and got lots of great questions and conversation. A great precedent to start for the day. Everyone was so nice and friendly and doing basically what we are doing.  


Us on the tour

There were so many things people were doing which we had eithe not thought to do or were too lazy to implement but it turned out would be really useful/big time savers, such as:

  • Nipple waterer. Not having to fill up/clean their watering container every 2 days would make life way way easier.
  • Mulch. Another great idea we saw: mulch instead of straight bare, dry dirt on the bottom of the run. We thought we should be doing something but mulch is kind of pricy for that much. Gives the chickens something to dig in, keeps moisture and thus little worms/grubs around longer too. One lady suggested The Dirt Exchange in Ballard where we can get a cubic yard of arbor chips for less than 30 $.
  • Drip irrigation. Another thing that is constantly on the list of things to do but never done. We'd probably need a pressure reducer, an extra valve, and some splitters splitters to make this happen in out yard.
  • Soil/rock screen (made from chicken wire doubled up). Our garden beds get full of rocks somehow. We need to screen them.
  • Linoleum for chicken floor.
  • Anti bird netting for fruits etc.
  • Temporary chicken run scroll. 2-2x3s
  • Dead grass as mulch for the garden beds. Perfect for this super dry weather we've been having.
We have our work cut out for us. Over all we learned a lot, biked 19 miles, and got to talk to lots of great people. Good day!

Chicken Coop Project Part 1

We live in a duplex and, together with our upstairs neighbour, decided to get some chickens. Emma and I had thought about it before but thought it would need to wait until we had a place of our own. But, with our upstairs neighbour on board and, together, we have a large accommodating yard for a chicken coop and run the situation seemed good enough. We did the research on what it would take to make it happen and asked the landlord. He was a-ok with it. So we begin!

This post is just about our pre-planing research we had to put in to figure out just where to begin and since this was all happening in January and it is now May (finally some time to write) so I have some power of hindsight.

First we had to figure out if having chickens is even legal in Seattle. Some places it isn't. But in Seattle

The keeping of small animals, farm animals, domestic fowl and bees is permitted outright in all zones as an accessory use to any principal use permitted outright or to a permitted conditional use, in each case subject to the standards of this Section

Where the Seattle law specifically addresses chickens it says

Up to eight domestic fowl may be kept on any lot

The biggest catch is you can't keep a rooster at all. This is sort of the hardest thing to accommodate because it is unknown what sex the chickens are when you buy them as chicks. They try to determine the sex at birth but it is a hard task and they can get it wrong often. You very well may end up with several males which you would either have to "get rid of" on your own or, if you're lucky about the place from where you purchased them, that store might be able to re-home them.

Location Planning

We planned out a few possible locations in the yard. We wanted to maximize the amount of space the chickens would get and minimize the amount of walking/effort needed on our part for maintenance. This means we wanted then to be pretty close to water and possibly electricity. Water because obviously they need water to survive and electricity because we thought they might need to have the coop heated in winter.

We gave up pretty quickly on the electricity idea. It meant modifying the property too much and as a rental that was just going to be too big of a hurdle. Plus we came to the realization that the coop only needs to be heated in extreme cold. Emma's dad's coop isn't heated and he lives in Pennsylvania. It gets decently cold there and certainly colder than here. I think they'll be fine.

The water is close enough. The water only needs to be changed out every 2-3 days so it's not that bad of a walk and the hose is usually out for the garden anyway.

We did need to be careful that the coop was not placed too close to the house or built too large

Structures for urban farm use may not exceed 12 feet in height, including any pitched roof.

and

Structures housing domestic fowl must be located at least 10 feet away from any structure that includes a dwelling unit on an adjacent lot.

Given out yard this is easily accommodated.

Design

At this point I was really excited. I read lots of websites looking for chicken coop design inspiration, Emma and I picked up a book on raising chickens, and I god busy trying to design something. 

From what I was reading there are a few key considerations when designing a space for chickens

  • Ventilation is key. If the chickens are locked in their coop in the cold winter and the air is moist they are very susceptible to health issues. Well ventilated but not drafty.
  • Exterior egg access. You don't want to be entering the coop and walking right in bird poop/dirt every time you go to collect eggs. An exterior accessible egg hatch seemed important.
  • Exterior controlled chicken access door. Same logic as the eggs but for their door (the one which will lock them in at night). If you need to go into their space to lock them up every single day it is going to get annoying for the chickens and annoying for you. The easier and faster chicken chores can be completed the better.
  • Good cleaning access. Some coops i saw were very small and it seemed like cleaning them meant being hunched over and either crawling in the chicken litter or getting just too close for comfort. Again, the emphasis in on easy maintenance. The fast you can finish the chicken chores the more likely you are to do them.
  • Chickens need space. The general rule of thumb seems to be chickens need 4 ft2 per chicken for interior space and 10 ft2 per chicken of exterior space.

With those basic bench marks in mind I got working on a design. I used Google SketchUp to draft up a design.

I tried to us this as a basis for my budget and construction but this was by no means how it accurately turned out.and my budget was was under estimated. But, that's the way it goes.

Next time I'll talk about breaking ground!

Use SQL Developer to query Access

Writing queries in Access can be ugly because it doesn't save any of your formatting. Well it does but then if you make any change in the designer it messes it all up again. Either way it can be a real pain to write queries in Access and view results smoothly in a sort of more robust program style (like SSMS) where the results appear below your query as opposed to opening up a new view where you can only see your query or result and not both at once.

In comes Oracle's SQL Developer. It provides all that for Access.

There are a few catches:

  • You need to install a version of the Java Development Kit (JDK) which is in the 1.7.X range and for "Windows x86". Newer versions in the 1.8.X range are available from Oracle but they are not supported by SQL Developer. When you install a newer version SQL Developer will open and will connect to an Oracle DB but you will not have the option to connect to an Access DB. The option won't even show up in the Connections dialog.
  • You need to use the "Windows 32/64-bit" version. There is a 64 bit version ("Windows 64-bit") available but because SQL Developer relies on using ODBC for connecting to Access and since Access is 32 bit there is only a 32 bit ODBC driver provided by Microsoft. The 64 bit version gives you the option to connect but will give the error 
[Microsoft] [ODBC Driver Manager] data source name not found and no default driver specified

Install the JDK first, get the installation path of where it installed (probably something like C:\Program Files (x86)\Java\jdk1.7.0_75), then install SQL Developer. The SQL Developer will probably prompt you for where the version of the JDK you want to use is.

After installation you can add your connection to Access. Click New Connection...

Name your connection, click to the Access tab, navigate to your mdb/accdb file, then click Connect.

You should now see the tables and view in your database in the connections window

You can look at table data by clicking on the table. You can look at query data by Select * from yourQuery.

You can make new queries like

CREATE VIEW MyNewView AS
Select * from Table1

If you want to ALTER Access doen't use the ALTER VIEW syntax so you need to DROP and CREATE again. However it also doesn't call views VIEW, it calls them TABLE. So if I wanted to change MyNewView I'd have to do it like

DROP TABLE MyNewView 
CREATE VIEW MyNewView AS
Select * from Table2

You can save out your queries as .sql files so they don't clutter your database.

I have not seen away to grab the existing definition yet.

New struts on my 2003 Civic

I went to get an oil change back in August or September.

Side tangent: I don't really remember and I don't have a record of the oil change because I had a coupon for a free oil change but I figure it was about then. You can see that I don't drive much recently. I used to log every single time I put gas in the car and the mileage at the time but now that I don't drive much I forget to do it when it does happen.

I guess I could trace this back using my insurance which tracks my car. And, actually as I write this I did exactly that. I searched the GPS logs and found I got the oil change on August 16, 2014.

Anyway, returning from the tangent. When I went to get the oil changed they told me that while they had the car off the ground they noticed the front left strut was leaking. They wanted to replace the pair in front, including the springs, for something like 470 $. I think that was the labour only charge. The parts are about 350 $. So that was going to be very expensive.

I did some research and figured I'd brave the risk of compressing a spring myself. Then I discovered these little gems. They are the complete strut assembly with no need to compress the spring myself. And they are only 5 dollars more than the strut alone with no spring.

I went to pick them up from O'Reilly and got 20 $ gift card for spending 335 $ on parts.

I picked a beautiful rainy Saturday afternoon to actually undertake the project. The tools needed were

  • Ratchet with extension bar (3/8" drive)
  • Breaker bar (1/2" drive)
  • 19 mm 1/2" drive deep socket for getting the wheels off
  • 10 mm, 12, mm, 14 mm, 15 mm, 17 mm, 19 mm sockets
  • 7/8" wrench (but I probably should have used a 22 mm wrench but I don't have one of those)
  • 1/2" to 3/8" drive converter
  • Pliers
  • Flashlight
  • Jack stands
  • and of course, a hammer

After I got the wheel off taking the old strut assembly off was simple enough. There is a bolt keeping the brake hose attached and a bolt keeping the ABS line attached (yellow arrows). Those both need to be taken off so they don't get in the way when you separate the steering knuckle from the strut.

There are two large bolts keeping the knuckle on the strut (4 horizontal arrows). One side of the bolt is a 19 mm and the other side I used the 7/8" wrench. These are pretty big bolts.

After those were out I loosened the 3 nuts under the hood but didn't remove them.

Only one nut left: the tie rod nut. The nut came off easily but holy smokes did that bolt not want to come loose. I gently hit it with hammer at first. then sprayed some penetrating solvent on it, then hit it with a hammer some more. I had to go look up some videos at this time to see how hard I can actually hit this thing. It turns out it is hard and a lot. I then unleashed a few really good whacks and pop! it came out. That was about an hour right there...

Once the tie rod was free I stood up, held the strut below, finished loosening the 3 bolts under the hood, and grabbed the strut as it fell free.

Putting the new strut assembly in place was just the same steps but in reverse. I tightened the top bolts evenly but planned on fully tightening them down again when the car is back on the ground.

The other side was much smoother. Everything came apart easily. The only complication this time was putting the tie rod nut back on! The nut got a little tight then just spun the bolt in the tie rod's universal joint. I put it on and took it off many times and eventually it just worked. There are better strategies to this other than just getting lucky but I own none of the tools needed to make the task smoother (i.e. tie rod clamp).

Once both sides were complete I noticed the top bolts were different metals which was odd. Oh well.

That was very fun.

This whole process definitely messed up the alignment which fixing is not a task I am up for. The car drives straight and generally stays straight (about as straight as before) but the wheel is cocked at about 10 degrees.

What is Shell.Application.Namespace input parameter thinking?

I'm trying to work with the shell.application object to unzip some files but am having trouble passing in a file path parameter as a string. I notice that when I pass in my file path as a variant it works but a string only works sometimes.

I came up with these test cases but so not see an obvious pattern.

Sub TestShellPaths()
    Dim oShell
    Dim oTempFolder
    Dim aVariantPath
    Dim aStringPath As String
    Set oShell = CreateObject("shell.application")
    aVariantPath = Environ("temp")
    aStringPath = Environ("temp")
    
    Debug.Print TypeName(aVariantPath)
    'String (but really Variant/String according to Locals window)
    Set oTempFolder = oShell.Namespace(aVariantPath)
    Debug.Print "oTempFolder.Namespace(aVariantPath) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(aVariantPath) worked?  Yes
    
    Debug.Print TypeName(Environ("temp"))
    'String (and actually is String according to Watch window)
    Set oTempFolder = oShell.Namespace(Environ("temp"))
    Debug.Print "oTempFolder.Namespace(Environ('temp')) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(Environ('temp')) worked?  Yes
    
    Debug.Print TypeName(aStringPath)
    'String (and actually is String according to Locals window)
    Set oTempFolder = oShell.Namespace(aStringPath)
    Debug.Print "oTempFolder.Namespace(aStringPath) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(aStringPath) worked?  NO :(
    
    Debug.Print TypeName(CStr(aVariantPath))
    'String (and actually is String according to Watch window)
    Set oTempFolder = oShell.Namespace(CStr(aVariantPath))
    Debug.Print "oTempFolder.Namespace(cstr(aVariantPath)) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(cstr(aVariantPath)) worked?  Yes
    
    aStringPath = aVariantPath
    Debug.Print TypeName(CStr(aStringPath))
    'String (and actually is String according to Watch window)
    Set oTempFolder = oShell.Namespace(CStr(aStringPath))
    Debug.Print "oTempFolder.Namespace(cstr(aStringPath)) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(cstr(aStringPath)) worked?  Yes
    
    Dim fso As New FileSystemObject
    Debug.Print TypeName(fso.GetFolder(aStringPath))
    'Folder (but really Object/Folder according to Watch window)
    Set oTempFolder = oShell.Namespace(fso.GetFolder(aStringPath))
    Debug.Print "oTempFolder.Namespace(fso.GetFolder(aStringPath)) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(fso.GetFolder(aStringPath)) worked?  NO :(
    
    Debug.Print TypeName(fso.GetFolder(aStringPath).Path)
    'String (and actually is String according to Watch window)
    Set oTempFolder = oShell.Namespace(fso.GetFolder(aStringPath).Path)
    Debug.Print "oTempFolder.Namespace(fso.GetFolder(aStringPath).Path) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(fso.GetFolder(aStringPath).Path) worked?  Yes
    
    aVariantPath = fso.GetFolder(aStringPath)
    Debug.Print TypeName(aVariantPath)
    'String (but really Variant/String according to Locals window)
    Set oTempFolder = oShell.Namespace(aVariantPath)
    Debug.Print "oTempFolder.Namespace(aVariantPath) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(aVariantPath) worked?  Yes
    
    aStringPath = fso.GetFolder(aStringPath)
    Debug.Print TypeName(aStringPath)
    'String (and actually is String according to Locals window)
    Set oTempFolder = oShell.Namespace(aStringPath)
    Debug.Print "oTempFolder.Namespace(aStringPath) worked?  " & IIf(Not oTempFolder Is Nothing, "Yes", "NO :(")
    'oTempFolder.Namespace(aStringPath) worked?  NO :(
    
End Sub

Our summary results are

Object type
Failed to create a Shell Object
Succeeded in creating a Shell Object
String
2
4
Variant/String

2
Object/Folder
1

So what do we have here? Not a ton of consistency from the String datatype, using Folder is totally out. Seems like the best way to get this to really reliably work is to use a variant. This technically matches the signature for the `NameSpace` method
Shell.NameSpace(ByVal vDir As Variant) As Folder
It's definitely not expected that the cast from string to variant is not successful sometimes.
Keeping in mind how VBA would handle this
Sub TestVariantsAndStrings()
    Dim v As Variant
    v = "abc"
    Dim s As String
    s = "123"
    VariantParameter v
    VariantParameter s
    StringParameter CStr(v)
    StringParameter s
End Sub

Function VariantParameter(myVar)
    Debug.Print myVar
End Function

Function StringParameter(mystring As String)
    Debug.Print mystring
End Function

Notice that on

StringParameter CStr(v)
I had to cast the variant to a string otherwise I get a "ByRef argument type mismatch". This makes sense. Who knows if that variant has implented a default property which returns a string? I don't thinkg the compiler knows or maybe it just doesn't check because the Office VBA IDE doesn't even let you make that kind of change to a class. You need to export your class as a .bas file, edit it in a text editor to implement the default property using the Attribute keyword, then import it back in. (Chip Pearson has a way better write up than what I can provide.)

So VBA doesn't like implicit variant --> string conversions but is fine with implicit string-->variant conversion. This kind of logic is called boxing. It makes sense.

With all that considered the restriction on the shell NameSpace method still does not make sense to me.

Good learning experience but not much gained.

My final unzip function looks like this and it seems to work well

Function UnZip(zipFilePath As String) As String
    Dim oShell
    Dim oFolder
    Dim sDir
    Dim oDest
    Dim newFolderName, newfolderpath

    sDir = zipFilePath
    Set oShell = CreateObject("shell.application")
    Set oFolder = oShell.Namespace(sDir)
    Set oDest = oShell.Namespace(Environ("TMEP"))
    Dim fso As New FileSystemObject

    newFolderName = Replace(fso.GetFileName(zipFilePath), "." & fso.GetExtensionName(zipFilePath), "")
    newfolderpath = fso.BuildPath(Environ("Temp"), newFolderName)
    
    newfolderpath = MakeFolder(newfolderpath)
    
    Set oDest = oShell.Namespace(newfolderpath)
    If Not oDest Is Nothing Then
        oDest.CopyHere oFolder.Items
        UnZip = oDest.Self.Path
    Else
        UnZip = ""
    End If
End Function

Private Function MakeFolder(pathToMake, Optional attempts As Integer = 0)
    Dim fso As New FileSystemObject
    pathToMake = pathToMake & IIf(attempts = 0, "", " (" & attempts & ")")
    
    If Not fso.FolderExists(pathToMake) Then
        MkDir pathToMake
        MakeFolder = pathToMake
    Else
        MakeFolder = MakeFolder(pathToMake, attempts + 1)
    End If
    
    Set fso = Nothing
End Function

Using IE8, IE9, IE10 and IE 11 at the same time

I work with some software that only runs on IE8 and IE9. Very frustrating but c'est la vie. When I wanted to move from IE8 to IE9 to see what happens on different versions I'd need to install the new version and if I wanted to go back to IE8 then I'd need to roll back the Windows Update (because for some reason that's how Internet Explorer is installed).

Well the other day I cleaned out my Downloads folder and with it my IE9 installer. No problem. Microsoft must make this available still, right?

Wrong. The download page for IE9 says it only works for 

Windows Internet Explorer 9 for IT Professionals and Developers--Windows Vista 64-bit Edition and Windows Server 2008 64-bit Edition 
Windows Internet Explorer 9 for IT Professionals and Developers--Windows Vista and Windows Server 2008
You'll notice neither one of those is Windows 7 or Windows 8. And when you download and try to give it a go anyway the installer knows this, too.

And that link it suggests basically says "nonono you don't want IE9 silly boy, you want IE 11. Here are two IE11 installer options"

OK. Ridiculous but again, c'est la vie.

Then I find that Microsoft has a better option for working with these old versions of IE. A nice packaged VM. This is definnitely the way to go. They support Virtual Box, Virtual PC, Hyper-V, and VMWare on a slew of host versions of Windows. Nice.

Getting going on Virtual PC was super easy. The catch is that they expire after 30-90 days. So basically you can't use them long term but if they are just for testing, whatever.

But, It turns out Virtual PC is not what the cool kids are using anymore so I downloaded and installed Virtual Box. Also, very easy. Just download the VM you want from Microsoft then import it into Virtual Box as an appliance.

It said importing would take 23 minutes but it really too only a few seconds. Thank you SSD.

So now I have IE11 on my computer (my regular computer) and IE8, IE9 and IE10 running in VMs through Virtual Box.

Side note:

With Virtual PC there was the snag that they say the default username/password is

IEUser
Passw0rd!

but I needed to use local\IEUSER to stop it from trying to log onto my domain.