<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <atom:link href="http://glencampbell.co/rss.xml" rel="self"
            type="application/rss+xml" />
        <title></title>
        <link>http://glencampbell.co/rss.xml</link>
        <language>en-us</language>
        <pubDate>Thu, 17 Sep 2015 16:36:22 GMT</pubDate>
        <docs>http://blogs.law.harvard.edu/tech/rss</docs>
                <item>
                    <title>That old house</title>
                    <link>http://glencampbell.co/essays/that-old-house.html</link>
                    <pubDate>Thu, 17 Sep 2015 13:30:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;To the new owners of our old house:&lt;/p&gt;
&lt;p&gt;Hi &amp;mdash;&lt;/p&gt;
&lt;p&gt;I hope you enjoy this home as much as we did. Any paperwork we had
related to the maintenance of the house is in the bottom left-hand
drawer of the kitchen desk. Most of that we acquired from the prior
owners, but it may be useful to you.&lt;/p&gt;
&lt;p&gt;The martin house out back is held up by a rope. In the autumn, once
the birds have cleared out (usually by Thanksgiving), you can lower
the house down and clean it out with a water house before you hoist
it back up. The birds will return in the spring, and they&#39;ll
appreciate it.&lt;/p&gt;
&lt;p&gt;The whitetail deer that live in the greenbelt drop their fawns
between March and May. They have been known, on occasion, to give
birth beneath the deck. If they do, try not to disturb them; they&#39;ll
be up and about in a few days. Sometimes, when the fawns are a few
weeks old, the doe will leave them in the yard while she goes
foraging. They are not abandoned: the momma deer will return within
a few hours to pick up the baby. Once, they even left a fawn on the
front porch by the door! (But that was a bit unusual.) They will
move through the yard at night, and will set off the motion-sensitive
light on the back deck. If it keeps you awake, you might have to
shut it off.&lt;/p&gt;
&lt;p&gt;The greenbelt itself is part of the regional drainage system. I&#39;m
told that it may fill up if there&#39;s a really heavy rainstorm, but
that never happened while we were there. Some of the neighbors have
have mentioned seeing a &#34;lake&#34; in their back yard but it never got
high enough to threaten the house. That&#39;s what it&#39;s supposed to do:
hold the water so that it doesn&#39;t flood downtown.&lt;/p&gt;
&lt;p&gt;The rabbits will occasionally come through, too, but they don&#39;t set
off the light like the deer.&lt;/p&gt;
&lt;p&gt;If you happen to see a cow, it probably got loose from one of the
ranches nearby. If it&#39;s drinking a beer, then...well, never mind.
You&#39;ll just have to cross that bridge when you come to it.&lt;/p&gt;
&lt;p&gt;I know you can&#39;t see the highway from the back, but you can hear it.
Twice a year, there&#39;s some sort of festival on the opposite side of
the highway and it gets really noisy, but it only seems to last a 
day or two. &lt;/p&gt;
&lt;p&gt;You may have noticed that the dog door is about five feet above the
ground. We built a little ramp for our dog to go in and out. We
just used an 2x10 and added some treads on it because it was steep
and she would slide down. It took her a few days, but she gained
confidence and would head outside whenever there was something to
bark at (usually one of the neighbors out on a walk).&lt;/p&gt;
&lt;p&gt;We never lit the fireplace, so I hope it still works. What with the
asthma and all that, we didn&#39;t go to the effort. You can occasionally
hear birds up in the chimney, but I&#39;m pretty sure they&#39;re transients.&lt;/p&gt;
&lt;p&gt;The air conditioner was replaced in 2012 and we just had it serviced.
It&#39;s still under warranty, so let the folks know if something goes
wrong before 2019 (paperwork in the desk drawer).&lt;/p&gt;
&lt;p&gt;I hope you enjoy the whirlpool. Frankly, as we&#39;re getting a bit
older, it got more and more complicated to get in and out, so we
usually stuck to taking showers. There&#39;s a shutoff switch behind
one of the doors on the bottom if it starts leaking and you need
to turn off the electricity to it.&lt;/p&gt;
&lt;p&gt;Watch out for wasps! Sometimes, they&#39;ll start building a nest under
the eaves. If you can see it, they can see you, and, let me tell
you, they &lt;em&gt;hurt&lt;/em&gt;. You can knock the nests down with a broom, but
then run like hell because you&#39;ll really piss them off. It might
be better to let an exterminator deal with them, come to think of
it.&lt;/p&gt;
&lt;p&gt;What with all the trees, you need to clear out the gutters at least
twice a year, or else they&#39;ll get all gunked up. The trees do make
the lot beautiful, and the lighting adds a lot to that. For some
reason, when we replaced one of the lights with LEDs, some of the
other lights didn&#39;t seem to work as well, but we never figured out
what the problem was.&lt;/p&gt;
&lt;p&gt;The driveway and sidewalk have been pressure-cleaned and they looked
really spectacular when we left.&lt;/p&gt;
&lt;p&gt;You&#39;ll have access to the hiking trails and I recommend that you
use them, except in the late spring when the mosquitos are out in
full force.&lt;/p&gt;
&lt;p&gt;Remember to trim that big thing in the corner by the front door.
If you cut it back in the winter, it will bloom again by March, and
grow healthy.&lt;/p&gt;
&lt;p&gt;Enjoy the home. It&#39;s a great place. &lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/that-old-house.html</guid>
                </item>
            
                <item>
                    <title>Smart Locks</title>
                    <link>http://glencampbell.co/essays/smart-locks.html</link>
                    <pubDate>Wed, 16 Sep 2015 11:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;As we&#39;re preparing to move into a new house soon, I&#39;ve been looking into
&#34;smart locks.&#34; These have been around for a while, and there are 
several that seem to be well-known in the industry. &lt;/p&gt;
&lt;p&gt;&lt;a data-flickr-embed=&#34;true&#34;  href=&#34;https://www.flickr.com/photos/darwinbell/688068169/in/photolist-23NwGi-p4xhXr-pot5Bm-q2tcea-cE6PS-abxBej-aarjox-4THT2X-4Fwo5w-har8Zw-7PQpaZ-bAUx5j-ak2q9v-9uKVDe-4xqJnT-pNfQ2V-4w9csh-dFVZx5-e6k5Ak-fEQbRx-8oQ1nH-8r2CVR-pAJBqx-dG6neS-SoX26-9oNPZn-mgjU2U-azPbgb-rbCTk1-oFMMB2-72xiQ7-6aRr8S-X54YR-mvZV7g-xAAwCr-9MD5JS-cEPn4G-9PhLeX-aPr4CB-bn1aZv-bD1SrM-rHGUvU-4XpCsF-dfJH2y-9TL2A2-kDM3G2-55Gdmp-4jh6xz-9yZsf4-8H3hcn&#34; title=&#34;geometrically locked&#34;&gt;&lt;img src=&#34;https://farm2.staticflickr.com/1024/688068169_71a5b46f1e_n.jpg&#34; width=&#34;320&#34; height=&#34;232&#34; alt=&#34;geometrically locked&#34; class=&#34;pull-right&#34;&gt;&lt;/a&gt;&lt;script async src=&#34;//embedr.flickr.com/assets/client-code.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
A &#34;smart lock&#34; replaces (or supplements) your deadbolt and allows you to 
open your door via a Bluetooth connection. Nearly all of them let you
lock or unlock your door from an iOS or Android phone, and some of them
also have keyfobs that you can use as well. Most of them have an &#34;autolock&#34;
feature that will automatically lock your door after a period of time. 
Some of them will automatically open the door if you&#39;re within range
(and they claim to be able to tell if you&#39;re on the outside so that the
door doesn&#39;t automatically unlock when there&#39;s an ax-wielding murderer
on the outside and you approach the door with your phone in your pocket
from the inside). Most of them will notify you (or keep a log) of comings
and goings so that you can track activity through your front door. &lt;/p&gt;
&lt;p&gt;Some of them allow you to give out &#34;electronic keys&#34; to visitors, and
can even time-limit them. For example, you could give a key to a plumber
that would allow him or her free access between 1-4PM, but lock them 
out otherwise. Or, if you have a house guest, you could send them an
electronic key that would let them arrive during the day when you&#39;re not
around. &lt;/p&gt;
&lt;p&gt;The great thing about these features is that most of them are implemented
in software, so you could potentially expect new features to be added
even after you&#39;ve installed the device. &lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://danalock.com&#34;&gt;Danalock&lt;/a&gt; ($179) is a Scandinavian device that&#39;s not too
well-known in the USA, but they appear to have set the standard. It&#39;s a 
battery-powered cylinder that installs on the inside of the door, replacing
the normal deadbolt handle. In addition to Bluetooth, it supports Z-wave,
which gives you access over the Internet if you have a compatible home
automation hub. The reviews on Amazon are generally unenthusiastic, with
problems ranging from lag (i.e., it takes a bit of time from when you
command it to unlock to when it actually unlocks) to incompatibility with
various door hardware. Some reviews mention &#34;likely require sawing off pieces
from your existing lock&#34; which is scary. &lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://august.com&#34;&gt;August&lt;/a&gt; ($249) is the newer, cooler, American big-brother
to Danalock. It uses heavier batteries than the Danalock, and I&#39;m guessing
that it has a more powerful motor, since there are fewer complaints about
that sort of thing. It&#39;s Bluetooth only, which means that you can&#39;t control it
remotely unless you get the additional August Connect ($49) which is a
WiFi-Bluetooth bridge. The scariest thing in the reviews is that people mention
that it will sometimes unlock itself, randomly, in the middle of the night. 
Not exactly something to inspire confidence. August/August Connect will 
work with &lt;a href=&#34;https://nest.com&#34;&gt;Nest&lt;/a&gt; which is IMHO a big advantage since it
can, for example, turn your thermostat back on when you arrive from being out.
August Connect will only control a single lock, so you have to have both if
you want to control them remotely. &lt;/p&gt;
&lt;p&gt;One of the nice things about both the Danalock and the August is that it 
merely replaces the deadbolt handle. Thus, your keys will still continue
to function. If you have multiple doors in your house with the same key, 
you don&#39;t have to replace all of them (or deal with having different keys
for different doors). &lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://mykevo.com&#34;&gt;Kwikset Kevo&lt;/a&gt; ($199) takes a different approach, 
in that it replaces the entire deadbolt assembly. It is Bluetooth only
and, as far as I can tell, there&#39;s no way to connect it to the Internet. 
It&#39;s controlled from your smartphone and lets you send &#34;e-keys&#34; to people,
though it charges for them. A big advantage of the Kevo seems to be that
they kept the deadbolt handle on the inside, so you can see at a glance
if the door is locked or unlocked. The Kevo will also work with a 
plastic keyfob that you can give to a child or a friend, but additional
ones cost $25 each.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.forbes.com/sites/michaelwolf/2014/10/14/here-come-the-bluetooth-smart-locks-august-danalock-to-help-fuel-3-6-billion-market/&#34;&gt;Check out this Forbes article (from 2014) on smart locks&lt;/a&gt;.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/smart-locks.html</guid>
                </item>
            
                <item>
                    <title>On Being Fat</title>
                    <link>http://glencampbell.co/essays/fat.html</link>
                    <pubDate>Tue, 08 Sep 2015 21:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Most of you who know me (except for perhaps the very few who met me
in elementary school) know that I&#39;ve always been fat. &#34;Big,&#34; &#34;heavy,&#34;
&#34;large&#34;&amp;mdash;these are some of the euphemisms I&#39;ve grown up with.
I never noticed my weight until junior high school.
Until that point, I was just a big kid, and this was an advantage
when I tried out for Little League baseball or play football. &lt;/p&gt;
&lt;p&gt;In junior high, however, we had to &#34;suit up&#34; for PE, aka gym class. 
The first day of class, we had to go to the locker room,
take off all our clothes, and put on the supplied jockstraps and gray
woolen gym shorts. For the first time in my life, someone pointed
at the little rolls of fat around by belly and laughed. Until that
second, I had no idea that I was anything other than a 
perfectly normal kid. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Disclaimer:&lt;/em&gt; this is not medical advice, and I&#39;m not advocating for
any particular lifestyle, exercise, or medical treatment. 
I&#39;m merely sharing my story in the hope that it&#39;s either
interesting or useful for others. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I was in high school, my interests were more in poetry and music
rather than sports. I still rode my bicycle everywhere and was, I believe,
in reasonably good shape, but my parents put me on a miserable 1500 calorie
per day diet which didn&#39;t, as I recall, do much good.
I rode my bicycle competitively a few times; I wasn&#39;t ever a winner, but
I finished every race I entered and was never in last place.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;footnote&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;When I went off to college, I bought a tuxedo (required for orchestra members)
with size 44&#34; pants. I wore that tux numerous times for performances as well
as other formal events over the next four years. By the end of school, however,
it was getting tight. While in college, I took the required four PE classes;
for me, these included two semesters of cycling and another two of sailing.
I went on long rides with other cyclists at Baylor, and even had a 
rather spectacular crash when I hit a small patch of water at the bottom
of a very steep hill in Waco&#39;s Cameron Park. I had no broken bones, but 
I managed to scrape most of the skin off my entire right side, from the legs
to the hips to the shoulder and even on my face. 
It was a spectacular-looking injury, but no major damage was done. 
When I left college to go to work in Austin, I sold my bicycle since
I had moved to a house farther from campus and riding was not easy to
keep up (and probably my as-yet-undiagnosed ADHD meant that I had new
interests).&lt;/p&gt;
&lt;p&gt;In Austin, I lived in suburban apartments and commuted by car to work. 
I had no concept, even then, of deliberate physical activity. That is, 
it never actually crossed my mind that I had to do something to be
healthy. Fitness was something that just happened when I was doing 
things that I enjoyed. But photography and playing the guitar do not
consume as many calories as riding a bicycle or hiking, and my weight 
was slowly creeping up, unknown to me, fueled by a steady diet of pizza,
fajitas, and the best BBQ around.&lt;/p&gt;
&lt;p&gt;In 1996, I moved to England. I was still a &#34;big guy,&#34; but my weight was
not out of control. 
Living and working in England (and much of Europe and South Africa)
involved a lot of walking: you walked from the train station to the office,
from the office to the pub, and so forth. So, again, of necessity, I was
getting exercise without needing to think about it. 
I took up golf, too, and that was probably a healthy change. &lt;/p&gt;
&lt;p&gt;In 2000, I left my job in the UK and returned to the USA: Silicon Valley,
at the height of the boom. I went to work for a startup; this involved
commuting (by car), and walking across the parking lot for those
calorie-laden foods that I&#39;d been missing in my four years overseas. 
In my first eight months back in the USA, my weight zoomed up 65 lbs. 
I only know this because I weighed in at the doctor and thought
to myself, &#34;Hmmm, that&#39;s a bit more than I remember from last time.&#34; 
I didn&#39;t, however, think much more about it. &lt;/p&gt;
&lt;p&gt;My time with a startup was followed by several years of near-total
unemployment. When you&#39;re unemployed, golf is not something you
spend money on. Unbeknownst to me, my weight was slowly climbing. 
Several jobs later, I found myself with a bad back, sore knees, 
arthritis, and a profound tendency to breath deeply if I had to walk
a slight upwards slope. Because of the back pain, I avoided walking. 
When I moved back to Texas to take a new job in 2010, I weighed 
about 420lbs (which I jokingly referred to as
&#34;a fifth of a ton&#34;) and wore size 62&#34; pants.&lt;/p&gt;
&lt;p&gt;When we moved to Texas, we got a new, larger, softer bed than we
had ever had before.
&lt;a href=&#34;http://glencampbell.co/essays/a-good-nights-sleep.html&#34;&gt;The effect on my life was amazing, as I&#39;ve written about 
before&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In 2011, &lt;a href=&#34;http://glencampbell.co/essays/goodbye-bro.html&#34;&gt;my brother Mark unexpectedly
died&lt;/a&gt; 
of an aortic aneurysm. Doctors recommended that I and my
remaining brothers get checked out, in case the condition was
genetic. So I went off to the doctor for an ultrasound. 
It turns out that I did not have an aneurysm, but they 
detected a slightly enlarged liver. This turned out to be
the early stages of Non-Alcoholic Fatty Liver Disease.
My gastroenterologist recommended losing weight and, 
with the assistance of the new bed, I managed to drop down 
to around 350lbs. &lt;/p&gt;
&lt;p&gt;Unfortunately, this wasn&#39;t really enough, and my doctor
recommended bariatric surgery. I was not very inclined to give up
eating; plus, bariatric surgery was, at that time, considered
&#34;experimental&#34; and thus was not covered by insurance. 
That changed in 2014, when my employer added bariatric surgery
to their list of covered treatments. Finally, in December 2014,
I underwent a &lt;em&gt;sleeve gastrectomy&lt;/em&gt;; in this procedure, about
80% of my stomach was removed.&lt;/p&gt;
&lt;p&gt;There are several different types of bariatric (weight-loss)
surgery. The first kind (popularized by Al Roker on NBC&#39;s &#34;Today&#34; show)
was the gastric bypass. This involves removing the stomach almost entirely,
and requires significant changes in diet and lifestyle for the 
rest of your life. The &lt;em&gt;lap band&lt;/em&gt; is another surgery where they
apply an adjustable band around the stomach to artificially reduce
it&#39;s size. It has a bad track record of side effects (it&#39;s prone to
infection, for example) and, once it&#39;s removed, your stomach returns to
its original size. &lt;/p&gt;
&lt;p&gt;The &lt;em&gt;gastric sleeve,&lt;/em&gt; on the other hand, removes a large part of your 
stomach, but leaves a small &#34;sleeve&#34; of it behind. Because your stomach
is still there and functioning, you can still take oral medication, and
you can pretty much eat anything, though you can&#39;t consume more than about
4-5 ounces of anything at a time. &lt;/p&gt;
&lt;p&gt;(Note: all these surgeries are valid, and offer different options
for different patients. If you&#39;re considering this, talk to your
doctor about what&#39;s right for you; there may be reasons in your 
case to choose one over the other.)&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Me&#34; src=&#34;//cdn.broadpool.com/BeforeAfter.jpg&#34; title=&#34;This are me&#34; /&gt;&lt;br /&gt;
&lt;em&gt;This is me in 2011 (left) and July 2014 (right)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Since December 2014 (when I weighed 360 lbs), 
I&#39;ve lost a bit more than 100 lbs; last week, 
my weight was 254 lbs (fully clothed; at home, I typically don&#39;t 
wear clothes when weighing in). Coupled with a 
&lt;a href=&#34;http://glencampbell.co/essays/amazon.html&#34;&gt;move to Seattle&lt;/a&gt;, 
I&#39;ve been walking regularly, going to the gym, and working 
out at home with kettlebells. &lt;/p&gt;
&lt;p&gt;Within a month after the surgery, I stopped taking high blood pressure
medication and the cholesterol medications I&#39;ve been on for years. 
I still use a CPAP for sleep apnea (according to the doctor, my
apnea is mostly caused by a generic malformation of my palate, and 
not necessarily by my weight, though the obesity didn&#39;t help matters). &lt;/p&gt;
&lt;p&gt;The surgery sometimes causes frustrations. I can&#39;t, for example, drink
anything immediately after eating (that tends to make the food expand
and lead to vomiting), so no more bagel+coffee. I have to wait an hour
or so after eating before I can drink anything. Because I can&#39;t eat
enough, I will have to take substantial vitamins for the rest of
my life. I need to keep my protein up, so I usually have a protein
shake for breakfast (my target is 85 grams of protein per day).
But I can have a hamburger, even if I can&#39;t have a coke to go with it.
I&#39;ve also developed an occasional aversion to eggs, which is 
somewhat frustrating, too. I&#39;m prone to cheating (such as grabbing 
some caramel candies in the evening) which certainly makes the 
weight loss go slower than it would otherwise.&lt;/p&gt;
&lt;p&gt;I tell this story so that it will be documented. I&#39;m not trying to 
prove anything to anyone, or recommend a particular course of action.
If you can lose weight without surgery, that&#39;s probably a far better course
to take if you can do it (and I&#39;m supremely proud of my double-first cousin
Jim, who managed to do just that).&lt;/p&gt;
&lt;p&gt;I am looking forward to getting back on a bicycle soon, however. &lt;/p&gt;
&lt;div class=&#34;footnote&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I actually rode against Greg Lemond in a race in Houston when he
was an up-and-coming youth cycling star. I&#39;m pretty sure I finished 
behind him.&amp;#160;&lt;a href=&#34;#fnref:1&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 1 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/fat.html</guid>
                </item>
            
                <item>
                    <title>Amazon</title>
                    <link>http://glencampbell.co/essays/amazon.html</link>
                    <pubDate>Sun, 14 Jun 2015 09:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;As those of you who follow me on the various social media platforms are
probably already aware, I started a new job at Amazon.com on the first
of June. I&#39;m a software development manager with a couple of teams in the
retail division. One team is a platform that&#39;s used by a dozen or more
other major systems, and the other team maintains the user interface
for one of those crucial systems.&lt;/p&gt;
&lt;p&gt;Amazon is a fascinating, enormous company, and I&#39;m just getting a glimpse
of how it has evolved. I&#39;m lucky in that I&#39;ve actually been an Amazon customer
since its earliest days (I even participated in the Beta launch of
Amazon.co.uk when I lived in England in the late 1990&#39;s).&lt;/p&gt;
&lt;p&gt;Since I started work on June 1, I&#39;m slowly getting up to speed.
One of the things that Amazon does well, however, is to scale things,
and that includes the ability to hire very large numbers of people and
get them productive rapidly. They have an exciting culture where
software developers (in particular) take ownership of their systems;
most of the work is performed by the teams directly, which means that
they can move very rapidly, unlike many other large companies.&lt;/p&gt;
&lt;p&gt;Stay tuned as I learn more about it.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/amazon.html</guid>
                </item>
            
                <item>
                    <title>Texas-Style Slow Cooker Chili</title>
                    <link>http://glencampbell.co/essays/my-chili.html</link>
                    <pubDate>Wed, 14 Jan 2015 11:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;As everyone knows, chili was invented in Texas, probably as a way of consuming
older, tougher, possibly rotten cuts of meat. By slowly cooking over a long 
period of time, the meat grows tender and absorbs the complex flavor of the 
spices. &lt;/p&gt;
&lt;p&gt;Note that the red coloring of chili comes from, well, chilis. True Texas chili 
does not have tomatoes, nor does it have beans. (There is a remotely-related dish called &#34;chili with beans,&#34; but it has no place in proper cuisine.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1-1.5 lb lean ground meat&lt;/li&gt;
&lt;li&gt;1 onion, chopped&lt;/li&gt;
&lt;li&gt;5 T. chili powder&lt;/li&gt;
&lt;li&gt;1 T. garlic powder&lt;/li&gt;
&lt;li&gt;1 T. black pepper&lt;/li&gt;
&lt;li&gt;2 T. smoked paprika&lt;/li&gt;
&lt;li&gt;2 T. flour&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Brown meat and add chopped onions, then move to the slow cooker. &lt;/p&gt;
&lt;p&gt;Add all the spices and enough water to cover, then stir thoroughly.&lt;/p&gt;
&lt;p&gt;Add salt if needed. (If you like it extra spicy, add cayenne pepper as desired.)&lt;/p&gt;
&lt;p&gt;Cook all day on low, stirring occasionally and adding water if needed.&lt;/p&gt;
&lt;p&gt;About 30 minutes before serving, make a paste with the flour and a
little bit of water, then stir that into the pot (this helps thicken
the broth).&lt;/p&gt;
&lt;p&gt;Serve with toppings: fresh chopped onions, shredded cheese, jalapenos,
crackers. If you&#39;re from deep east Texas, serve over rice.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/my-chili.html</guid>
                </item>
            
                <item>
                    <title>Street Photography</title>
                    <link>http://glencampbell.co/essays/street-photography.html</link>
                    <pubDate>Sun, 14 Sep 2014 12:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;This morning, I happened to see two of my Facebook friends&#39; posts side-by-side
in my newsfeed. Both of them are photographers with a heavy emphasis on
street photography, and both of them are quite good.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.saatchiart.com/neya&#34;&gt;Nia Maria Moilanen&lt;/a&gt; is based in Helsinki,
Finland, and though her work focuses primarily on self-portraits, she also
does some fabulous street work.
&lt;a href=&#34;http://oneverystreetphotography.wordpress.com/&#34;&gt;Knut Sjærven&lt;/a&gt; is an old
friend that I&#39;ve known for many years. He and I used to work together on
the Contax G pages, a site we ran that was dedicated to the Contax G
series cameras. He&#39;s a huge influence in the world of street photography
and is currently working on exhibitions in Europe and a street photography
summit in Copenhagen next summer.&lt;/p&gt;
&lt;div class=&#34;pixels-photo&#34;&gt;
  &lt;p&gt;&lt;img src=&#34;http://ppcdn.500px.org/76701315/1dc56a937b80446595f5dee0376e5698c0914de7/4.jpg&#34; alt=&#34;Photograph Our neighborhood by Glen Campbell on 500px&#34;&gt;&lt;/p&gt;
  &lt;a href=&#34;http://500px.com/photo/76701315/our-neighborhood-by-glen-campbell&#34;&gt;Our neighborhood by Glen Campbell on 500px&lt;/a&gt;
&lt;/div&gt;

&lt;script type=&#34;text/javascript&#34; src=&#34;//500px.com/embed.js&#34;&gt;&lt;/script&gt;

&lt;p&gt;Street photography is a genre that I love;
&lt;a href=&#34;https://en.wikipedia.org/wiki/Henri_Cartier-Bresson&#34;&gt;Henri Cartier-Bresson&lt;/a&gt;
is one of my key influences for why I became personally interested in
photography (along with
&lt;a href=&#34;https://en.wikipedia.org/wiki/Ansel_Adams&#34;&gt;Ansel Adams&lt;/a&gt;).
The best street photography captures the accidental geometry and
artistry that appears when large groups of people are together in an
urban setting.&lt;/p&gt;
&lt;p&gt;Alas, I am a child of the suburbs. I&#39;ve never had much opportunity to engage
in street photography except on those rare occasions when I get to travel.
Quite frankly,
&lt;a href=&#34;http://500px.com/photo/75560051/suburbia-4th-of-july-by-glen-campbell?from=user_library&#34;&gt;suburban photography&lt;/a&gt;
simply doesn&#39;t have the impact of life in the big city.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/street-photography.html</guid>
                </item>
            
                <item>
                    <title>Please, allow me to rant a moment</title>
                    <link>http://glencampbell.co/essays/allow-me-to-rant.html</link>
                    <pubDate>Wed, 28 May 2014 17:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;We&#39;re using &lt;a href=&#34;http://jekyllrb.com&#34;&gt;jekyll&lt;/a&gt; on some projects at work, so I thought that I would try it out on my laptop. I found the Jekyll &lt;a href=&#34;http://jekyllrb.com/docs/quickstart/&#34;&gt;Quick-start guide&lt;/a&gt;, and it seems pretty straightforward:&lt;/p&gt;
&lt;p&gt;&lt;img  src=&#34;http://cdn.broadpool.com/Screen-Shot-2014-05-28-at-9.18.08-AM.png&#34; alt=&#34;Jekyll quick start&#34; width=&#34;680&#34; height=&#34;289&#34; class=&#34;center&#34;&gt;&lt;/p&gt;
&lt;p&gt;The problem, of course, is that it doesn&#39;t work:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://cdn.broadpool.com/Screen-Shot-2014-05-28-at-9.20.55-AM.png&#34; alt=&#34;fail&#34; width=&#34;563&#34; height=&#34;76&#34; class=&#34;center&#34;&gt;&lt;/p&gt;
&lt;!--more--&gt;

&lt;p&gt;Apparently, Jekyll wants you to install this as root. Or, perhaps, the writer is running on a different system that permits regular users to install new software without privileges. Or something else: who knows? The fact of the matter is, these simple &#34;quick start&#34; instructions are a complete and utter failure. At this point, I have two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I can walk away, knowing that if I try to fix this, I&#39;m going to dive into a multi-hour, multi-day fiasco of repetitive trial-and-error.&lt;/li&gt;
&lt;li&gt;I can try to fix it and hope for the best. And probably dive into a multi-hour, multi-day fiasco of repetitive trial-and-error.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You who develop software: is this what you want?&lt;/p&gt;
&lt;p&gt;I use this as a simple, most recent example, but it happens all the time. People who write Java code assume that every single human being on the face of the earth has a Java development environment set up exactly like theirs. Folks who code in Python assume that you have the exact same Python version and installed libraries as they do.&lt;/p&gt;
&lt;p&gt;Here&#39;s a hint: before you release any documentation, ever, spin up a new, clean standard server using a common operating system like Ubuntu or Microsoft Windows. Run your code examples there. If they don&#39;t work for you then, they won&#39;t work for anyone else using it.&lt;/p&gt;
&lt;p&gt;Moreover, if they &lt;em&gt;do&lt;/em&gt; actually work, they &lt;em&gt;still&lt;/em&gt; probably won&#39;t work for a bunch of users.&lt;/p&gt;
&lt;p&gt;Document your dependencies: if the writer of Jekyll&#39;s quick start guide had added a footnote with his or her assumptions about operating system, environment, and dependencies, then I would at least have had some idea that there might be problems.&lt;/p&gt;
&lt;p&gt;An old rule of thumb is &#34;Under-promise and over-deliver.&#34; Documentation like this takes the exact opposite approach, and it pisses users off.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/allow-me-to-rant.html</guid>
                </item>
            
                <item>
                    <title>Bags</title>
                    <link>http://glencampbell.co/essays/bags.html</link>
                    <pubDate>Tue, 23 Jul 2013 11:14:38 GMT</pubDate>
                    <description>
                        &lt;p&gt;Like many people in technology-related careers, I have long searched
for the perfect carrying bag. Ideally, I would like to have a bag
or backpack that can hold a weeks&#39; worth of clothes, a full-size
desktop computer and monitor, spare printer and paper, my camera
and extra lenses, a full-size MIDI keyboard, and a small swimming
pool, and still weigh under 2 lbs. when fully loaded.&lt;/p&gt;
&lt;p&gt;Needless to say, such a device has not been developed yet, so I
keep trying various luggage-type devices to see how close I can
get.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/gecampbell/9349916099/&#34; title=&#34;Square Rigger by gecampbell, on Flickr&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7395/9349916099_8e1ee05b99_n.jpg&#34; width=&#34;320&#34; height=&#34;240&#34; alt=&#34;Square Rigger&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a &lt;a href=&#34;http://www.landsend.com&#34;&gt;Lands&#39; End&lt;/a&gt; &lt;em&gt;Square Rigger&lt;/em&gt;
attach&amp;eacute; that I acquired around 1989.  At that time in the
remote past, portable computers did not really exist, and I used
the case for mostly transporting notebooks, pens, and paper, to and
from my work.&lt;/p&gt;
&lt;p&gt;When I finally acquired a laptop for work, I also acquired the first
of many laptop bags. I don&#39;t recall all the details, but I&#39;m sure
it was heavily padded and weighed a ton, because the laptop computers
at the time were around 12 lbs.  The Square Rigger was set aside,
and a succession of laptops and their carrying apparatus followed,
usually of ever-increasing sizes.&lt;/p&gt;
&lt;p&gt;Around 1999, I reached my personal baggage capacity. At that time,
I was using a &lt;a href=&#34;http://www.lowepro.com&#34;&gt;Lowepro&lt;/a&gt; photographer&#39;s
backpack. It could carry a full-sized SLR camera and 3-4 lenses in
addition to the &lt;em&gt;de rigeur&lt;/em&gt; 15-lb. laptop computer. At that time,
I was commuting weekly to a job in Wuppertal, Germany, from my home
in Ascot, England. I was seriously starting to have back problems,
too.&lt;/p&gt;
&lt;p&gt;However, technology kept advancing, and laptops started to get
smaller and smaller, and my later bags (usually backpacks) also
started to get to a more reasonable size. In 2010, I acquired an
11&#34; &lt;a href=&#34;http://www.apple.com/macbook-air/&#34;&gt;MacBook Air&lt;/a&gt; which was so
light and thin that &lt;a href=&#34;http://blog.tsa.gov/2010/11/macbook-airs-along-with-many-other.html&#34;&gt;it wasn&#39;t even considered a laptop by the
TSA&lt;/a&gt;.
The bag, however, was still fairly large.&lt;/p&gt;
&lt;p&gt;These days, I occasionally use the 11&#34; MacBook Air, but I&#39;m usually
commuting with an &lt;a href=&#34;http://www.apple.com/ipad-mini/overview/&#34;&gt;iPad Mini&lt;/a&gt;.
The other day, I ran across my 25-year-old Square Rigger attach&amp;eacute;
and realized that it was just perfect. I usually commute with the
iPad and occasionally throw in some connectors, business cards,
and, on rare occasions, the laptop. The velcro on the outside had
worn out, so I went to a local shop that does alterations and had
it replaced.  No, it&#39;s not heavily padded, but I can put the MacBook
air in a padded sleeve when I need to carry it. While it doesn&#39;t
meet my description of the perfect bag (above), it&#39;s amazing to me
that the miniaturization of electronics has allowed me to bring
these older artifacts back into play.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/bags.html</guid>
                </item>
            
                <item>
                    <title>Doing It Right</title>
                    <link>http://glencampbell.co/essays/doing-it-twice.html</link>
                    <pubDate>Mon, 22 Jul 2013 12:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Last week, I attended a meeting with many of my peers where one of the other managers expressed frustration at having to (re)build a configuration management and deployment system for each new project.  Why don&#39;t we just do this once and be done with it? she asked.&lt;/p&gt;
&lt;p&gt;It&#39;s an excellent question, and one that many organizations fail to recognize.  I came back to my desk and tweeted my version of it:&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p&gt;My pet peeve in IT: &amp;quot;We don&amp;#39;t have time to do this right, so we&amp;#39;ll do it twice.&amp;quot;&lt;/p&gt;&amp;mdash; Glen Campbell (@glenc) &lt;a href=&#34;https://twitter.com/glenc/statuses/357883903882694657&#34;&gt;July 18, 2013&lt;/a&gt;&lt;/blockquote&gt;

&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;The tweet rapidly took on a life of its own; by now, it&#39;s been retweeted more than 100 times.&lt;/p&gt;
&lt;p&gt;The reason it struck a nerve is because it&#39;s an all-too-common situation.  Engineers quite often recognize that the proposed solution is a partial solution to the underlying problem, but management doesn&#39;t want to spend the resources (time, material, and people) to solve the whole problem; instead, they&#39;ll limit the solution to the immediate &lt;em&gt;instance&lt;/em&gt; of the problem. This usually means that, until they decide to solve the original, deeper problem, they&#39;ll have to solve the same problem over and over again.&lt;/p&gt;
&lt;p&gt;To engineers, this is &#34;technical debt.&#34; It&#39;s called &lt;em&gt;debt&lt;/em&gt; because it is an unrealized cost. At some point, the burden of maintaining multiple CI/CD solutions will be seen as expensive and the company will consolidate them, usually with a fair amount of pain. Like monetary debt, the pain may not be felt by the people who incurred the debt, but by their heirs: that is, whoever owns and has to maintain those systems somewhere down the line when they all need to be replaced.&lt;/p&gt;
&lt;p&gt;Avoiding technical debt is not necessarily the right solution, however.  Like monetary debt, technical debt can be used to leverage resources so that more can be accomplished in a shorter time period.  Because we have a number of different teams implementing CI/CD solutions, none of them have to wait for a centralized system to be completed before they can proceed with their own deployments.  Multiple, parallel implementations allow teams to be more agile and flexible in their development.&lt;/p&gt;
&lt;p&gt;Moreover, it&#39;s almost a certainty that some of those solutions will be better than others; this leads to a situation where, by allowing development to proceed in parallel, we can actually determine which solution works best for us.&lt;/p&gt;
&lt;p&gt;In addition, there&#39;s no guarantee that having a centralized, common solution will be the best for every group. For example, a web application might be perfectly happy with deploying every hour, since most of the changes are minimal and can be backed out if they have problems. A financial system, however, may have much more stringent compliance, security, and deployment requirements that necessitate a more rigorous, slower deployment cycle (for example, some changes may be required &lt;em&gt;by law&lt;/em&gt; to wait for implementation until a particular date).&lt;/p&gt;
&lt;p&gt;So, while my peeve about &#34;let&#39;s do things twice because we don&#39;t have time to do it right&#34; may be perfectly valid, it should be understood that simply avoiding duplication (in and of itself) is not necessarily optimal for the entire organization.&lt;/p&gt;
&lt;p&gt;Like monetary debt, technical debt can be beneficial for an organization, especially if it is repaid in a timely manner. The key is that incurring such debt should be done with deliberation and planning, and not as a mere accident of circumstance.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/doing-it-twice.html</guid>
                </item>
            
                <item>
                    <title>Code for America</title>
                    <link>http://glencampbell.co/essays/code-for-america.html</link>
                    <pubDate>Tue, 02 Jul 2013 09:05:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;A number of years ago when I was an engineering manager for &lt;a href=&#34;http://news.yahoo.com&#34;&gt;Yahoo!
News&lt;/a&gt;, I hired a young engineer over the
objections of nearly everyone who looked at his resume.&lt;/p&gt;
&lt;p&gt;Frankly, his resume sucked&amp;mdash;it was very poorly written, and
it didn&#39;t do a great job of showing off his accomplishments. However,
it showed that he had the skills we were looking for, so I did the
usual phone interview.  On the phone, he impressed me with both his
technical depth as well as his passion for doing cool things.  We
had him in for interviews, and the reviews of that were mostly good,
though some people still had concerns.  I had already made the
decision to hire him, however, no matter what the other folks
thought.&lt;/p&gt;
&lt;p&gt;It was one of those rare instances where my intuition, notoriously
unreliable, was proven right. He ended up being a stellar performer
on my team and grew to gain the respect of his peers.&lt;/p&gt;
&lt;p&gt;Fast forward a few years, and we went our separate ways; I went to
work for &lt;a href=&#34;http://www.rackspace.com&#34;&gt;Rackspace&lt;/a&gt; and he joined a large
media company and then a small startup in San Mateo. In 2012, I got
an email from him; he was telling me that he had applied for a
Fellowship from &lt;a href=&#34;http://codeforamerica.org&#34;&gt;Code for America&lt;/a&gt;)
(CfA), and he wanted to list me as a reference. It was an organization
that I hadn&#39;t heard of before, but I agreed.&lt;/p&gt;
&lt;p&gt;Over the next few months, I received a number of calls from people
on the Code for America fellowship selection committee, and, towards
the end of that year he was selected as one of 28 Fellows out of a
highly-competitive group of more than 500 applicants.&lt;/p&gt;
&lt;p&gt;When I congratulated him, I asked if he would be returning to the
startup.  I&#39;m not sure, he told me; the startup couldn&#39;t guarantee
him a job on his return.  This is not altogether surprising, since
most startups have very limited financial constraints. However, it
stuck in my craw, and I wondered if we could do better.&lt;/p&gt;
&lt;p&gt;A few weeks ago, I wrote an email to Lanham Napier and Lew Moorman,
CEO and President of Rackspace, introducing Code for America and
proposing a plan to let Rackspace employees apply for a Fellowship
without penalty. They put me in touch with Henry Sauer, our VP of
Human Resources, and, after a few weeks&#39; work, we &lt;a href=&#34;http://www.rackspace.com/blog/how-rackspace-supports-code-for-america-fellows/&#34;&gt;announced a
plan&lt;/a&gt;
 where employees who applied for and were accepted for
a Code for America fellowship could spend their year in service,
knowing that they had a job upon their return and that there would
be no loss of vesting in our 401K plan or participation in various
other tenure-based programs such as the employee stock purchase
plan (ESPP).&lt;/p&gt;
&lt;p&gt;I&#39;m very gratified to work for an employer like Rackspace that not
only encourages service but also supports it in such a manner.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/code-for-america.html</guid>
                </item>
            
                <item>
                    <title>Quite possibly the most important management advice you'll ever receive</title>
                    <link>http://glencampbell.co/essays/most-important-advice.html</link>
                    <pubDate>Tue, 07 May 2013 07:30:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Shut up and let your people get stuff done.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/most-important-advice.html</guid>
                </item>
            
                <item>
                    <title>The management transition</title>
                    <link>http://glencampbell.co/essays/the-management-transition.html</link>
                    <pubDate>Thu, 25 Apr 2013 08:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Most software development organizations have a fairly clear path for their individual contributors. Whether they call the job &#34;Member of the Technical Staff,&#34; &#34;Software Developer,&#34; or &#34;Programmer,&#34; a young developer starts at a level 1 and moves up, usually to about level 4 or 5. At this point, successful individuals are usually faced with a choice: whether to continue up the technical path, or move into management.&lt;/p&gt;
&lt;p&gt;This is not a discussion of the relative merits of either path (both are good, both are needed in the organization, but the technical side is not what we&#39;re talking about). This is about what happens when a superb, highly-skilled technical contributor moves from a programmer position into a management job.&lt;/p&gt;
&lt;p&gt;In some cases, there may be a relatively smooth transition: as a developer gets more and more senior, she takes on further responsibilities as a technical leader, as a team lead, and finally as a front-line manager. It&#39;s an interesting situation, because what the organization is doing (whether it admits it or not) is saying,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because she is a skilled technical contributor, we want her to stop doing what she&#39;s good at and start doing other stuff.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In some cases, it&#39;s done merely to help the individual proceed into a career path with more authority and money. However, that path is dangerous: I mean, you&#39;re telling someone who is at the &#34;top of her game&#34; to stop doing what she&#39;s valued for, and start doing something almost, but not quite, exactly different.&lt;/p&gt;
&lt;p&gt;Smart organizations will say something almost, but not quite, exactly similar:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because she is a skilled technical contributor, we want her to leverage her skills among a larger group of people.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;See what I did there?&lt;/p&gt;
&lt;p&gt;In the first case, the transition is done for the individual; in the second, it&#39;s done to benefit the team. It almost goes without saying that the first transition is often problematic for the organization, while the second can be much more beneficial.&lt;/p&gt;
&lt;p&gt;In both cases, the individual is shifting roles; in the first case, however, there&#39;s not a clear expectation as to what the organization hopes to achieve in the transition. In the second, however, it&#39;s very clearly stated that the hope is to move the new manager&#39;s skills to a larger team.&lt;/p&gt;
&lt;p&gt;It&#39;s vitally important that organizations understand this transition, and that they support new managers in their role. Being a manager is not simply being a programmer but suddenly having more authority; it actually represents a shift from &lt;em&gt;doing&lt;/em&gt; to &lt;em&gt;enabling&lt;/em&gt;. This is usually much more easily understood: most good technical contributors have already spent some time with the younger, less-skilled members of the team, helping them to learn quickly what she has had to learn by experience.&lt;/p&gt;
&lt;p&gt;The biggest change for the new manager is that &lt;em&gt;managing does not involve writing code&lt;/em&gt;. Sadly, some organizations want their top contributors to keep doing what they&#39;ve been doing, but also take on management responsibilities. This, in my humble opinion, is a huge mistake. You&#39;ve set the new manager up for failure by doing this; very few individuals can actually continue to maintain a high level of output while learning the new skills required in a management role. It&#39;s &lt;em&gt;much&lt;/em&gt; better to make a clean transition; once a person steps into a management role, the expectation of deliveries shifts from the individual to the team.&lt;/p&gt;
&lt;p&gt;The new manager now has to delegate, train, and support her team members instead of delivering. There&#39;s a huge temptation to jump in and &#34;do things right,&#34; as she has been used to doing for so long.  (And, honestly, if the situation is critical, it might still need to happen.) However, the organization will be better off in the long run if she can help her team take on the tasks that she was used to performing.&lt;/p&gt;
&lt;p&gt;In this case, the move to management becomes a &#34;force multiplier,&#34; to use a military term. Instead of one great developer, you now have five or ten developers who are all moving to that level. The team is correspondingly more productive, and the transition is happier for all concerned.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/the-management-transition.html</guid>
                </item>
            
                <item>
                    <title>Happy Birthday</title>
                    <link>http://glencampbell.co/essays/happy-birthday.html</link>
                    <pubDate>Thu, 18 Apr 2013 08:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;In April, 1991, lots of things were happening. My wife, Anita, was pregnant with our first child (due at the end of May), and I had two job offers in front of me. One was as a systems administrator for the University of Texas Balcones Research Center, and the other was a technical writer for &lt;a href=&#34;http://www.bmc.com&#34;&gt;BMC Software&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I ended up accepting the BMC job, and scheduled my last day of work (at the Texas Education Agency) for Wednesday, April 17, with a start date on my new job of April 22. That gave me five days in which to be unemployed; I planned on going fishing.&lt;/p&gt;
&lt;p&gt;Plans were changed.&lt;/p&gt;
&lt;p&gt;For several prior weeks, Anita had been having breathing difficulties.  The doctors who examined her thought that she was having problems with her asthma, a known issue. On Tuesday, April 16, we had a sonogram with our regular gynecologist. She referred us to a specialist who examined her lungs. He determined that, in fact, she didn&#39;t have asthma, but had a build-up of fluid in her lungs. He prescribed a diuretic and sent us home.&lt;/p&gt;
&lt;p&gt;The next morning, April 17, Anita was still having problems. Since she wasn&#39;t up to going to work, I left her at her parents&#39; house while I went into the office to basically pack up my desk and get ready to move out. Anita&#39;s parents had business to take care of in west Texas, so they left to spend the night in Junction, TX, about 200 miles away from Austin.&lt;/p&gt;
&lt;p&gt;When I reached work, I had a message waiting from the gynecologist.  She told me that, after reviewing Anita&#39;s case, she was growing concerned. Anita had, as she put it, &#34;a lot of little problems, none of which by itself was terribly bad, but, when put together, was a cause for concern.&#34; So I basically threw everything on my desk into a box, said a hasty goodbye.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/gecampbell/11069180664/&#34; title=&#34;IMG_0309 by gecampbell, on Flickr&#34;&gt;&lt;img src=&#34;http://farm6.staticflickr.com/5484/11069180664_9373c680f8.jpg&#34; width=&#34;333&#34; height=&#34;500&#34; alt=&#34;IMG_0309&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I picked Anita up from her parents&#39; house, told her what the gynecologist had said, and we drove to Seton Medical Center.  They admitted her and put her into a room on the maternity ward. That afternoon and evening was a series of tests, x-rays, and just plain observation. I honestly don&#39;t remember a lot of what went on.&lt;/p&gt;
&lt;p&gt;During the night, Anita&#39;s condition worsened; I had set up a folding cot in her room, and I remember her being taken for a chest x-ray at 2:00 o&#39;clock in the morning. Around 3 o&#39;clock, the gynecologist told me that she had, in essence, decided to take the baby early.  The sonogram from the day before showed that the baby was about five pounds. Her decision, she said, was whether to take the baby now (at 3 a.m.), or to wait for the morning when a full staff would be available. She wanted to wait for the staff to arrive, of course, but she might have to operate sooner if Anita&#39;s blood oxygen level dropped below 85%.&lt;/p&gt;
&lt;p&gt;If you&#39;re familiar with this, a blood oxygen level of 98% is normal; anything below 95% is bad, and it&#39;s really rare for someone to drop below 90%. At this point, Anita was on 100% oxygen, and she appeared to be pretty stable.&lt;/p&gt;
&lt;p&gt;The decision was made to wait until morning so that a full staff would be available. Around 8AM, I called friends and family from work and let them know what was happening. I held Anita&#39;s hand as they moved her bed into the elevator to go down to the operating room, then went up to the waiting area on the maternity floor (I was not allowed to be present during the surgery).&lt;/p&gt;
&lt;p&gt;Our friend Glenda showed up a few minutes later, and we waited together until a nurse came up to tell us what was going on. The C-section went well, and Elam was taken to the neonatal ICU (on the top floor of the hospital), while Anita went to the cardiac ICU (in the basement). Since we couldn&#39;t go to Anita&#39;s ICU, we went upstairs and met Elam for the first time.&lt;/p&gt;
&lt;p&gt;Neonatal ICU has a very strict rules; you have to scrub your hands (and arms) for about five minutes before you put on scrubs and are allowed to go in. We finally washed up, and arrived in time to see him pee all over the nurse. &#34;Well, we know that his plumbing is working,&#34; she said.&lt;/p&gt;
&lt;p&gt;In the neonatal ICU, Elam was doing well. He had had some breathing troubles initially; they told me, however, that this was not uncommon in C-section babies. Typically, the compression of a normal birth helped to push a lot of the fluid out of the lungs. Once his lungs cleared up a bit, he was fine, though a bit small. He initially weighed about five pounds; the day after he was born, he dropped down to around 4 pounds, 9 ounces (again, this is commonly caused by fluid loss and wasn&#39;t a real cause for concern).&lt;/p&gt;
&lt;p&gt;Once we verified that Elam was fully functional, Glenda and I went downstairs to see how Anita was doing. The short answer was: not good.&lt;/p&gt;
&lt;p&gt;Once they let us into the cardiac/pulmonary ICU, we were escorted to her room. At the time we arrived, they were trying to take her off the respirator. I can recall seeing her thrashing around on the bed, her eyes frantically flickering around the room, and the monitor over her head indicated that her blood pressure was 295/180. Various alarms were going off, and it seemed like there were a dozen doctors and nurses in her room. The OBGYN saw me and hurriedly moved me back towards the waiting room.&lt;/p&gt;
&lt;p&gt;Her initial explanation was that Anita &amp;quot;wasn&#39;t coming off the vent [respirator] very well,&amp;quot; and that the team of doctors had decided to let her &amp;quot;rest for a while.&amp;quot; Basically, they left her with the ventilator in place, put her on sedatives and Trachrium (a muscle relaxant), and left her to sleep for a while.&lt;/p&gt;
&lt;p&gt;At some point, my brother Mark had arrived from San Antonio. Since Anita&amp;#39;s ICU only allowed visitors every two or three hours (and then only for 15 minutes), he drove me home so that I could take a shower and change clothes. The rest of that day is still somewhat vague in my memory.&lt;/p&gt;
&lt;p&gt;The next few days were a blur; visiting Anita (when allowed) in the basement, and Elam in the neonatal unit. On the Saturday after the birth, Anita had an &#34;event&#34;&amp;mdash;Adult Respiratory Distress Syndrome (ARDS). This is where, because of the ventilator, the longs lose their elasticity and have trouble functioning. Luckily, one of the premier pneumatologists in the area was present, and he was able to adjust the ventilator.&lt;/p&gt;
&lt;p&gt;Once past that crisis, she improved markedly, until she was able to be removed from the ventilator and moved to a private room, and ultimately discharged. Elam stayed in the neonatal unit for another few days, and he finally came home about two weeks after being born.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/happy-birthday.html</guid>
                </item>
            
                <item>
                    <title>Sacred Spaces</title>
                    <link>http://glencampbell.co/essays/sacred-spaces.html</link>
                    <pubDate>Tue, 16 Apr 2013 14:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Every organization has its &#34;sacred spaces,&#34; those physical locations that help contain the identity of the organization. For decades now, for example, Silicon Valley prided itself on the &#34;open&#34; culture, represented by cubicles that even the senior management shared. When I worked for &lt;a href=&#34;http://www.yahoo.com&#34;&gt;Yahoo!&lt;/a&gt;, for example, the CEO had a cubicle (he or she also had a private office, but we weren&#39;t supposed to know about that). This meant that the CEO was &#34;one of us&#34; and was supposedly approachable.&lt;/p&gt;
&lt;p&gt;In reality, of course, different people have different needs. People involved in design or technical support need to collaborate; their workspaces should foster open communication and easily sharing graphic, visual elements. Sales people need to keep their energy levels up; they tend to rely on a team of people to help support them through sometimes challenging periods. (Of course, these are gross generalizations and do not apply everywhere, but that&#39;s the value of generalizations.)&lt;/p&gt;
&lt;p&gt;Software developers (programmers) have different needs, &lt;em&gt;especially while they are programming.&lt;/em&gt; Specifically, &lt;a href=&#34;http://www.construx.com/Resources/Newsletter_Articles/Creating_an_Excellent_Software_Development_Environment/&#34;&gt;numerous studies&lt;/a&gt; have shown that software developers have maximum productivity when they have 4-6 hours of &lt;em&gt;uninterrupted&lt;/em&gt; time in which to write code. Note that this applies only when they are actively writing code; when they collaborate (for example, to design things or review something), they need a more collaborative environment.&lt;/p&gt;
&lt;p&gt;And note, too, that &lt;em&gt;uninterrupted&lt;/em&gt; means, specifically, no visual or auditory distractions for the entire duration. Programming at a high level requires an intense, effortless concentration&amp;mdash;what psychologists call a &#34;&lt;a href=&#34;http://en.wikipedia.org/wiki/Flow_(psychology)&#34;&gt;flow state&lt;/a&gt;&#34; and what most people refer to as &#34;in the zone.&#34; It takes, at a minimum, 15-20 minutes (and often longer) for a person to reach this state. In an open-plan office, with conversations and other activities going on all the time, it is nearly impossible to go 20 minutes with &lt;em&gt;no&lt;/em&gt; distractions. Thus, companies that force their software developers to work in an open-cubicle, group situation are &lt;em&gt;guaranteeing&lt;/em&gt; that those people will operate at a vastly reduced efficiency.&lt;/p&gt;
&lt;p&gt;In effect, those companies value the cultural artifacts (community, openness, collaboration) above the actual productivity of the individual developer. Their &#34;sacred space&#34; forces their employees to work at a lower level in return for some vague perception of cultural conformity.&lt;/p&gt;
&lt;p&gt;Software developers are not prima donnas, nor do they think of themselves as somehow &#34;better&#34; than anyone else in the organization. In reality, they perform a highly-skilled activity that requires a very specific physical environment for them to perform at a maximum level. Imagine forcing premier athletes to run the 100m dash in high heels. In might look good, but their performance will suffer. Pay attention to the environment of your developers, and it will reward you with great results.&lt;br /&gt;
&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/sacred-spaces.html</guid>
                </item>
            
                <item>
                    <title>Is the Internet still up?</title>
                    <link>http://glencampbell.co/essays/is-the-internet-still-up.html</link>
                    <pubDate>Sat, 06 Apr 2013 09:10:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;I know that you, like me, have often wondered whether or not the
Internet is still running. Now you need worry no more. I have created
the Internet status page:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://internet-status.info&#34;&gt;http://internet-status.info&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simply point your browser to this site, and it will let you know
if the Internet is still up after running an exhaustive series of
checks, including verifying every single intermediate node (router,
firewall, proxy, or cache) between your browser and the Internet.&lt;/p&gt;
&lt;p&gt;Available in multiple languages based on your system&#39;s language
settings.&lt;/p&gt;
&lt;p&gt;Want to know how the magic happens? &lt;a href=&#34;https://github.com/gecampbell/internet-status.info&#34;&gt;The source code is available
on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a name=&#34;faq&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Frequently-Asked Questions&lt;/h2&gt;
&lt;h3&gt;Why did you create this site?&lt;/h3&gt;
&lt;p&gt;So I&#39;d know if the Internet was up.&lt;/p&gt;
&lt;h3&gt;How does it verify that the Internet is up?&lt;/h3&gt;
&lt;p&gt;By using HTTP over TCP/IP. Also, HTML.&lt;/p&gt;
&lt;h3&gt;Can I donate to this project?&lt;/h3&gt;
&lt;p&gt;The thanks of a grateful world is all I need.&lt;/p&gt;
&lt;h3&gt;What do I do if the Internet is down?&lt;/h3&gt;
&lt;p&gt;Press the RESET button.&lt;/p&gt;
&lt;h3&gt;Does it really verify that the Internet is up?&lt;/h3&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;h3&gt;Really really?&lt;/h3&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;h3&gt;The whole thing?&lt;/h3&gt;
&lt;p&gt;Technically, it only verifies the portion of the Internet that
is visible to you. But, really, that&#39;s the only part that counts,
right?&lt;/p&gt;
&lt;h3&gt;Do you ever add new features?&lt;/h3&gt;
&lt;p&gt;Of course; what software developer doesn&#39;t allow feature creep?
You can check out the
&lt;a href=&#34;http://x.internet-status.info&#34;&gt;experimental
version of the site&lt;/a&gt; for new features as they are added.&lt;/p&gt;
&lt;h3&gt;Is this an open-source project?&lt;/h3&gt;
&lt;p&gt;Yes. The source code is
&lt;a href=&#34;https://github.com/gecampbell/internet-status.info&#34;&gt;available
on Github&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Will you accept pull requests?&lt;/h3&gt;
&lt;p&gt;Gladly. They may be subjected to a very high level of peer review
and analysis, however, given the strategic nature of the Internet.&lt;/p&gt;
&lt;h3&gt;What languages is this available in?&lt;/h3&gt;
&lt;p&gt;Currently: English, Esperanto, Spanish, Finnish, Norwegian, Danish,
German, French, Korean, Russian, and Chinese (Simplified).&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/is-the-internet-still-up.html</guid>
                </item>
            
                <item>
                    <title>Playing Around</title>
                    <link>http://glencampbell.co/essays/playing-around.html</link>
                    <pubDate>Thu, 04 Apr 2013 09:40:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;I was with a number of musicians this evening; they were preparing
for a rehearsal by playing around on their instruments. It&#39;s a
common occurrence in creative endeavors; they weren&#39;t practicing
scales, or harmony, or even trying very hard to make a tune. They
were simply doodling around, getting ready to play.&lt;/p&gt;
&lt;p&gt;In sports, I think this would be the equivalent of &#34;loosening up&#34;
before a game or a practice session. People are recalling the muscle
memory and the mental preparation necessary for engaging in a
highly-skilled activity.&lt;/p&gt;
&lt;p&gt;This happens with computer programmers, too. Programmers, especially
when they&#39;re learning a new language, tool, or system, tend to &#34;play
around&#34; and write code to help them figure out how it all works.
It&#39;s a form of loosening their mental muscles before diving into
the task at hand. And, more specifically, it helps them to identify
&#34;best practices&#34; for the particular situation. For example, playing
around with a database can teach a developer about the best ways
to model data structures in code that can handle the data efficiently.
Playing around with a RESTful API can help them to better understand
the different mechanisms for executing and controlling HTTP sessions.&lt;/p&gt;
&lt;p&gt;The best and most senior developers spend quite a bit of time just
playing around because they understand that this is a crucial part
of the creative process. To use something, you must be able to
understand it, and playing around it is the best way to do that.&lt;/p&gt;
&lt;p&gt;Junior developers tend to want to dive straight into the code; I
think they feel that it&#39;s a sign of professionalism to be able to
start and complete programming tasks in a timely manner. At least,
I felt that way, too, when I was a younger programmer. However, the
sheer &lt;em&gt;usefulness&lt;/em&gt; of playing around with things almost always
trumps the ability to dive in and write some code.&lt;/p&gt;
&lt;p&gt;The fact remains that programming is a creative endeavor, and not
necessarily a highly structured one. For any given problem, there
are almost always multiple potential solutions, and playing around
with them can teach the programmer a lot about the various pros and
cons of them.&lt;/p&gt;
&lt;p&gt;Of course, playing around can be taken to the extreme, where it
actually passes the point of usefulness and turns into a pointless
exercise in coding (sort of like how one link leads to another on
&lt;a href=&#34;http://wikipedia.org&#34;&gt;Wikipedia&lt;/a&gt;, with everything ending up on
&#34;Philosophy&#34; eventually). However, the actual constraints of the
job (the necessity to deliver something by an agreed-upon date)
will usually pull the developer back to reality.&lt;/p&gt;
&lt;p&gt;As a manager, you need to direct your programmers; they should be
encouraged to play around with things, but they may also need to
be mentored as to how to analyze what they&#39;re doing and thus gain
useful knowledge. Senior developers and architects, especially,
need to be encouraged to play around with things; this will greatly
improve their knowledge of the system or technology.&lt;/p&gt;
&lt;p&gt;And, in some cases, that &#34;playing around&#34; can turn into something
truly wonderful.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/playing-around.html</guid>
                </item>
            
                <item>
                    <title>On Longer Days</title>
                    <link>http://glencampbell.co/essays/on-longer-days.html</link>
                    <pubDate>Sat, 30 Mar 2013 21:00:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Percussive sounds of rain&lt;br&gt;
Accompany whistling gusts&lt;br&gt;
That announce the arrival of a front.&lt;br&gt;
Coffee in the morning, solitary&lt;br&gt;
Browsing online, mist rising&lt;br&gt;
Above the rain-slicked vegetation&lt;br&gt;
And I think, &#34;Bread.&#34;&lt;/p&gt;
&lt;p&gt;Coffee requires toast.&lt;br&gt;
Toast requires thought, and&lt;br&gt;
Butter, and jam.&lt;br&gt;
Coffee, toast, and jam,&lt;br&gt;
On a rain-dark day, and this is&lt;br&gt;
The nothing that is more.&lt;/p&gt;
&lt;p&gt;On Tuesday, the television craps&lt;br&gt;
And dismembers the news. Tanker&lt;br&gt;
Truck demolishes a family. Pixels are&lt;br&gt;
A falsehood on the screen; real flesh,&lt;br&gt;
Real blood, real mourning, screams&lt;br&gt;
That tear at throats and longer days&lt;br&gt;
With tears and loss and empty mornings&lt;br&gt;
Survived with coffee and no peace.&lt;/p&gt;
&lt;p&gt;On Friday, the traffic increases,&lt;br&gt;
People fleeing town, somewhere&lt;br&gt;
Better lures them, hopes for&lt;br&gt;
A longer day, rain-slicked chairs,&lt;br&gt;
And coffee, perhaps, with toast&lt;br&gt;
And jam and maybe&lt;br&gt;
Eggs.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/on-longer-days.html</guid>
                </item>
            
                <item>
                    <title>Chapter One</title>
                    <link>http://glencampbell.co/essays/chapter-one.html</link>
                    <pubDate>Sat, 30 Mar 2013 17:42:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Karl lay flat on the damp leaves under the pines, trying to catch
his breath. It had been a long struggle up hill to this point, and
he didn&#39;t want to give away his position with his heavy breathing.
The dozen or so deer were about 400 meters in front of him; all doe
except for one annoying buck that was interested in more than food.&lt;/p&gt;
&lt;p&gt;Once he caught his breath, Karl scanned the area. The deer were in
a small clearing in the middle of the forest. Naturally nervous
about open areas, they were hugging the edges but were attracted
by the vegetation out under the sky. The smaller ones&amp;mdash;yearlings&amp;mdash;had
less caution and advanced a bit ahead of the rest. Meanwhile, the
buck was trying (and failing) to approach some of the older, larger
doe.&lt;/p&gt;
&lt;p&gt;Karl wasn&#39;t interested in the buck. It, too, looked like a yearling,
with only a couple of short, spiky antlers. But several of the doe
were at least 100 lbs, enough to provide meat for weeks if not
months.&lt;/p&gt;
&lt;p&gt;Still in his prone position, Karl unslung his rifle from his back,
cautiously made sure that the shell was chambered and the safety
on, and tilted his head to look through the scope. As the largest
doe came into focus, he noticed slight movement in the trees beyond
the far side of the clearing.&lt;/p&gt;
&lt;p&gt;A gunshot broke the still morning air, and the deer immediately
scattered, running in several  directions. Karl didn&#39;t notice that,
however, because his eyes were trained on the image in his scope:
a man, his skull bloody and seemingly exploded, fell backward from
the cover of the trees to land with a thump on the ground.&lt;/p&gt;
&lt;p&gt;Karl watched, frozen with fear. Long training kept his rifle still,
though his heart was suddenly racing. As he watched, another man,
dressed in an orange hunting vest, stepped out of the trees, walked
over to the body, carefully pointed a pistol at it, and shot three
more times.&lt;/p&gt;
&lt;p&gt;The man with the pistol lifted his head and scanned the area. Karl
held his breath, sure that his own bright clothing would give him
away. But, no, the eyes flickered past him, and the man turned and
walked back into the woods.&lt;/p&gt;
&lt;p&gt;Karl realized that he had been holding his breath the whole time;
it seemed like minutes, but was probably only a few seconds. He let
his breath out cautiously, still unwilling to believe that he was
invisible. He wondered if he should try to help them man who had
been shot: with four gunshot wounds from close range, however, it
was unlikely that there was anything Karl could do.&lt;/p&gt;
&lt;p&gt;He tried to get his bearings, and moved the scope slowly from left
to right across the clearing. On the right side, past the tree line,
he could see some distant power pylons, and he knew where he was.
He had parked his truck on the road by the power-line cut, and had
headed south in pursuit of the deer. They had apparently traced a
semi-circular route, and he was now looking north back towards the
same powerlines. That meant that his truck was only a few thousand
meters in that direction, but that was roughly the same direction
in which the unknown shooter had gone.&lt;/p&gt;
&lt;p&gt;Karl pulled out his phone and checked the time; he decided that he
wouldn&#39;t do anything for five minutes, and lay back down to wait.
It seemed like an eternity, with every stick and rock beneath him
making itself known. But he forced himself to watch the time on his
phone and, when the five minutes was up, he cautiously stood up.&lt;/p&gt;
&lt;p&gt;Again, he scanned the clearing and saw nothing. Before heading back
to his truck, he headed over to check on the dead man.&lt;/p&gt;
&lt;p&gt;Karl had seen blood before; he had killed and skinned many deer in
his life, and he had even helped attempt to rescue a young family
from a gruesome wreck he encountered on his way to college when he
was only 19. Nothing really prepared him for what he saw when he
reached the body, however. The head was nearly gone, with bits of
blood and gray matter scattered around the ground. And there was a
single gunshot wound to the heart.&lt;/p&gt;
&lt;p&gt;Karl knew enough to not touch anything. He also knew that
scavengers&amp;mdash;birds, cats&amp;mdash;would be here within minutes, so he very
carefully took pictures of everything: the body, the woods where
the two men had come from, the shell casings still lying on the
ground, and the faint, indistinct footprints in the damp earth. He
knew that the phone in his camera would record the location via its
internal GPS, and he assumed that the police could use that to find
their way back here.&lt;/p&gt;
&lt;p&gt;Feeling like there was nothing more to be done, he turned and,
giving the body a wide berth, headed back towards his truck.&lt;/p&gt;
&lt;p&gt;Thinking about what he had just seen, he was scarcely paying attention
as he drew close to the road and heard voices ahead. He instantly
froze and warily peered through the trees. He could see his car
where he had left it, parked by the side of the road about 50 meters
in front of him. Immediately behind it was the local sheriff&#39;s
cruiser, lights flashing.&lt;/p&gt;
&lt;p&gt;Karl let out a sigh of relief and realized that he had been holding
his breath. Someone had heard the shot, surely, and called 9-1-1.
He moved forward another few steps and saw the sheriff standing
behind the cruiser. He seemed to be talking to someone. As Karl
approached, he suddenly realized that the person to whom the sheriff
was speaking was the same man he had seen through his scope.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/chapter-one.html</guid>
                </item>
            
                <item>
                    <title>Continuous Integration for php-opencloud</title>
                    <link>http://glencampbell.co/essays/continuous-integration-php-opencloud.html</link>
                    <pubDate>Sat, 30 Mar 2013 08:30:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;This morning, I added the &lt;a href=&#34;http://php-opencloud.com&#34;&gt;php-opencloud&lt;/a&gt;
library to the &lt;a href=&#34;http://travis-ci.org&#34;&gt;Travis continuous integration service&lt;/a&gt;.
Travis is a very cool service that automates continuous code testing.
It hooks into the &lt;a href=&#34;https://github.com&#34;&gt;Github&lt;/a&gt; system
and automatically performs tests whenever new code is pushed. If there are
errors, it will
send out notifications of the build status via IRC or email.&lt;/p&gt;
&lt;p&gt;It makes it easy to do some things that have been a real pain for me, such
as testing against multiple versions of PHP. It&#39;s difficult to
maintain various versions of PHP for testing on my local laptop, so this
takes care of that for me.&lt;/p&gt;
&lt;p&gt;Setting this up is very simple; after you create an account using your
Github login, you simple create a file &lt;code&gt;.travis.yml&lt;/code&gt; in the root of
your repository. The one for php-opencloud looks like this:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;err&#34;&gt;language:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;php&lt;/span&gt;
&lt;span class=&#34;err&#34;&gt;php:&lt;/span&gt;
  &lt;span class=&#34;err&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;&amp;quot;5.5&amp;quot;&lt;/span&gt;
  &lt;span class=&#34;err&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;&amp;quot;5.4&amp;quot;&lt;/span&gt;
  &lt;span class=&#34;err&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;&amp;quot;5.3&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This merely informs Travis that it uses &lt;a href=&#34;http://php.net&#34;&gt;PHP&lt;/a&gt; and that it
should be testing against those specified versions.&lt;/p&gt;
&lt;p&gt;As an example as how Travis has already helped me, I don&#39;t even have PHP
version 5.5 on my laptop. I&#39;m now getting test coverage there without
having to install it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://travis-ci.org/rackspace/php-opencloud&#34;&gt;Click here for the Travis data&lt;/a&gt;.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/continuous-integration-php-opencloud.html</guid>
                </item>
            
                <item>
                    <title>Today-Now</title>
                    <link>http://glencampbell.co/essays/today-now.html</link>
                    <pubDate>Sun, 24 Mar 2013 18:40:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;Your browser&#39;s home page should be something that is useful, even when
viewed repeatedly. In my case, I wanted a page that would display the
current time: a web clock, if you will.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/gecampbell/8589451624/&#34; title=&#34;today-now.com by gecampbell, on Flickr&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8377/8589451624_fef3f7b3ab_n.jpg&#34; width=&#34;315&#34; height=&#34;320&#34; alt=&#34;today-now.com&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don&#39;t need it to be accurate to the second, but I do need it to be
as accurate: it needed to conform to the
&lt;abbr title=&#34;Network Time Protocol&#34;&gt;NTP&lt;/abbr&gt; standard so that it was
never running fast or slow.&lt;/p&gt;
&lt;p&gt;The result was &lt;a href=&#34;http://itime.io&#34;&gt;itime.io&lt;/a&gt;, a simple little
site that displays the time and date. It has features for customizing
the appearance, and though the time only updates every 20 seconds or
so, it is as accurate as the server&#39;s clock.&lt;/p&gt;
&lt;p&gt;The source code is
&lt;a href=&#34;https://github.com/gecampbell/today-now.com&#34;&gt;available on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.S. It has kittens.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/today-now.html</guid>
                </item>
            
                <item>
                    <title>Boost your website performance</title>
                    <link>http://glencampbell.co/essays/web-performance.html</link>
                    <pubDate>Sat, 23 Mar 2013 17:35:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;One of the reasons I moved this site away from
&lt;a href=&#34;http://www.wordpress.org&#34;&gt;Wordpress&lt;/a&gt; is because the performance
was very poor. By using a static framework instead of having to
dynamically fetch content from a database and re-render the pages
with each view, the static architecture vastly speeds up the
server-side rendering.&lt;/p&gt;
&lt;p&gt;However, the biggest performance effects come on the client side.
Specifically, there are a number of things that you can do to improve
the performance of almost any site:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reduce the number of HTTP requests. This is the single biggest problem
   with most websites. Each HTTP request requires an additional
   access over the Internet, and the browser has to do this for
   every resource it needs to render the page: every CSS file,
   image, Javascript file, and so forth.  Some simple-looking pages
   need literally hundreds of HTTP requests to build them, and
   performance suffers because of it.&lt;/li&gt;
&lt;li&gt;Put the Javascript at the bottom of the page, preferably below the
   &lt;code&gt;&amp;lt;/html&amp;gt;&lt;/code&gt; tag. When the browser encounters a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag, all
   other processing ceases; it no longer downloads resources in
   parallel, and everything has to wait until the Javascript is
   finished parsing and running.&lt;/li&gt;
&lt;li&gt;Cache everything. Resources load the fastest when they don&#39;t have to be
   fetched from the source each time.&lt;/li&gt;
&lt;li&gt;Compress the content. Using GZIP compression can reduce the total amount
   of data transferred by 50% or more.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are a number of other tips and tricks that you can do, but
these will have the most impact.  See the &lt;a href=&#34;http://developer.yahoo.com/performance/rules.html&#34;&gt;Yahoo! best practices
for speeding up your
site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://gtmetrix.com/reports/glen-campbell.com/LXUbW8Lw&#34;&gt;Click here&lt;/a&gt;
for a performance analysis of the home page of this site.&lt;/p&gt;
&lt;p&gt;For reference, here is the &lt;code&gt;.htaccess&lt;/code&gt; file that I use:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;c1&#34;&gt;# custom 404 handler&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ErrorDocument&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;404&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# set expires headers&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresActive&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;On&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresDefault&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 10 minutes&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;png&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 1 month&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jpeg&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 1 month&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gif&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 1 month&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;icon&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 1 month&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;audio&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mp3&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 10 years&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;css&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 10 years&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;javascript&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 2 months&amp;quot;&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;ExpiresByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;javascript&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;quot;access plus 2 months&amp;quot;&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# compress text, html, javascript, css, xml:&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plain&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xml&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;css&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xml&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xhtml&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xml&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rss&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xml&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;javascript&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;AddOutputFilterByType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DEFLATE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;javascript&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# rewrite to break caches&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;RewriteEngine&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;On&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;RewriteBase&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# rewrite versioning for CSS, JS&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;RewriteRule&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;^&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/.*)$  $1          [PT]&lt;/span&gt;
&lt;span class=&#34;sr&#34;&gt;# redirect wordpress-style RSS feed&lt;/span&gt;
&lt;span class=&#34;sr&#34;&gt;RewriteRule ^feed/&lt;/span&gt;          &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rss&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xml&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;301&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;

&lt;span class=&#34;c1&#34;&gt;# turn off ETags&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;FileETag&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;From top to bottom:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Custom 404 page.&lt;/li&gt;
&lt;li&gt;Set expires headers for CSS, audio, and other files to be some distance
   in the future. This ensures that the browser can cache them.&lt;/li&gt;
&lt;li&gt;Compresses everything that can be compressed&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;footnote&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Funky custom rewrite rule that lets me version the CSS and Javascript files.
   See below for details.&lt;/li&gt;
&lt;li&gt;Turning off ETags. (Read the Yahoo! best practices; ETags are only useful
   if you&#39;re running on a single server. I have redundant servers behind a
   load balancer.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The real &#34;magic&#34; here is in the combination of the &lt;code&gt;ExpiresByType&lt;/code&gt;
and &lt;code&gt;RewriteRule&lt;/code&gt; lines. The &lt;code&gt;ExpiresByType&lt;/code&gt; ensures that CSS and
Javascript files have an &lt;code&gt;Expires:&lt;/code&gt; header set to 10 years in the
future. This means that the user&#39;s browser will keep them in its
cache, essentially forever.&lt;/p&gt;
&lt;p&gt;However, through the magic of the &lt;a href=&#34;http://httpd.apache.org/docs/current/mod/mod_rewrite.html&#34;&gt;Apache mod_rewrite
module&lt;/a&gt;, I&#39;m
not renaming the file each time; I&#39;m just giving it a different
URL.&lt;/p&gt;
&lt;p&gt;I&#39;m using &lt;a href=&#34;http://glen-campbell.com/essays/wok.html&#34;&gt;Wok&lt;/a&gt;, a static
site generator written in Python. Wok allows &#34;hooks&#34;; small pieces
of code that are executed at specific points in the generation
pipeline.  The &lt;code&gt;site.start&lt;/code&gt; hook is called at the beginning, before
anything is generated.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;site.start&lt;/code&gt; hook, I have a little bit of code that creates
a variable containing the current UNIX timestamp (the number of
seconds since January 1, 1970). In the templates that create the
base HTML for the pages, I insert that timestamp into the URL for
the CSS and JS files.&lt;/p&gt;
&lt;p&gt;So, for example, the CSS file that resides here:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;sr&#34;&gt;/css/g&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lenc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;css&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Gets turned into this when the HTML is generated:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;sr&#34;&gt;/v1364262362/css&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;glenc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;css&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Note that the file itself is not moved; it&#39;s only the reference to
it in the HTML that is modified. And here&#39;s where &lt;code&gt;mod_rewrite&lt;/code&gt;
comes into play. This rewrite rule:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;n&#34;&gt;RewriteRule&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;^&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;strips the &#34;version&#34; prefix (a literal &#34;v&#34; at the beginning followed
by a string of numbers) and continues processing the file.&lt;/p&gt;
&lt;p&gt;The result is that the file gets a new version number (and thus a
new URL) each time the site is published. Since the user&#39;s browser
does not have this new URL cached, it fetches it again from the
site, thus ensuring that any changes in styling or Javascript are
seen. If the site hasn&#39;t changed, then the file is retrieved from
the browser cache (or an intermediate caching proxy), thus preventing
an extra HTTP request to the site.&lt;/p&gt;
&lt;p&gt;This is done for all of the static assets on the site: CSS files,
Javascript files, and even some images.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; if you&#39;re looking through the source code, you&#39;ll see that
there&#39;s a bunch of other things that the &lt;code&gt;links.py&lt;/code&gt; file does. This
is mostly to support Wok&#39;s development server, which does not use
Apache. On the dev server, the hooks create a symbolic link from
the version directory to the top-level directory, thus resulting
in the correct URL for the static assets. Those links are removed
when the site is published.&lt;/p&gt;
&lt;div class=&#34;footnote&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Note that compression may cause problems on some older browsers.
Frankly, I don&#39;t care. If you&#39;re still running IE5, then I don&#39;t need
you as a reader.&amp;#160;&lt;a href=&#34;#fnref:1&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 1 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/web-performance.html</guid>
                </item>
            
                <item>
                    <title>Using Cloud Files CDN for podcasting</title>
                    <link>http://glencampbell.co/essays/podcast-cdn.html</link>
                    <pubDate>Fri, 22 Mar 2013 10:00:02 GMT</pubDate>
                    <description>
                        &lt;p&gt;While I&#39;ve been rebuilding this site&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; rel=&#34;footnote&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, I&#39;ve gathered together
all of my &lt;a href=&#34;/podcasts.html&#34;&gt;podcasts&lt;/a&gt; that I put together over the
last few years.  I didn&#39;t really want to serve all those MP3 files
from my cloud server account, since the bandwidth charges are high,
and large files like that could consume a lot of connections while
they are downloaded.&lt;/p&gt;
&lt;p&gt;Instead, I&#39;ve pushed all the files to the &lt;a href=&#34;http://www.rackspace.com/cloud/files/&#34;&gt;Rackspace Cloud
Files&lt;/a&gt; content distribution
network (CDN), which is built on top of Akamai. In this case, the
files can be served by a global network of edge caches, which means
that the performance will be better for the users and I won&#39;t incur
the bandwidth charges of serving them locally.&lt;/p&gt;
&lt;p&gt;To push the files, I&#39;ve created a fairly simple script that uses
the &lt;a href=&#34;http://php-opencloud.com&#34;&gt;php-opencloud&lt;/a&gt; library that I developed
for Rackspace&#39;s Cloud SDK for PHP.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/gecampbell/glen-campbell.com/blob/master/mp3/push-cdn.php&#34;&gt;Click here to view the entire source code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is pretty straightforward, but I&#39;ll point out a few details:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;At the beginning, I have &lt;code&gt;define(&#39;RAXSDK_TIMEOUT&#39;, 9999);&lt;/code&gt;. This
   ensures that the HTTP requests to transfer the data do not time out.
   Because the MP3 files are large, they would normally hit the hard
   timeout limit built into the SDK.&lt;/li&gt;
&lt;li&gt;I&#39;m using the &lt;code&gt;SetUploadProgressCallback()&lt;/code&gt; method to establish a
   function that will intermittently be called during the upload. That
   callback function (&lt;code&gt;upload_status()&lt;/code&gt;, at the end of the script) keeps
   a running total of bytes uploaded and provides visual feedback for the
   user. Otherwise, the script would appear to sit idle for long periods
   of time.&lt;/li&gt;
&lt;li&gt;To avoid the wait, I&#39;m only uploading new or modified files. The modified
   files are detected if the file size between the local copy and the CDN
   copy are different. New files are detected in the &lt;code&gt;try { ... } catch()&lt;/code&gt;
   block that surrounds the initial creation of the object. If the attempt
   to retrieve the object from Cloud Files fails, it creates a new, empty one.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hope this is useful to you; let me know if you have any feedback via the
Twitter button, below.&lt;/p&gt;
&lt;div class=&#34;footnote&#34;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;See &lt;a href=&#34;/articles/wok.html&#34;&gt;here&lt;/a&gt; for details.&amp;#160;&lt;a href=&#34;#fnref:1&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 1 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/podcast-cdn.html</guid>
                </item>
            
                <item>
                    <title>Macaroni 'n' Cheese</title>
                    <link>http://glencampbell.co/essays/mac-n-cheese.html</link>
                    <pubDate>Thu, 21 Mar 2013 16:27:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;This is my variation of &lt;a href=&#34;http://www.foodnetwork.com/recipes/alton-brown/stove-top-mac-n-cheese-recipe/index.html&#34;&gt;Alton Brown&#39;s Stovetop Mac&#39;n&#39;Cheese&lt;/a&gt;.  I chose to modify his, not because I think I&#39;m a superior chef, but because his recipe used strange volumes of ingredients; for example, his version calls for 10 ounces of cheese, but all the bagged shredded cheese in the grocery store comes in 8 or 12 ounce packages.&lt;/p&gt;
&lt;h3&gt;Ingredients&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;12 ounces elbow macaroni&lt;/li&gt;
&lt;li&gt;6 tablespoons butter&lt;/li&gt;
&lt;li&gt;2 eggs&lt;/li&gt;
&lt;li&gt;12 ounces evaporated milk&lt;/li&gt;
&lt;li&gt;1/2 teaspoon hot sauce (more to taste)&lt;/li&gt;
&lt;li&gt;1 teaspoon kosher salt&lt;/li&gt;
&lt;li&gt;Fresh black pepper&lt;/li&gt;
&lt;li&gt;3/4 teaspoon dry mustard&lt;/li&gt;
&lt;li&gt;12 ounces sharp cheddar, shredded&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Directions&lt;/h3&gt;
&lt;p&gt;In a large pot of boiling, salted water cook the pasta to al dente and drain. Return to the pot and melt in the butter. Toss to coat.&lt;/p&gt;
&lt;p&gt;Whisk together the eggs, milk, hot sauce, salt, pepper, and mustard. Stir into the pasta and add the cheese. Over low heat continue to stir for 3 minutes or until creamy.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/mac-n-cheese.html</guid>
                </item>
            
                <item>
                    <title>Working with Wok</title>
                    <link>http://glencampbell.co/essays/wok.html</link>
                    <pubDate>Thu, 21 Mar 2013 07:45:00 GMT</pubDate>
                    <description>
                        &lt;p&gt;This site is built using the &lt;a href=&#34;http://wok.mythmon.com&#34;&gt;Wok&lt;/a&gt; static website
generator. The source for it is mostly plain text files in
&lt;a href=&#34;http://daringfireball.net/projects/markdown/&#34;&gt;Markdown&lt;/a&gt; format, and it is generated and then synced to the server.&lt;/p&gt;
&lt;p&gt;This method of maintaining the site has several advantages over using,
for example, &lt;a href=&#34;http://www.wordpress.org&#34;&gt;Wordpress&lt;/a&gt; to dynamically generated
the site.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Since all the pages are static HTML, there is a vastly reduce change of
  a security breach because of the underlying code.&lt;/li&gt;
&lt;li&gt;Static pages load and render much faster in the user&#39;s browser,
  giving them a superior experience in many ways.&lt;/li&gt;
&lt;li&gt;All the content is stored in
  &lt;a href=&#34;https://github.com/gecampbell/xlerb.com&#34;&gt;GitHub&lt;/a&gt;,
  which makes it trivial for me to maintain and recover in case something
  goes wrong.&lt;/li&gt;
&lt;li&gt;The server resources are much, much less than using Wordpress; I don&#39;t
  need an extra database, and the actual requirements of the server are
  much smaller.&lt;/li&gt;
&lt;li&gt;If I need to scale to support huge traffic (not that that&#39;s likely here),
  then all I need to do is replicate the server and add a load balancer
  in front of it.&lt;/li&gt;
&lt;li&gt;It has a local server where I can test the site before I publish it, which
  gives me a chance to fix errors before they go live.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like any technology, however, there are tradeoffs. Here are some of the
reasons you wouldn&#39;t want to build every site in this manner:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&#39;s fairly complicated. You need to install a bunch of software on your
  computer, since the burden of rendering the site is shifted to your
  local machine from the server.&lt;/li&gt;
&lt;li&gt;It&#39;s more difficult to add images; they need to be manually resized and
  stored before you can add them to pages. Wordpress has a number of
  very powerful features for image manipulation, even automatically pushing
  images to their content distribution network (CDN) so that they load
  faster in the user&#39;s browser.&lt;/li&gt;
&lt;li&gt;There&#39;s no fancy user interface for building and maintaining the site
  content. I&#39;m editing this using a simple, plain text editor; it&#39;s an
  experience that many users are not comfortable with.&lt;/li&gt;
&lt;li&gt;Wok is an open-source project that&#39;s built using other open-source
  projects, and the documentation is poor. It&#39;s hard to find things; like
  many open-source projects, the authors really expect you to read the
  source code.&lt;/li&gt;
&lt;li&gt;With Wordpress, you have access to a vast library of themes and lots of
  support. With a system like this, you&#39;re pretty much on your own.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Would I recommend this approach? In general, no. It&#39;s really much easier
to set up a Wordpress site than it is to get something like this working.
On the other hand, if you&#39;re a hacker like I am, it can provide a compelling
experience for the user while making it easy for me to maintain.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/wok.html</guid>
                </item>
            
                <item>
                    <title>Programmable DNS</title>
                    <link>http://glencampbell.co/essays/programmable-dns.html</link>
                    <pubDate>Tue, 05 Mar 2013 11:59:38 GMT</pubDate>
                    <description>
                        &lt;p&gt;I recently released a new version of &lt;a href=&#34;http://php-opencloud.com&#34;&gt;php-opencloud&lt;/a&gt; that includes support for &lt;a href=&#34;http://www.rackspace.com/cloud/dns&#34;&gt;Rackspace Cloud DNS&lt;/a&gt;. This is a free service for managing your DNS (free if you have a cloud account). I&#39;ve used numerous DNS services before (and I&#39;ve even hosted my own BIND server), and most of them operate in a similar manner: there&#39;s a control panel on the web, and you use it to make changes as needed. Some of those services go further by providing reports and other operations, but Rackspace Cloud DNS has a fully programmable API.&lt;/p&gt;
&lt;p&gt;It&#39;s been quite handy, for example to make mass changes to my domains. For example, let&#39;s say I want to change the email address associated with all of my domains.&lt;/p&gt;
&lt;script src=&#34;https://gist.github.com/gecampbell/7661597.js&#34;&gt;&lt;/script&gt;

&lt;p&gt;In this example, it simply loops through all the domains and updates the email address. This is much easier than logging into a control panel and manually updating dozens of domains.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/programmable-dns.html</guid>
                </item>
            
                <item>
                    <title>I accidentally my servers</title>
                    <link>http://glencampbell.co/essays/i-accidentally-my-servers.html</link>
                    <pubDate>Mon, 04 Mar 2013 11:14:46 GMT</pubDate>
                    <description>
                        &lt;p&gt;As you long-term readers of this blog know (both of you), I work for the &lt;a href=&#34;http://developer.rackspace.com&#34;&gt;Rackspace Developer Relations Group&lt;/a&gt;. I wrote the &lt;a href=&#34;http://php-opencloud.com&#34;&gt;php-opencloud&lt;/a&gt; language bindings that are used in the Rackspace Cloud SDK for PHP. As part of this development process, I create an awful lot of cloud objects: servers, blog storage volumes, virtual networks, load balancers, etc. So one of my steps is a script called &lt;a href=&#34;https://github.com/rackspace/php-opencloud/blob/master/samples/cleanup.php&#34;&gt;&lt;code&gt;cleanup.php&lt;/code&gt;&lt;/a&gt; that deletes &lt;em&gt;everything&lt;/em&gt; in my cloud account. And I do mean &lt;em&gt;everything&lt;/em&gt;: every server, every modicum of storage, every load balancer: EVERYTHING.&lt;/p&gt;
&lt;p&gt;On Friday, I ran this script whilst signed on under my personal cloud account, thus deleting &lt;em&gt;everything&lt;/em&gt;, at least in the DFW data center.&lt;/p&gt;
&lt;p&gt;Needless to say, this was not A Very Good Thing.&lt;/p&gt;
&lt;p&gt;Luckily, I am fairly religious about backing things up, and I was able to rapidly recover nearly everything within a few hours. The biggest single loss was my mailing lists[1. The reason that the mailing lists were not backed up was because of the size; I meant to get around to backing them up soon, but I should have done it sooner. It&#39;s totally my fault.] that I&#39;ve been running since 2001&amp;mdash;some of them had hundreds of members and tens of thousands of messages, and they&#39;re still gone. I think I have backups on CD somewhere in the house, but I&#39;ll have to dig them out.&lt;/p&gt;
&lt;p&gt;Oh, by the way, are you familiar with &lt;a href=&#34;http://www.rackspace.com/cloud/backup/&#34;&gt;Rackspace Cloud Backup&lt;/a&gt;? This service does automated, file-level backups hourly, daily, weekly, or monthly, and at a very reasonable cost. It&#39;s now running on all of my systems; if I had been running it before this incident, it might have helped me recover everything.&lt;/p&gt;
&lt;p&gt;And &lt;code&gt;cleanup.php&lt;/code&gt; has been modified so that it will only run in my test account.&lt;/p&gt;
&lt;p&gt;My apologies to those of you who tried to access this site during its unscheduled downtime on Friday afternoon.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/i-accidentally-my-servers.html</guid>
                </item>
            
                <item>
                    <title>Vanity nameservers with Rackspace DNS</title>
                    <link>http://glencampbell.co/essays/vanity-nameservers-with-rackspace-dns.html</link>
                    <pubDate>Thu, 28 Feb 2013 13:34:12 GMT</pubDate>
                    <description>
                        &lt;p&gt;The Internet domain-name service (DNS) can be a complicated, convoluted thing to try to understand. Moreover, because people use names and not IP addresses to access websites, it has to be highly secure; someone hijacking a nameserver can damage vastly more sites than someone who merely hijacks a website.&lt;/p&gt;
&lt;p&gt;There&#39;s also an issue of credibility, at least for technology companies. If someone performs a &lt;code&gt;whois&lt;/code&gt; search on your domain:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ whois some-domain-or-other.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It will show them the primary name servers for that domain. For example, if I perform a &lt;code&gt;whois techcrunch.com&lt;/code&gt; at the command line, it shows me this:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..........&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ns3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wordpress&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..........&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ns1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wordpress&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..........&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ns2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wordpress&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This lets me know that &lt;a href=&#34;http://techcrunch.com&#34;&gt;TechCrunch&lt;/a&gt; is hosted by &lt;a href=&#34;http://www.wordpress.com&#34;&gt;WordPress&lt;/a&gt;; if I know of a vulnerability at WordPress, then I can use that information to attack TechCrunch.&lt;/p&gt;
&lt;p&gt;If I perform a &lt;code&gt;whois&lt;/code&gt; search on &lt;code&gt;yahoo.com&lt;/code&gt;, however, all I know is that the DNS is handled by Yahoo! I don&#39;t have any information that I can exploit to attack them, and I know that Yahoo! is a big enough company to handle its own DNS.&lt;/p&gt;
&lt;p&gt;If you perform a &lt;code&gt;whois&lt;/code&gt; search on &lt;code&gt;glenc.co&lt;/code&gt;, you&#39;ll see this:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Server:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NS1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XLERB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;COM&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Server:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NS2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XLERB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;COM&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;What the heck is &lt;code&gt;XLERB.COM&lt;/code&gt;? A further &lt;code&gt;whois&lt;/code&gt; query on that leads to:&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Servers:&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;ns1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xlerb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;
  &lt;span class=&#34;n&#34;&gt;ns2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xlerb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Well, whatever &lt;code&gt;XLERB.COM&lt;/code&gt; is, it does it&#39;s own DNS, right? Nope; the DNS for &lt;code&gt;XLERB.COM&lt;/code&gt; is actually hosted by &lt;a href=&#34;http://www.rackspace.com&#34;&gt;Rackspace&lt;/a&gt;. Here&#39;s how I did it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First, your domain for the name server needs to be hosted by Rackspace. I won&#39;t get into the details of how to do that (they&#39;re available online), but Rackspace DNS is free if you have a cloud account. Since all my servers are hosted by the Rackspace Cloud, I get the DNS service as a bonus.&lt;/li&gt;
&lt;li&gt;When you add a new domain to the Rackspace DNS system (via &lt;a href=&#34;http://mycloud.rackspace.com&#34;&gt;the control panel&lt;/a&gt;, it assigns two default name servers: &lt;code&gt;ns1.stabletransit.com&lt;/code&gt; and &lt;code&gt;ns2.stabletransit.com&lt;/code&gt;. What you&#39;re going to do is to find the IP addresses of those two servers and create new &lt;code&gt;A&lt;/code&gt; records in your domain that point to the same IP addresses. Use &lt;code&gt;nslookup ns1.stabletransit.com&lt;/code&gt; (or &lt;code&gt;dig&lt;/code&gt;) to find the IP addresses of those two domains.&lt;/li&gt;
&lt;li&gt;Create two &lt;code&gt;A&lt;/code&gt; records in your domain that point to those IP addresses. In my case, I used &lt;code&gt;NS1.XLERB.COM&lt;/code&gt; and &lt;code&gt;NS2.XLERB.COM&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Go to your domain registrar (in my case, it was the registrar that handles &lt;code&gt;XLERB.COM&lt;/code&gt;) and look for something like &#34;register nameservers.&#34; You&#39;ll have to dig through the site, and it may be under &#34;Advanced Options&#34; but all of the registrars should have it available.&lt;/li&gt;
&lt;li&gt;Register your new name servers there and use the same IP addresses you used for the &lt;code&gt;A&lt;/code&gt; records, above. In my case, this was (again) &lt;code&gt;NS1&lt;/code&gt; and &lt;code&gt;NS2.XLERB.COM&lt;/code&gt;. This is required so that DNS can get the IP addresses from the top-level domain (TLD) servers and ensure that they&#39;re trusted, and not have to rely on the lower-level name servers, which might have been compromised. However, the records must match at both levels.&lt;/li&gt;
&lt;li&gt;Having registered the name servers at both the DNS provider (Rackspace) and at the registrar, you can now point your domains at them. This is the trivial part; unfortunately, you still have to do it twice. At the registrar for a domain, change the name servers to use your two new name servers; at Rackspace, edit the &lt;code&gt;NS&lt;/code&gt; records and change &lt;code&gt;ns1&lt;/code&gt; and &lt;code&gt;ns2.stabletransit.com&lt;/code&gt; to use your newly-defined name servers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voila! Now, someone performing a &lt;code&gt;whois&lt;/code&gt; query on your domain will find your customer name servers, and not the Rackspace ones. For example,&lt;/p&gt;
&lt;div class=&#34;codehilite&#34;&gt;&lt;pre&gt;&lt;span class=&#34;n&#34;&gt;whois&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unpretentious&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;....&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Server:NS1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XLERB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;COM&lt;/span&gt;
&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Server:NS2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;XLERB&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;COM&lt;/span&gt;
&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Note, however, that there are certain risks associated with this; if, for example, Rackspace changes the IP addresses of its name servers, you&#39;ll have to modify both the registrar&#39;s name server records as well as the &lt;code&gt;A&lt;/code&gt; records you defined in your domain.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/vanity-nameservers-with-rackspace-dns.html</guid>
                </item>
            
                <item>
                    <title>Music performance apps for the iPad</title>
                    <link>http://glencampbell.co/essays/music-performance-apps-for-the-ipad.html</link>
                    <pubDate>Mon, 11 Feb 2013 10:16:31 GMT</pubDate>
                    <description>
                        &lt;p&gt;The iPad is a marvelous tool for musicians. There&#39;s a huge quantity of apps for performers; unfortunately, they&#39;re all mixed in with apps for playing music, so they can be hard to find. This is my personal list of favorite musical tools. These are the ones that I use often, once a day at least or more.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/us/app/forscore/id363738376?mt=8&#34;&gt;forScore&lt;/a&gt; by MSG Development. This app lets you display PDF files. I use it for holding the chord charts that we use in my church music group. It can access files stored in &lt;a href=&#34;http://dropbox.com&#34;&gt;Dropbox&lt;/a&gt; and it lets you annotate those documents. For example, if we decide we need to use a capo on a song, I can write that on the chord chart and it will show up the next time I view it. In addition, it lets me resize and crop documents so that they&#39;re easier to read.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/us/app/audiobus/id558513570?mt=8&#34;&gt;AudioBus&lt;/a&gt; by A Tasty Pixel. This app is nothing short of miraculous. It lets you link together the audio inputs and outputs of other compliant apps into a seamless whole. See &lt;a href=&#34;http://audiob.us&#34;&gt;audiob.us&lt;/a&gt; for a list of the apps that support it (there are a ton of them). For example, I can set up a drum machine, a bass line, and a synthesizer as inputs, pipe it into an effects unit, and then route everything to a multi-track recorder for mastering. It was only released last November, and it&#39;s been hugely popular since then. You can think of this as the cabling that lets you run multiple music apps simultaneously.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/us/app/auria/id524122834?mt=8&#34;&gt;Auria&lt;/a&gt; by WaveMachine Labs, Inc. This is a 48-track studio-quality recording system. It&#39;s Audiobus-compliant, to you can pipe the audio from other iOS apps into it. It&#39;s truly an amazing app; when I was first in the studio (in the early 1980&#39;s), a 48-track recording system would have easily cost $500,000 (in 1980&#39;s dollars). Here it&#39;s available for $50. (There&#39;s also a &#34;light edition&#34;&amp;mdash;Auria LE&amp;mdash;that only costs half as much.) It doesn&#39;t have all the sophisticated effects, etc., of Apple&#39;s own Garageband, but in many ways it&#39;s much more flexible and powerful. With Audiobus, you can add all the effects you need as part of the audio chain.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/us/app/animoog/id471638724?mt=8&#34;&gt;Animoog&lt;/a&gt; by Moog Music Inc. This is superb synthesizer built for the iPad from the grandfather of all synth companies. The user interface takes some getting used to, but you can create some wonderful tones with this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/us/app/guitartoolkit/id284962368?mt=8&#34;&gt;Guitar Toolkit&lt;/a&gt; by Agile Partners. This app combines a tuner, chord reference, and metronome along with support for various guitars, ukulele, mandolin, banjo, and other string instruments.&lt;/p&gt;
&lt;p&gt;There are a ton more of great apps out there, but these are the ones I most frequently use.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/music-performance-apps-for-the-ipad.html</guid>
                </item>
            
                <item>
                    <title>How to talk about gun control</title>
                    <link>http://glencampbell.co/essays/how-to-talk-about-gun-control.html</link>
                    <pubDate>Fri, 21 Dec 2012 13:51:59 GMT</pubDate>
                    <description>
                        &lt;p&gt;In the wake of the Newtown, Connecticut, school shootings, there has been a vast, seething discussion on gun control on the Internet, as well as in our homes, offices, and places of worship. Much of this discussion, in my humble opinion, is utter rubbish and serves only to enhance the speaker&#39;s feelings of superiority and self-worth. If you&#39;re interested in an honest, open discussion on the tragedy of gun violence and how to solve it, I humbly suggest a few guidelines.&lt;/p&gt;
&lt;h3&gt;Do not use the term &lt;em&gt;gun control&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;There are probably &lt;em&gt;at least&lt;/em&gt; 100,000 different definitions as to what this term means; so much so that it is, in essence, utterly meaningless. If you find yourself saying, &#34;we need gun control,&#34; it might make you feel better, but it adds nothing to the conversation. Instead, try to focus on concrete proposals backed up by hard evidence, not pure speculation on your part. &#34;If we prohibit gun magazines from holding more than five rounds, it would force gun owners to purchase more and slow down shooters whilst they reload,&#34; is a much better statement than &#34;We should stop people from owning assault weapons.&#34;&lt;/p&gt;
&lt;h3&gt;Do not use the term &lt;em&gt;assault weapon&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Why? Like &lt;em&gt;gun control&lt;/em&gt;, this is a vague and ambiguous phrase that had a very clear definition in the Federal Assault Weapons ban, and is misused nearly everywhere else. Under the now-expired assault weapons ban, an &lt;em&gt;assault weapon&lt;/em&gt; is defined as a semi-automatic rifle that has a place to put a bayonet, a collapsible stock, a flash suppressor, and a removable magazine. If it only had three of the four, it wasn&#39;t an assault weapon. If was a .22 caliber (very small gun) but had those four items, it was still an assault weapon. Thus, the assault weapons ban was trivially easy to get around; in most cases, the manufacturer would leave off the bayonet lug, since that&#39;s the easiest thing to do. Instead of using &#34;assault weapon,&#34; use specifics: &#34;I think we should ban all guns that have a removable magazine.&#34;&lt;/p&gt;
&lt;h3&gt;Do not dismiss your opponents&lt;/h3&gt;
&lt;p&gt;Sadly, political discourse in this country has reached the point where people on differing sides of an issue simply ignore each other. When you start out a statement by saying, &#34;Anyone who supports gun ownership is a killer,&#34; you&#39;re a fool and you&#39;re only trying to make yourself feel better. Your opponent (in both direction) has been around for years and at least deserves the respect of a worthy opponent. The NRA has, to this date, been vastly more successful than the disjointed voices of liberals whining about this or that. It will take a concerted, heavily funded effort to counter their resources and the culture they represent. Dismissing the people from the other point of view as &#34;idiots&#34; and &#34;lunatics&#34; serves no purpose and will only ensure that the status quo continues. Ask yourself if that&#39;s what you want.&lt;/p&gt;
&lt;h3&gt;Talk about the Second Amendment&lt;/h3&gt;
&lt;p&gt;Ultimately, any law about gun control will be judged in the courts against the US Constitution&#39;s Second Amendment. You cannot simply dismiss it with &#34;That was valid when we used muskets; it&#39;s not valid any more.&#34; Yes, it applied to muskets, the highest-quality weapons of the time, and not just to flintlocks, which is what most farmers and rural people used for hunting. The purpose was to establish a standing army from the citizenry and, if you read the writings from the period, was to ensure that citizens could overthrow their government if it became corrupt. Using those standards, courts will continue to uphold private gun ownership, and no meaningful progress towards gun control will be possible without addressing them.&lt;/p&gt;
&lt;h3&gt;Ask yourself if your proposal would work&lt;/h3&gt;
&lt;p&gt;Seriously. I&#39;ve seen some of the stupidest things come out on the Internet; ideas that would have had &lt;em&gt;zero&lt;/em&gt; impact on the Columbine or Newtown killers. Background checks would not have stopped them, since none of those killers actually purchased the weapons used. Nor would requiring registration; criminals and the criminally insane can steal registered weapons as easily as they can unlicensed ones. Ask yourself: would this have stopped the killer in Newtown? If not, then it&#39;s going to be a lot of work to justify further restrictions of civil rights without showing a benefit.&lt;/p&gt;
&lt;h3&gt;Don&#39;t cherry-pick your data&lt;/h3&gt;
&lt;p&gt;People are not idiots. If you have a graph showing gun deaths in the USA vs. Denmark, Switzerland, Findland, Germany, and England, then the USA comes out way behind. But Mexico has some of the strictest gun control laws on earth, and yet Mexicans are far more likely to be killed by guns than are US residents. Any discussion needs to include a spectrum of examples, and not merely the ones that make our case. Failing to include other examples proves to thinking people that you&#39;re an idiot and your ideas can safely be dismissed. I don&#39;t think that&#39;s what you&#39;re intending to do.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;This is not an easy problem to solve, given the American culture and history. At the very least, we should be able to have a civil, thoughtful discussion of the issues without recourse to slander and slimeball tactics.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/how-to-talk-about-gun-control.html</guid>
                </item>
            
                <item>
                    <title>I want to die in Autumn</title>
                    <link>http://glencampbell.co/essays/i-want-to-die-in-autumn.html</link>
                    <pubDate>Tue, 09 Oct 2012 14:51:49 GMT</pubDate>
                    <description>
                        &lt;p&gt;I want to die in Autumn with my knees&lt;br&gt;
pulled up to my chin and fallen leaves&lt;br&gt;
crisp among the fading grass&lt;br&gt;
as night falls and constellations wax&lt;br&gt;
and the air grows cold; outside, wind slacks&lt;br&gt;
and fades, and people pass&lt;br&gt;
outside, unaware of the ending. Surprised,&lt;br&gt;
maybe, of the way it ends, my life,&lt;br&gt;
I grieve, of course, and mark&lt;br&gt;
the time to the minute. They&lt;br&gt;
have their lives; they can choose to say&lt;br&gt;
what they will, but dark&lt;br&gt;
is the ending, dark and cold and stale.&lt;br&gt;
There is light, too, pale&lt;br&gt;
gleams from distant points, and sounds&lt;br&gt;
of music (music! for all love) around&lt;br&gt;
and about and inside and out&lt;br&gt;
and joyful shouting and helpful hands.&lt;br&gt;
The end is the beginning, and stands,&lt;br&gt;
not separate, but entwined, routed&lt;br&gt;
between the knowing and the unknowing&lt;br&gt;
signs, that long tunnel leading&lt;br&gt;
from water into air.&lt;br&gt;
I&#39;ll arrive, knees bent, crying loud,&lt;br&gt;
fearful and joyful and tearful and&lt;br&gt;
hopeful and light of heart, where&lt;br&gt;
knowing and unknowing&lt;br&gt;
and becoming are one.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/i-want-to-die-in-autumn.html</guid>
                </item>
            
                <item>
                    <title>The best luggage I ever owned</title>
                    <link>http://glencampbell.co/essays/the-best-luggage-i-ever-owned.html</link>
                    <pubDate>Wed, 03 Oct 2012 17:18:06 GMT</pubDate>
                    <description>
                        &lt;p&gt;I have been traveling on business fairly regularly since 1993, when I became a consultant for Evolutionary Technologies International, an enterprise software vendor. When I first became a consultant, I went out and spent $50 on a wheeled carryon bag. After a month, it was utterly decrepit, so I replaced it with another $50 wheeled carryon, but of a different brand. After another month on the road, that bag, too, was destroyed.&lt;/p&gt;
&lt;p&gt;Instead of spending another $50 on a wheeled carryon, I asked my fellow consultants what they were using. Six of the seven were using &lt;a href=&#34;http://www.briggs-riley.com&#34;&gt;Briggs &amp;amp; Riley&lt;/a&gt; wheeled carryons. The B&amp;amp;R carryon cost $250, but it&#39;s hard to argue with results.&lt;/p&gt;
&lt;p&gt;I can take a hint and, twenty-one years later, my Briggs &amp;amp; Riley wheeled carryon is still going strong. A few years ago, one of the wheels broke, but the company replaced it for free under their unlimited lifetime warranty. Between 1996 and 2000, I lived in Europe and averaged 140 flight segments per year. I don&#39;t travel nearly so much these days, but I can still reply on my luggage.&lt;/p&gt;
&lt;p&gt;I am not a paid spokesperson, but simply a very happy customer. I have not performed an exhaustive comparison between B&amp;amp;R and other brands, and I&#39;m sure that the price has gone up since then. All I know is that their products perform superbly.&lt;/p&gt;
                    </description>
                    <guid>http://glencampbell.co/essays/the-best-luggage-i-ever-owned.html</guid>
                </item>
            </channel>
</rss>
