<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Randall Degges</title>
    <link>http://rdegges.com</link>
    <description>Random thoughts of a happy programmer.</description>
    <generator>posterous.com</generator>
    <link xmlns="http://www.w3.org/2005/Atom" href="http://posterous.com/api/sup_update#cf6a7f2a7" type="application/json" rel="http://api.friendfeed.com/2008/03#sup" />
    
    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rdegges" /><feedburner:info uri="rdegges" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://posterous.superfeedr.com/" /><feedburner:emailServiceId>rdegges</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <pubDate>Fri, 03 Feb 2012 22:18:00 -0800</pubDate>
      <title>How I Learned to Program</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/brGXBW6FQyc/how-i-learned-to-program</link>
      <guid isPermaLink="false">http://rdegges.com/how-i-learned-to-program</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Hacker" height="198" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-27/AChmokGFBaAcxqbJayibogiqhturgbcpIHHzBGonqcyezbJmgiubuyFIywht/hacker.gif.scaled696.gif" width="198" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Programming is, without a doubt, the most mentally rewarding thing I've ever done. Programming taught me that life should be fun, filled with creativity, and lived to the fullest. Programming taught me that anything is possible; I can do anything I want using only my mind.&lt;/p&gt;
&lt;p&gt;Programming also taught me that learning is fun. It showed me that the more you know, the more power you have. Programming showed me that a life filled with learning is a life worth living. Programming revealed to me who I am inside, and has continuously helped me work towards my goals.&lt;/p&gt;
&lt;p&gt;I feel extremely lucky to have had the means and opportunity to learn programming early in my life. While my methods are certainly not optimal for everyone, they worked well for me.&lt;/p&gt;
&lt;p&gt;I have no regrets.&lt;/p&gt;
&lt;p&gt;So I figured I'd share my methods with you, in hopes that a beginner will read this and get some value out of it.&lt;/p&gt;
&lt;p&gt;If you don't want to read all this, the important takeaway here is to, above all else, &lt;strong&gt;have fun&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Install Linux on Your Box&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Linux" height="277" src="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-01-27/miAslDvGjInfCBvaBFAqDkFmoznAdaogAcqxHfuhFvJcgyoEvzeBdinalFiI/linux.jpg.scaled696.jpg" width="300" /&gt;
&lt;/div&gt;
While in my own life, I actually learned quite a bit about computers through video games on MSDOS computers--my real learning started the first day I installed a linux operating system on my home computer.&lt;/p&gt;
&lt;p&gt;It doesn't matter whether or not you use Windows on your laptop, or if you have a Macbook Air--if you want to learn to program well, you need to use linux. Sure, there are a ton of great programmers out there using other systems, but you cannot beat linux as a learning machine.&lt;/p&gt;
&lt;p&gt;Despite what you may think, programmers don't just "program". Programming as you probably think of it is nothing more than input and output. You type things, and stuff happens. This is incorrect.&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Programming" height="256" src="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-02-02/lgevgAiwFiGwIipcIeCGczqhBcunhtjEClsuccvhsylxAakHlAHuhAtEquhk/programming.gif.scaled696.gif" width="256" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Programming is a way of life.&lt;/p&gt;
&lt;p&gt;Programmers are people obsessed with knowledge. Programmers use this obsession to fuel a life of learning, discovery, and creation. That is the true definition of a programmer.&lt;/p&gt;
&lt;p&gt;A big reason to use linux for your day to day work is that it helps you passively learn about programming as you use it. On Windows, if you want to copy a file from one box to another, you drag and drop. On linux, if you want to copy a file from one box to another, you use scp or rsync. Learning how to use the command line teaches you basic technical logic and problem solving skills.&lt;/p&gt;
&lt;p&gt;Another important skill you passively acquire by using linux is self sufficiency. Unlike many other lines of work, programming does not require you to memorize a million things, or repeatedly do the same thing over and over again; instead, programming requires intense self motivation and determination.&lt;/p&gt;
&lt;p&gt;Even the best programmers typically have no idea what they're doing when they start a new project. If I could summarize one thing I do more than anything else as a programmer, it would be &lt;strong&gt;research&lt;/strong&gt;. Programmers must know how to lookup information, and how to process and use that information in a useful manner. This skill is typically acquired over long periods of time--but linux can help.&lt;/p&gt;
&lt;p&gt;Using linux will require you to actively seek out solutions to problems. If you don't know how to setup an SSH tunnel--you &lt;strong&gt;will&lt;/strong&gt; learn. Using linux will drive you to discover new things you never would have thought of while using Mac or Windows. As you slowly become a better and better linux user, you will coincidentally become a better and better programmer and pragmatist. You'll learn how to go about solving problems. How to hunt down errors. How to use your combined knowledge to create new things and make your life (and others' lives) easier.&lt;/p&gt;
&lt;p&gt;Furthermore, since linux (as well as a majority of its applications) is open source, you're in a great position to learn more about programming culture. At one point or another, I can almost guarantee you will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find a bug in an application you use.&lt;/li&gt;
&lt;li&gt;You'll search for an answer online.&lt;/li&gt;
&lt;li&gt;You'll find either a ticket system or a forum for the software you're using.&lt;/li&gt;
&lt;li&gt;You'll submit a ticket about the bug, or post on the forum stating your problem.&lt;/li&gt;
&lt;li&gt;Interact with other users like yourself to help resolve the issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While this may not sound cool now, just wait. Once you've done the above, you'll really be acquainted with the tech community. Finding problems, discussing them with others, and solving problems is what makes the technical community thrive.&lt;/p&gt;
&lt;p&gt;If everything was perfect and there were no problems to solve in the world--life would be boring. Getting out there and fixing stuff--fighting chaos--that makes life worth living. So enjoy it!&lt;/p&gt;
&lt;p&gt;Linux can help teach you these things, and more.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Have an Intense Desire&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-27/saferEhsexcsxkpusCAAzzABlpvBamaDnDxAvbkgBJtJgsemnlEDtwCammph/burning-desire.jpg.scaled1000.jpg"&gt;&lt;img alt="Burning-desire" height="696" src="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-27/saferEhsexcsxkpusCAAzzABlpvBamaDnDxAvbkgBJtJgsemnlEDtwCammph/burning-desire.jpg.scaled696.jpg" width="696" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Why do you want to program? What is motivating you? What drives you?&amp;nbsp;Unless you desperately want to learn programming, you will fail.&lt;/p&gt;
&lt;p&gt;When I started coding, it was because I had an intense desire to hack video games. Back when I was a kid, video games were my life. I would rush home from school and spend as long as I could on the computer playing old classics. Some of my fondest memories are playing epic Starcraft matches against my brother (we'd have no rush 2 hour games where we'd max out our units and have battles that would cause our GPUs to quake in terror).&lt;/p&gt;
&lt;p&gt;More than anything, I wanted to hack the shit out of those games. I wanted to &lt;strong&gt;dominate&lt;/strong&gt; them. I wanted to &lt;strong&gt;enslave&lt;/strong&gt; my computer and have it do my bidding.&lt;/p&gt;
&lt;p&gt;While my old motivations are silly to me now, back then I felt them intensely. I'd dream about it at night, constantly think about it during the day, and obsess about it while I was on the computer in the afternoon.&lt;/p&gt;
&lt;p&gt;When I set my mind towards learning to program, I knew I would make it happen. I knew that no matter what happened in my life, I'd either learn to program or I'd die trying. It was what I can only describe as a glorious feeling. It was similar to that feeling you have where you want something so bad, so intensely, that you feel it with every muscle in your body.&lt;/p&gt;
&lt;p&gt;Regardless of the fact that I had absolutely no idea what I was doing--that I knew absolustely no technical people whatsoever--that I had no resources--and that I had zero guidance--I found a way. I ruthlessly read through internet tutorials on random webpages. I spend hundreds of hours scouring random forums looking for bits of information.&lt;/p&gt;
&lt;p&gt;The most important thing, however, is that because I wanted it so bad, it felt easy. I've always been an all-or-nothing type of person, and I think that this helped me break through the initial barriers and eventually become a half decent programmer.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Build Small Command Line Programs&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Snoopy-programming" height="880" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-02-03/xEsuclFCqjadjiwJnjxqrxDICBtHAHtnIFAsggqDjnEHgoolwhiAfyilfAbp/snoopy-programming.gif.scaled696.gif" width="660" /&gt;
&lt;/div&gt;
A lot of people now-a-days seem to be learning programming by diving head first into web development. While this may work for some people, it seems pretty damn crazy to me. Not only are web technologies complex and vast (building a modern website requires a ton of separate skills that take years to mature), but they're frustrating and discouraging for new developers.&lt;/p&gt;
&lt;p&gt;Maybe I'm old school (I'm only 23 :x), but there is nothing more satisfying (and educational!) than writing a ton of simple, command line programs.&lt;/p&gt;
&lt;p&gt;I can't even begin to express how useful this was in my programming education. For the longest time (after I gained a basic understanding of programming) I'd rush home from school, sit down at my computer, and spend 5 or 6 hours writing a simple command line utility. I'd write tons of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A simple program that takes in filenames as input, and stores those files all in an organized directory hierarchy depending on the file type.&lt;/li&gt;
&lt;li&gt;An IRC bot that logs all channel activity to a text file.&lt;/li&gt;
&lt;li&gt;A simple program that downloads all the images on a given web page.&lt;/li&gt;
&lt;li&gt;A tool to convert base 10 numbers to any other base on the CLI.&lt;/li&gt;
&lt;li&gt;A provisioning script that installs all my OS customizations: wallpapers, themes, etc.&lt;/li&gt;
&lt;li&gt;A basic screenshot program that automatically uploads screenshot to an image hosting website, and copies the resulting URL into the clipboard for instant copy-paste fun.&lt;/li&gt;
&lt;li&gt;And a million other things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I got so much value out of these small exercises. Each one was simple enough to be written in several hours (no more), and each one taught me stuff: either a new language, library, or strategy. There's no doubt in my mind that I gained a good portion of my programming knowledge through building these apps.&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;p&gt;The other benefit to building these small apps is confidence. Each app I built was a huge personal accomplishment. I felt proud of each one. I'd maintain all of them, and periodically rewrite the code using all the new strategies I'd learn. This taught me basic iterative programming (making improvements over time), and how to really contribute to the open source world.&lt;/p&gt;
&lt;p&gt;If you're a new programmer, I doubt there's anything better (or more fun) than writing a ton of small command line utilities. Don't believe me? Try it, and tell me you aren't addicted after the first one!&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Write, Write, Write&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Writing" height="474" src="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-02-03/yuwBiJvcorqhfjsDbCgJzibhrHtwCDbuwfhHDktFtqxjdjznBCnhnIlBAhlb/Writing.png.scaled696.png" width="500" /&gt;
&lt;/div&gt;
Writing is a bit controversial. When I started programming, nerds had a reputation for being bad at everything except computers. For a while, I assumed that since I was good at computers, I was naturally worse at everything else: writing included.&lt;/p&gt;
&lt;p&gt;That's bullshit.&lt;/p&gt;
&lt;p&gt;I've come to realize over the years that programmers are, in particular, excellent writers. The ability to think logically and solve problems is a great writing asset. It's particularly hard to explain your thoughts in writing. In my opinion, having strong programming skills makes this much easier, since as a programmer, you're used to arguing with logic and use it everyday in your work.&lt;/p&gt;
&lt;p&gt;Through the process of writing a lot, you'll greatly improve your reasoning ability, and consequently, become a better programmer.&lt;/p&gt;
&lt;p&gt;As a programmer, having a blog is a great way to practice writing. It's a great way to keep track of the things you learn, and help ensure you are always making progress. Through the process of writing about things, techincal things in particular, you'll greatly increase your knowledge on the subject.&lt;/p&gt;
&lt;p&gt;For instance, if you're writing a CLI app that orders pizza through Dominos, it would be hard to write about that without going into detail describing the technology you're using, how the Domino's API works, etc. By taking the time to write about your experiences working with their API, you'll consequently learn a lot more than you would if you didn't.&lt;/p&gt;
&lt;p&gt;Writing can be amazingly helpful when used to describe technical stuff, as it really simplifies and clarifies the root of the problem--forcing you to think of the problem in the simplest way possible. I can't tell you how many times I've worked on a really tough problem, then taken the time to write about it and realized that I vastly overcomplicated the issue.&lt;/p&gt;
&lt;p&gt;One of my biggest regrets is that over the years I threw away a vast majority of my articles. Over time I rewrote my website frequently, mismanaged servers, and slowly lost most of my writing. This blog you're reading now exists primarily as the result of my decision to save all my future writings and provide a home for them that I won't mistakely lose. Don't make the same mistake I did!&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Join an Online Community&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-02-03/dursbvwFrukfspEAvuFtxiEjtEqAjzdEChzwCqCGdBfvIcrhzIHtcadvEBlc/impostor.png.scaled1000.png"&gt;&lt;img alt="Impostor" height="293" src="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-02-03/dursbvwFrukfspEAvuFtxiEjtEqAjzdEChzwCqCGdBfvIcrhzIHtcadvEBlc/impostor.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;/div&gt;
The internet is a big place. Programming is a big field. While it is certainly possible to become an excellent programmer by yourself, completely isolated--it is much easier to do it with the help of friends.&lt;/p&gt;
&lt;p&gt;When I started programming I was lucky enough to meet some amazing like-minded programmers online using &lt;a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat" title="IRC"&gt;IRC&lt;/a&gt;. The people I met were some of the smartest, passionate, and most motivated individuals I've ever met in my life. We're still friends today!&lt;/p&gt;
&lt;p&gt;Having other insanely passionate and driven friends kept me motivated, and helped push me to be the best I could. We wrote articles for one another to share things we learned--we critiqued each other's code. We talked about projects we were working on, and what the best way to implement them was.&lt;/p&gt;
&lt;p&gt;Having a group of people with the same passion and drive as yourself cannot be understated.&lt;/p&gt;
&lt;p&gt;Finding a group like this, on the otherhand, is extremely difficult. I highly recommend using IRC (as a lot of bright people seem to use it), and gradually joining new channels and chatting with people who share similar interests. If, in the offchance you're like me, and want to hang out in the same circle, you're invited to check out &lt;a href="http://irc://irc.oftc.net/#heapify" title="#heapify"&gt;#heapify&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Have Fun&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Program-everything" height="300" src="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-02-03/EFhqcczmGemjrqwjjntzawmvFyBnzgDkbGofrwxJxmaklbGoECAEqrpkxuBJ/program-everything.jpg.scaled696.jpg" width="400" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Programming is fun. Programming is really, insanely fun.&amp;nbsp;Just writing about it makes me feel happy inside. It's hard to contain my excitement.&lt;/p&gt;
&lt;p&gt;The most important part of learning to program is to always &lt;strong&gt;HAVE FUN&lt;/strong&gt;! Regardless of whether you're just getting into programming, or whether you've been a programmer for a long time: having fun is the most important thing you can do.&lt;/p&gt;
&lt;p&gt;Let's say you're just starting to learn &lt;a href="http://python.org/" title="python"&gt;python&lt;/a&gt; (&lt;a href="http://www.amazon.com/gp/product/1590593561/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=projectb14ck-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1590593561" title="Dive Into Python"&gt;Dive Into Python&lt;/a&gt; is still one of the best python books ever written, by the way)--don't start by writing some boring project. Write something new! Something that you will find useful. Have fun with it, and challenge yourself.&lt;/p&gt;
&lt;p&gt;If your sole motivation for working on a project is to get it done, you're cheating yourself. Part of being a good programmer is building stuff that &lt;strong&gt;YOU&lt;/strong&gt; find cool. There is plenty of dreary software in the world, what the world needs is more &lt;strong&gt;AWESOME&lt;/strong&gt; software. And the only way to make awesome software is to have fun building it!&lt;/p&gt;
&lt;p&gt;I could literally go on ranting about how much fun programming is indefinitely. But instead, I want to challenge &lt;strong&gt;YOU&lt;/strong&gt;&amp;nbsp;(ya, you!). Think of something you'd really love to build: maybe it's a file sharing site, maybe a video editor--whatever excites you and gives you that warm fuzzy feeling inside. Got it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OK&lt;/strong&gt;, now go build it!&lt;/p&gt;
&lt;p&gt;Regardless of where you are in your programming career: always have fun, and keep pushing yourself!&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/how-i-learned-to-program"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/how-i-learned-to-program#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/brGXBW6FQyc" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/gif" height="198" width="198" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-27/AChmokGFBaAcxqbJayibogiqhturgbcpIHHzBGonqcyezbJmgiubuyFIywht/hacker.gif">
        <media:thumbnail height="198" width="198" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-27/AChmokGFBaAcxqbJayibogiqhturgbcpIHHzBGonqcyezbJmgiubuyFIywht/hacker.gif.scaled500.gif" />
      </media:content>
      <media:content type="image/jpeg" height="277" width="300" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-27/miAslDvGjInfCBvaBFAqDkFmoznAdaogAcqxHfuhFvJcgyoEvzeBdinalFiI/linux.jpg">
        <media:thumbnail height="277" width="300" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-27/miAslDvGjInfCBvaBFAqDkFmoznAdaogAcqxHfuhFvJcgyoEvzeBdinalFiI/linux.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="700" width="700" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-27/saferEhsexcsxkpusCAAzzABlpvBamaDnDxAvbkgBJtJgsemnlEDtwCammph/burning-desire.jpg">
        <media:thumbnail height="500" width="500" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-27/saferEhsexcsxkpusCAAzzABlpvBamaDnDxAvbkgBJtJgsemnlEDtwCammph/burning-desire.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/gif" height="256" width="256" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-02-02/lgevgAiwFiGwIipcIeCGczqhBcunhtjEClsuccvhsylxAakHlAHuhAtEquhk/programming.gif">
        <media:thumbnail height="256" width="256" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-02-02/lgevgAiwFiGwIipcIeCGczqhBcunhtjEClsuccvhsylxAakHlAHuhAtEquhk/programming.gif" />
      </media:content>
      <media:content type="image/png" height="474" width="500" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-02-03/yuwBiJvcorqhfjsDbCgJzibhrHtwCDbuwfhHDktFtqxjdjznBCnhnIlBAhlb/Writing.png">
        <media:thumbnail height="474" width="500" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-02-03/yuwBiJvcorqhfjsDbCgJzibhrHtwCDbuwfhHDktFtqxjdjznBCnhnIlBAhlb/Writing.png.scaled500.png" />
      </media:content>
      <media:content type="image/gif" height="880" width="660" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-02-03/xEsuclFCqjadjiwJnjxqrxDICBtHAHtnIFAsggqDjnEHgoolwhiAfyilfAbp/snoopy-programming.gif">
        <media:thumbnail height="667" width="500" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-02-03/xEsuclFCqjadjiwJnjxqrxDICBtHAHtnIFAsggqDjnEHgoolwhiAfyilfAbp/snoopy-programming.gif.scaled500.gif" />
      </media:content>
      <media:content type="image/png" height="312" width="740" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-02-03/dursbvwFrukfspEAvuFtxiEjtEqAjzdEChzwCqCGdBfvIcrhzIHtcadvEBlc/impostor.png">
        <media:thumbnail height="211" width="500" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-02-03/dursbvwFrukfspEAvuFtxiEjtEqAjzdEChzwCqCGdBfvIcrhzIHtcadvEBlc/impostor.png.scaled500.png" />
      </media:content>
      <media:content type="image/jpeg" height="300" width="400" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-02-03/EFhqcczmGemjrqwjjntzawmvFyBnzgDkbGofrwxJxmaklbGoECAEqrpkxuBJ/program-everything.jpg">
        <media:thumbnail height="300" width="400" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-02-03/EFhqcczmGemjrqwjjntzawmvFyBnzgDkbGofrwxJxmaklbGoECAEqrpkxuBJ/program-everything.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/how-i-learned-to-program</feedburner:origLink></item>
    <item>
      <pubDate>Wed, 18 Jan 2012 21:32:00 -0800</pubDate>
      <title>My Ideal Life</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/HGblDDV_gfM/my-ideal-life</link>
      <guid isPermaLink="false">http://rdegges.com/my-ideal-life</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-01-17/zBcHDeaJcIJDyjGCDAwdgrCkDgBgCxoApDoCeJhmvJEeiglJoGCkHzdjnyGe/tyrael.jpg.scaled1000.jpg"&gt;&lt;img alt="Tyrael" height="967" src="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-17/zBcHDeaJcIJDyjGCDAwdgrCkDgBgCxoApDoCeJhmvJEeiglJoGCkHzdjnyGe/tyrael.jpg.scaled696.jpg" width="696" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;As a strong believer in personal development, I realize that I will never be perfect. Despite this, a big part of the fun in life is working towards making yourself a better person. If you don't do that, what else is there?&lt;/p&gt;
&lt;p&gt;In order to make yourself a better person, knowing which traits you'd like to eventually have is essential. Maybe you're a smoker, but you'd like to eventually quit. Maybe you're skinny, and want to add 10lbs of muscle to your frame. Regardless of your personal development strategy, knowing what to work towards is mandatory.&lt;/p&gt;
&lt;p&gt;Over the past year, I've come to realize the importance of having &lt;a href="http://rdegges.com/what-im-doing-in-2012" title="What I'm Doing in 2012"&gt;positive habits&lt;/a&gt;, and how building a series of habits into your daily schedule is one of the best ways to make long term, sustainable change.&lt;/p&gt;
&lt;p&gt;As my life goals are still undefined, my current focus is on building a&amp;nbsp;repertoire of habits and skills so that over time, I'll gradually become the person I'd like to be, with as little friction as possible.&lt;/p&gt;
&lt;p&gt;For the past few days I've been trying to enumerate the skills I want to have, and the life I want to live. After a lot of thought and personal debate, I've narrowed my ideal life down to the following 24 hour snapshot. My thought is that if I'm able to spend each day doing the things below, I'll be both happy and wildly productive throughout my life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ALSO&lt;/strong&gt;: I'm absolutely positive that I'm going to continuously change my mind about this over time. The points below represent my thinking at this current moment only. Future self, if you're reading this: what are you up to? Have your goals changed? Your ideal life?&lt;/p&gt;
&lt;p&gt;In a given 24 hour day, I'd like to spend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;10 hours sleeping.&lt;/strong&gt; This includes buffer time, stuff like brushing teeth and sliding into bed. This way, I'll get a minimum of 8 hours of sleep (with 2 hours of buffer in there, just incase).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 hour writing.&lt;/strong&gt; Writing is a tool I'm quickly becoming more and more fond of. Writing has helped me learn things in much greater depth, as well as improve my communication skills. I highly value communication skills, so this is high on my list of importance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 hour reading.&lt;/strong&gt; I do a lot of reading, and I plan to continue this. Reading books, in particular, has taught me innumerable lessons, and the value I receive for my time investment is overwhelming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 hour exercising.&lt;/strong&gt; Having a strong body is important--not only for longevity, but for mental health and mood. Hitting the gym everyday and lifting weights would be a great way to stay in top condition year round.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3 hours eating.&lt;/strong&gt; This means uninterrupted meal and relaxation time either by myself, or with my family and friends. Rushing through meals is unsatisfying, and eating slow seems like a healthy, relaxing routine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 hour hacking on an open source project.&lt;/strong&gt; This means writing code that goes straight back to the community. Not only do open source projects build programming skill, but they're extremely fun, and provide a great way to meet other smart, talented people.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2 hours working.&lt;/strong&gt; This would ideally be hacking on my own company in some form: giving direction, writing code, whatever. Just working on a meaningful project that provides real value in the world, and enough money so that I don't have to worry about it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5 hours doing anything else.&lt;/strong&gt; This includes watching TV, hanging out with my wife, attending events, showering, volunteering, whatever.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why so little work? Well, it's my thought that by improving myself in all areas (including things that aren't&amp;nbsp;quantifiable--like focus, willpower, etc.), I'll be able to accomplish a lot more by working both smarter, and with more focus.&lt;/p&gt;
&lt;p&gt;Working smarter means only doing things that absolutely require my personal attention. By putting myself in a position where I can outsource all but the most essential functions to others, I'll be able to drastically cut down my daily todo list, leaving me with much less (but more important) work to be done.&lt;/p&gt;
&lt;p&gt;By working with more focus, I mean that over time, I'd like to build up my focus to a point where I'm able to completely immerse myself in a task for hours on end, without breaking concentration. Having that sort of intense focusing power would allow me to accomplish a great amount of work in a very small amount of time.&lt;/p&gt;
&lt;p&gt;I believe that if I'm eventually able to work both smarter and with more focus, than 2 hours should be more than enough time to make a difference at work.&lt;/p&gt;
&lt;p&gt;For the extra 5 hours of random time each day, I'd like to use that to do meaningful things. Maybe work on other projects, volunteer my time for a worthy cause, etc. It would also be nice to have free time so that, even on bad days, I can just lay down for a large chunk of the day and not feel guilty. After all, this is supposed to be a sustainable schedule--something that I can live with over a long period of time, not just a short term thing. This could also be a great way to throw myself at whatever I'm feeling most passionate about that particular day. This would free me up to spend an extra few hours working if I'm really in the mood, or maybe an extra couple hours reading--who knows.&lt;/p&gt;
&lt;p&gt;So, that's my ideal life in a nutshell. What's your ideal life (or day) look like?&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/my-ideal-life"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/my-ideal-life#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/HGblDDV_gfM" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="1250" width="900" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-17/zBcHDeaJcIJDyjGCDAwdgrCkDgBgCxoApDoCeJhmvJEeiglJoGCkHzdjnyGe/tyrael.jpg">
        <media:thumbnail height="694" width="500" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-17/zBcHDeaJcIJDyjGCDAwdgrCkDgBgCxoApDoCeJhmvJEeiglJoGCkHzdjnyGe/tyrael.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/my-ideal-life</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 16 Jan 2012 19:54:00 -0800</pubDate>
      <title>How I Program Stuff</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/C6QVTxt-jWQ/how-i-program-stuff</link>
      <guid isPermaLink="false">http://rdegges.com/how-i-program-stuff</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Programmer" height="290" src="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-16/BaGedtAfIcrAqkGioeyezyIhioBirEgqADaEtkEuItxDIvqJbrizyBqtfDBh/programmer.gif.scaled696.gif" width="426" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I love programming. I can truly say that of all the things I enjoy, I enjoy programming the most. There's nothing quite like the feeling you get when you create something. Writing code is a lot like building your own little universe.&lt;/p&gt;
&lt;p&gt;When you build stuff, you're in complete control, and, no matter how hard you fight it, your code directly reflects yourself. If you write sloppy code, I can almost &lt;em&gt;guarantee&lt;/em&gt; you'll be a sloppy person. If you&amp;nbsp;haphazardly throw code around with any care or passion, it's likely you treat yourself the same way.&lt;/p&gt;
&lt;p&gt;I tend to think of myself as a &lt;a href="http://www.amazon.com/gp/product/1934356344/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=projectb14ck-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1934356344" title="The Passionate Programmer"&gt;passionate programmer&lt;/a&gt; (subsequently, this is one of the best books I've ever read). When I'm building things, I do so with a lot of care. I like to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Take my time, and not rush myself.&lt;/li&gt;
&lt;li&gt;Maintain 100% strict style rules across the codebase. I'm a style nazi.&lt;/li&gt;
&lt;li&gt;Ruthlessly refactor old or ugly code.&lt;/li&gt;
&lt;li&gt;Put a lot of thought into the APIs available, and think of ways to minimize or get rid of them all together.&lt;/li&gt;
&lt;li&gt;Keep a single, clear, and minimalistic purpose for the project.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I try to make every piece of code I touch a bit more like me (for better or worse).&amp;nbsp;With the above in mind, here's my method for programming stuff.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Step 1 - Isolate&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Meditate" height="386" src="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-01-16/GllvqwjqypeiwEbhDzJuBqDjofsCwbwyCDecyityFgqlEDhdbCjjrmCmqztg/meditate.GIF.scaled696.gif" width="443" /&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I work best in complete isolation (excluding the companionship of my dog, Scribbles). I find that when I'm completely alone, with no distractions, I'm able to really get into the proper mood for building things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Confidence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Being alone gives me a lot of confidence. If you're by yourself, you have absolutely nothing to lose working on that funky feature branch that will probably never work out, or attempting to refactor an enormous method that you later realize was written that way for a very important reason. When you're by yourself, there is nothing to be embarassed about. You have complete creative freedom to try new things without consequence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Energy.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe it's because I'm deeply anti-social at my core, but for some reason, I'm just not myself around other people. As (odd?) as that may be, being around other people seems to really drain my energy and sap my creativeness. Despite my best efforts, I just don't have the same energy around other people as I do by myself. When I'm isolated, I have an enormous amount of mental energy that I just can't help but use in creative endeavors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Information.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I find that while alone, I'm able to make better use of available information. For instance, when I'm working with other people (physically), I tend not to use information resources as much. I won't google things, or read articles about the topics I'm working on. When alone, I tend to spend much more time researching relevant information, best practices, and learning skills that can help me do what needs to be done.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Step 2 - Eliminate&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Rm-rf" height="500" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-16/pibCgcGdIqpiafpvHfwgkGavHAvDdsDwrGqBDEtAJqBorgiHqDfsCeIpCuFi/rm-rf.png.scaled696.png" width="550" /&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When it's time to really build things, the second thing I do is eliminate all unnecessary information. This includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Closing all browser tabs and starting fresh.&lt;/li&gt;
&lt;li&gt;Closing all terminal sessions.&lt;/li&gt;
&lt;li&gt;Closing all IM conversations.&lt;/li&gt;
&lt;li&gt;Moving everything off my desk.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With everything out of the way, I'm able to easily focus on programming things. The code almost flows out naturally when nothing else is in the way, stopping it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;THOUGHT&lt;/strong&gt;: Maybe we're all meant to be programmers, and our environment is simply stopping us from coding. In this case, it is our duty to eliminate all distractions and return to our natural state!&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Step 3 - Code Ruthlessly&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Fist" height="323" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-16/JkxjHfyICrHoxEwCmheycmrmdGvCnBqtxtwmAGucrDqysotIGFzgurHGnpDq/fist.JPG.scaled696.jpg" width="400" /&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Coding ruthlessly is something I strongly believe in. I think that of all the things I've learned over the years, this has been the most important.&lt;/p&gt;
&lt;p&gt;There is no room in this world for fear while programming. As a programmer, you have to be courageous, bold, fearless, and &lt;strong&gt;ruthless&lt;/strong&gt;. If you can't bring yourself to remove legacy code because you may need it later, you've failed. Whenever I feel hesitation while programming, I make a mental note to seriously reconsider what I'm doing. If it makes me feel uncomfortable, there's a good chance I need to do that shit right away.&lt;/p&gt;
&lt;p&gt;Being ruthless with your code means you make commits that fix whitespace, fix indentation, remove entire source files, deprecate API calls, and drastically change functionality--whatever needs to be done, you do it without a bit of regret.&lt;/p&gt;
&lt;p&gt;There have been countless times that I've worked on code for a week or two, just to realize I went off on a tangent and completely strayed from the main objective. In times like this, the only thing to do is remove everything and move on. There is no room for ego in success.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be ruthless.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="I-regret-nothing" height="260" src="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-16/iahdoDdAufExuDqDcgBjuCsbsHpChdAjlGyzBohDeDDBzjneyqkubwuxssxk/i-regret-nothing.gif.scaled696.gif" width="464" /&gt;
&lt;/div&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;How About You?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I'm extremely interested in how other people build stuff. If you've written about how you program stuff, or how you prefer to work, please let me know.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/how-i-program-stuff"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/how-i-program-stuff#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/C6QVTxt-jWQ" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/gif" height="386" width="443" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-16/GllvqwjqypeiwEbhDzJuBqDjofsCwbwyCDecyityFgqlEDhdbCjjrmCmqztg/meditate.GIF">
        <media:thumbnail height="386" width="443" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-16/GllvqwjqypeiwEbhDzJuBqDjofsCwbwyCDecyityFgqlEDhdbCjjrmCmqztg/meditate.GIF.scaled500.gif" />
      </media:content>
      <media:content type="image/png" height="500" width="550" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-16/pibCgcGdIqpiafpvHfwgkGavHAvDdsDwrGqBDEtAJqBorgiHqDfsCeIpCuFi/rm-rf.png">
        <media:thumbnail height="455" width="500" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-16/pibCgcGdIqpiafpvHfwgkGavHAvDdsDwrGqBDEtAJqBorgiHqDfsCeIpCuFi/rm-rf.png.scaled500.png" />
      </media:content>
      <media:content type="image/jpeg" height="323" width="400" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-16/JkxjHfyICrHoxEwCmheycmrmdGvCnBqtxtwmAGucrDqysotIGFzgurHGnpDq/fist.JPG">
        <media:thumbnail height="323" width="400" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-16/JkxjHfyICrHoxEwCmheycmrmdGvCnBqtxtwmAGucrDqysotIGFzgurHGnpDq/fist.JPG.scaled500.jpg" />
      </media:content>
      <media:content type="image/gif" height="290" width="426" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-16/BaGedtAfIcrAqkGioeyezyIhioBirEgqADaEtkEuItxDIvqJbrizyBqtfDBh/programmer.gif">
        <media:thumbnail height="290" width="426" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-16/BaGedtAfIcrAqkGioeyezyIhioBirEgqADaEtkEuItxDIvqJbrizyBqtfDBh/programmer.gif.scaled500.gif" />
      </media:content>
      <media:content type="image/gif" height="260" width="464" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-16/iahdoDdAufExuDqDcgBjuCsbsHpChdAjlGyzBohDeDDBzjneyqkubwuxssxk/i-regret-nothing.gif">
        <media:thumbnail height="260" width="464" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-16/iahdoDdAufExuDqDcgBjuCsbsHpChdAjlGyzBohDeDDBzjneyqkubwuxssxk/i-regret-nothing.gif" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/how-i-program-stuff</feedburner:origLink></item>
    <item>
      <pubDate>Sun, 15 Jan 2012 23:46:55 -0800</pubDate>
      <title>Reflections on Heroku's Waza Event</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/cUlnOP0f3Y4/reflections-on-herokus-waza-event</link>
      <guid isPermaLink="false">http://rdegges.com/reflections-on-herokus-waza-event</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Heroku-logo" height="98" src="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-15/rbHcabDHcIDmbvexbzEBgtgsoAFdwpsEgnzjyGtqnojHHlHpAnDpHuaxpdBz/heroku-logo.png.scaled696.png" width="313" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Several days ago I was lucky enough to attend &lt;a href="http://www.heroku.com/" title="Heroku"&gt;Heroku's&lt;/a&gt; first conference, &lt;a href="http://waza.heroku.com/" title="Heroku Waza"&gt;Waza&lt;/a&gt;. Waza is the Japanese word for art and technique, which, in retrospect, was nothing short of the perfect name for the event. In my life, I've never attended such an artistic, well planned, and stylish event.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Surprise!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If this isn't the first time you've visited my site, you probably know I primarily write about technical stuff. Over the past few months I've been writing a lot about Heroku, which is, in my opinion, the best &lt;a href="https://www.djangoproject.com/" title="Django"&gt;Django&lt;/a&gt; hosting platform available.&lt;/p&gt;
&lt;p&gt;A few weeks back I got an email inviting me to Heroku's first conference, Waza, which was going to be held on January 11th in San Francisco.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Woa.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I immediately accepted the invitation. It's not every day you get to meet with a group of the best programmers in the industry. The guys who work at Heroku are all top notch developers, and people. If programming was illegal streetfighting, and I had to pick a partner to help me escape a no-rules-streetfight, I would pick anyone from the Heroku team in a heartbeat. :)&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Programming" height="430" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-15/ElhcIdinfjgjIJvcxuAwbklasgpzAcyrFGJypmwoBzFItyybgydmktvBcyox/programming.png.scaled696.png" width="576" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Anyhow, despite the fact that I can't imagine why anyone from Heroku would invite me to their conference, I got in!&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Waza&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Without a doubt, Waza was by far the nicest conference I've ever been to. It was nothing like a traditional tech conference.&lt;/p&gt;
&lt;p&gt;The venue was particularly stunning. The event was held at &lt;a href="http://www.yoshis.com/sanfrancisco" title="Yoshi's Jazz Club"&gt;Yoshi's&lt;/a&gt;, a jazz club in San Francisco. Heroku essentially turned the entire inside of the place into a Japanese village. There were zen gardens, Japanese style eating mats, amazing tea, and beautiful lighting throughout. Entering the venue was a lot like walking into a dream. The entire place was beautiful, elegant, and relaxing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I didn't get any pictures of the event, but &lt;a href="http://kennethreitz.com/" title="Kenneth Reitz"&gt;Kenneth Reitz&lt;/a&gt; got a ton that totally kick-ass. I highly recommend checking out his &lt;a href="http://www.flickr.com/photos/kennethreitz/sets/72157628841270129/" title="Waza Flickr"&gt;Flickr album&lt;/a&gt;. If you look close, you'll find me :)&lt;/p&gt;
&lt;p&gt;The event started at 11am with an excellent opening talk by Adam Wiggins, CTO and co-founder of Heroku. His talk was all about building excellent applications: why elegance is important, what trends software development got over the past decade, and what trends will become influential this decade. His talk primarily focused on application elegance, which I thought was a great intro for the Waza conference, which focused on software development technique and art more than anything else.&lt;/p&gt;
&lt;p&gt;The talks were all amazing. All were focused around building elegant applications. As a developer, I truly enjoyed the talks I got to attend. They were all inspiring, well executed, and filled with lots of useful information.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;People&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;By far the best part of the event was the people. In particular, I got to meet:&amp;nbsp;&lt;a href="http://www.craigkerstiens.com/" title="Craig Kerstiens"&gt;Craig Kerstiens&lt;/a&gt;, &lt;a href="http://kennethreitz.com/" title="Kenneth Reitz"&gt;Kenneth Reitz&lt;/a&gt;, &lt;a href="http://asenchi.com/" title="Curt Micol"&gt;Curt Micol&lt;/a&gt;, and&amp;nbsp;&lt;a href="http://www.kellycreativetech.com/" title="Issac Kelly"&gt;Issac Kelly&lt;/a&gt;. Those guys are all programming superheros.&lt;/p&gt;
&lt;p&gt;I've known Craig, Kenneth and Issac online for a while, but meeting them in person was really great. If you guys are reading this: we should meet up again soon!&lt;/p&gt;
&lt;p&gt;As a complete surprise to me, I learned after arriving at Waza that &lt;a href="http://en.wikipedia.org/wiki/Rob_Pike" title="Rob Pike"&gt;Rob Pike&lt;/a&gt; was going to be giving the closing talk. If you don't know Rob Pike: he's one of the most influential programmers of all time. He co-created &lt;a href="http://en.wikipedia.org/wiki/UTF-8" title="UTF-8"&gt;UTF-8&lt;/a&gt; (unicode), created the &lt;a href="http://golang.org/" title="Go"&gt;Go&lt;/a&gt; programming language, and made countless contributions to UNIX. He&amp;nbsp;also wrote two excellent books that contributed wildly to the programming profession: &lt;a href="http://www.amazon.com/gp/product/020161586X/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=projectb14ck-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=020161586X" title="The Practice of Programming"&gt;The Practice of Programming&lt;/a&gt;, and &lt;a href="http://www.amazon.com/gp/product/013937681X/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=projectb14ck-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=013937681X" title="The UNIX Programming Environment"&gt;The UNIX Programming Environment&lt;/a&gt;. Without Rob Pike, the world would truly be a different place.&lt;/p&gt;
&lt;p&gt;Seeing Rob in person was fucking awesome. His talk was great, and it was incredibly inspiring to even be in the same room as such an amazing guy. As my wife can attest, one of my lifelong dreams has been to meet &lt;a href="http://www.cs.princeton.edu/~bwk/" title="Brian Kernighan"&gt;Brian Kernighan&lt;/a&gt;, &lt;a href="http://cm.bell-labs.com/who/dmr/" title="Dennis Ritchie"&gt;Dennis Ritchie&lt;/a&gt;, and Rob Pike. While I'll never be able to meet Dennis (he passed away last year), I'm extremely happy to have had the opportunity to meet Rob.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Tea&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Green-tea-leaves" height="500" src="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-15/hGwqFivvoektFwegakayoykmzCGHbknidrExhhplcEbBpAlvmDddelbJzngH/green-tea-leaves.jpg.scaled696.jpg" width="470" /&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Oddly enough, other than an excellent group of techies--Waza had some amazing vendors come to cater the event, one of which was &lt;a href="http://www.teance.com/" title="teance"&gt;teance&lt;/a&gt;, a Berkely tea shop. They were serving several types of fresh tea, all of which were fabulous.&lt;/p&gt;
&lt;p&gt;I've never been into tea much, but after a cup of teance's green tea, I was a convert. Best tea I've ever had in my life, hands down.&lt;/p&gt;
&lt;p&gt;What made it even better was that the owner of the shop happened to be at the event serving tea, and answered all sorts of crazy questions I had about the tea.&lt;/p&gt;
&lt;p&gt;After the event, my wife and I drove to the teance shop in Berkely, and had tea at their bar. We tried several types of tea, and left with a couple hundred dollars worth of the stuff. Money well spent.&lt;/p&gt;
&lt;p&gt;If you're into tea at all, you should definitely check out the &lt;a href="http://www.teance.com/" title="teance"&gt;teance&lt;/a&gt; site and order some. I guarantee you won't be&amp;nbsp;disappointed.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Overall&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Waza was a great event. The venue was great, the whole thing was comfortable and relaxing, and there were tons of smart and interesting people all over the place. It was a great experience, and I had a ton of fun.&lt;/p&gt;
&lt;p&gt;I hope the Heroku guys throw another one sometime soon.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/reflections-on-herokus-waza-event"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/reflections-on-herokus-waza-event#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/cUlnOP0f3Y4" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/png" height="430" width="576" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-15/ElhcIdinfjgjIJvcxuAwbklasgpzAcyrFGJypmwoBzFItyybgydmktvBcyox/programming.png">
        <media:thumbnail height="373" width="500" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-01-15/ElhcIdinfjgjIJvcxuAwbklasgpzAcyrFGJypmwoBzFItyybgydmktvBcyox/programming.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="98" width="313" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-15/rbHcabDHcIDmbvexbzEBgtgsoAFdwpsEgnzjyGtqnojHHlHpAnDpHuaxpdBz/heroku-logo.png">
        <media:thumbnail height="98" width="313" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-01-15/rbHcabDHcIDmbvexbzEBgtgsoAFdwpsEgnzjyGtqnojHHlHpAnDpHuaxpdBz/heroku-logo.png.scaled500.png" />
      </media:content>
      <media:content type="image/jpeg" height="500" width="470" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-15/hGwqFivvoektFwegakayoykmzCGHbknidrExhhplcEbBpAlvmDddelbJzngH/green-tea-leaves.jpg">
        <media:thumbnail height="500" width="470" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-15/hGwqFivvoektFwegakayoykmzCGHbknidrExhhplcEbBpAlvmDddelbJzngH/green-tea-leaves.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/reflections-on-herokus-waza-event</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 09 Jan 2012 22:37:00 -0800</pubDate>
      <title>Dogs Are Great Programming Companions</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/qssdgn61zZQ/dogs-are-great-programming-companions</link>
      <guid isPermaLink="false">http://rdegges.com/dogs-are-great-programming-companions</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Hello-yes-this-is-dog" height="409" src="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-09/HijrvlgdnHcpCHmxGBqeAEjsftkvahdFbCIBcBabbEeexeypzfIrmFqqGdfy/hello-yes-this-is-dog.png.scaled696.png" width="500" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I love dogs. Really. They're the best beasts on the planet.&lt;/p&gt;
&lt;p&gt;For those of you who don't know: I work at home with my chihuaha, Scribbles. She's an awesome programming companion. As I work she lays in her dog bed next to my desk, and naps while I code. When I stand up and move around, she chases me around the house, and gets me to take her outside for a walk.&lt;/p&gt;
&lt;p&gt;Since I started working at home two years ago, I've realized how great a dog can really be while you work. For me, Scribbles keeps me balanced. When I'm feeling stressed, I can lean down and scratch her head. If I've been sitting too long, Scribbles will get my attention and demand a walk. She always knows exactly what to do to keep me sane, day after day.&lt;/p&gt;
&lt;p&gt;When I'm working on particularly complex software problems, I'll often talk out loud to her, explaining my thinking and proposed solution. Half the time, just the act of forcing myself to talk to her, explaining myself, helps me realize problems in my thinking.&lt;/p&gt;
&lt;p&gt;In addition to the benefits of having a funny looking animal around at all times: knowing you've got some unconditional love no more than 2 feet away is a nice reminder life is good. Even when I'm working really hard to fix critical problems, or in the zone coding away, having a dog nearby makes me feel comfortable and happy.&lt;/p&gt;
&lt;p&gt;Here are some pictures of Scribbles (the destroyer of worlds), in all her glory:&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Scrib1" height="301" src="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dazmcynoJIshfBwziFkwvpqIzqJBEJCzytqtcHhoxHpsDszltyCkFBDbqmzA/scrib1.jpg.scaled696.jpg" width="401" /&gt;
&lt;img alt="Scrib2" height="395" src="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dtvAzusIlijJDFGfkExFhjgpnwAHtmencCczwvdDmEzqjIprvtdhdjaAflfp/scrib2.jpg.scaled696.jpg" width="347" /&gt;
&lt;a href="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dasjpmcxujfirsdGiyxEqndFhptqshiuFzBoxyAwAmprGlxIAdAvcfmrlnfl/scrib3.jpg.scaled1000.jpg"&gt;&lt;img alt="Scrib3" height="464" src="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dasjpmcxujfirsdGiyxEqndFhptqshiuFzBoxyAwAmprGlxIAdAvcfmrlnfl/scrib3.jpg.scaled696.jpg" width="696" /&gt;&lt;/a&gt;
&lt;img alt="Scrib4" height="720" src="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-09/ichAwFdsdcGeiEczEBCJGECCcGkJFlFCiGpIHtygmcdsscsefAlpwCGqGnay/scrib4.jpg.scaled696.jpg" width="431" /&gt;
&lt;img alt="Scrib6" height="453" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-09/BBuijBCCHcfBIqCddAgzDBrAHqqEjsxDerywIzqArJijFtikGfvAquHqJozj/scrib6.jpg.scaled696.jpg" width="604" /&gt;
&lt;img alt="Scrib7" height="453" src="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-09/adCyEydvAncjeBuwGEFcBdnEFjpvyIgwJlBuGcuIlHzsDjybproxwqlkJugw/scrib7.jpg.scaled696.jpg" width="604" /&gt;
&lt;img alt="Scrib5" height="453" src="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-09/EwFiJqHdABuyGtCHoDtlvssitzzmDrtqlljvlxilatnogBJCjsFgtBblakhe/scrib5.jpg.scaled696.jpg" width="604" /&gt;
&lt;img alt="Scrib8" height="453" src="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-01-09/JutDqjqmDcvChFxjEavGAIEeEHncgmiqbzfCxmBkhrpcGBdseJvpGoffyIus/scrib8.jpg.scaled696.jpg" width="604" /&gt;
&lt;a href="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-09/fnJimocEssciummshjhzcEzAwlahGhkgkCliJGJBHrFiitzfskhemtDCbEBt/scrib9.jpg.scaled1000.jpg"&gt;&lt;img alt="Scrib9" height="522" src="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-01-09/fnJimocEssciummshjhzcEzAwlahGhkgkCliJGJBHrFiitzfskhemtDCbEBt/scrib9.jpg.scaled696.jpg" width="696" /&gt;&lt;/a&gt;
&lt;a href="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-01-09/HvEhmnpetevElpsACcmFBzfHqtydCDIckIybsskvIqGnBrdGvCoCsCryxaBd/scrib10.jpg.scaled1000.jpg"&gt;&lt;img alt="Scrib10" height="522" src="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-09/HvEhmnpetevElpsACcmFBzfHqtydCDIckIybsskvIqGnBrdGvCoCsCryxaBd/scrib10.jpg.scaled696.jpg" width="696" /&gt;&lt;/a&gt;
&lt;a href="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-09/vhpjguDxAEhGDhEilEBbmzklyuIJtspxsDFAIdvlgzydxyyhdggjHAiclGlc/scrib11.jpg.scaled1000.jpg"&gt;&lt;img alt="Scrib11" height="522" src="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-09/vhpjguDxAEhGDhEilEBbmzklyuIJtspxsDFAIdvlgzydxyyhdggjHAiclGlc/scrib11.jpg.scaled696.jpg" width="696" /&gt;&lt;/a&gt;
&lt;div class='p_see_full_gallery'&gt;&lt;a href="http://rdegges.com/dogs-are-great-programming-companions"&gt;See the full gallery on Posterous&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: Incase you're wondering--she's named Scribbles because she has scribbled markings all over her coat.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/dogs-are-great-programming-companions"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/dogs-are-great-programming-companions#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/qssdgn61zZQ" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/png" height="409" width="500" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-09/HijrvlgdnHcpCHmxGBqeAEjsftkvahdFbCIBcBabbEeexeypzfIrmFqqGdfy/hello-yes-this-is-dog.png">
        <media:thumbnail height="409" width="500" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-09/HijrvlgdnHcpCHmxGBqeAEjsftkvahdFbCIBcBabbEeexeypzfIrmFqqGdfy/hello-yes-this-is-dog.png.scaled500.png" />
      </media:content>
      <media:content type="image/jpeg" height="301" width="401" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dazmcynoJIshfBwziFkwvpqIzqJBEJCzytqtcHhoxHpsDszltyCkFBDbqmzA/scrib1.jpg">
        <media:thumbnail height="301" width="401" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dazmcynoJIshfBwziFkwvpqIzqJBEJCzytqtcHhoxHpsDszltyCkFBDbqmzA/scrib1.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="395" width="347" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dtvAzusIlijJDFGfkExFhjgpnwAHtmencCczwvdDmEzqjIprvtdhdjaAflfp/scrib2.jpg">
        <media:thumbnail height="395" width="347" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dtvAzusIlijJDFGfkExFhjgpnwAHtmencCczwvdDmEzqjIprvtdhdjaAflfp/scrib2.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="480" width="720" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dasjpmcxujfirsdGiyxEqndFhptqshiuFzBoxyAwAmprGlxIAdAvcfmrlnfl/scrib3.jpg">
        <media:thumbnail height="333" width="500" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-09/dasjpmcxujfirsdGiyxEqndFhptqshiuFzBoxyAwAmprGlxIAdAvcfmrlnfl/scrib3.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="720" width="431" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-09/ichAwFdsdcGeiEczEBCJGECCcGkJFlFCiGpIHtygmcdsscsefAlpwCGqGnay/scrib4.jpg">
        <media:thumbnail height="720" width="431" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-09/ichAwFdsdcGeiEczEBCJGECCcGkJFlFCiGpIHtygmcdsscsefAlpwCGqGnay/scrib4.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="453" width="604" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-09/BBuijBCCHcfBIqCddAgzDBrAHqqEjsxDerywIzqArJijFtikGfvAquHqJozj/scrib6.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-01-09/BBuijBCCHcfBIqCddAgzDBrAHqqEjsxDerywIzqArJijFtikGfvAquHqJozj/scrib6.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="453" width="604" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-09/adCyEydvAncjeBuwGEFcBdnEFjpvyIgwJlBuGcuIlHzsDjybproxwqlkJugw/scrib7.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-09/adCyEydvAncjeBuwGEFcBdnEFjpvyIgwJlBuGcuIlHzsDjybproxwqlkJugw/scrib7.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="453" width="604" url="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-01-09/EwFiJqHdABuyGtCHoDtlvssitzzmDrtqlljvlxilatnogBJCjsFgtBblakhe/scrib5.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-09/EwFiJqHdABuyGtCHoDtlvssitzzmDrtqlljvlxilatnogBJCjsFgtBblakhe/scrib5.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="453" width="604" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-09/JutDqjqmDcvChFxjEavGAIEeEHncgmiqbzfCxmBkhrpcGBdseJvpGoffyIus/scrib8.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-09/JutDqjqmDcvChFxjEavGAIEeEHncgmiqbzfCxmBkhrpcGBdseJvpGoffyIus/scrib8.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="684" width="912" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-09/fnJimocEssciummshjhzcEzAwlahGhkgkCliJGJBHrFiitzfskhemtDCbEBt/scrib9.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-09/fnJimocEssciummshjhzcEzAwlahGhkgkCliJGJBHrFiitzfskhemtDCbEBt/scrib9.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="612" width="816" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-09/HvEhmnpetevElpsACcmFBzfHqtydCDIckIybsskvIqGnBrdGvCoCsCryxaBd/scrib10.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-09/HvEhmnpetevElpsACcmFBzfHqtydCDIckIybsskvIqGnBrdGvCoCsCryxaBd/scrib10.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="684" width="912" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-09/vhpjguDxAEhGDhEilEBbmzklyuIJtspxsDFAIdvlgzydxyyhdggjHAiclGlc/scrib11.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-09/vhpjguDxAEhGDhEilEBbmzklyuIJtspxsDFAIdvlgzydxyyhdggjHAiclGlc/scrib11.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/dogs-are-great-programming-companions</feedburner:origLink></item>
    <item>
      <pubDate>Sat, 07 Jan 2012 17:34:00 -0800</pubDate>
      <title>Tools I Use - tmux</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/8X2GRrFJ4zc/tools-i-use-tmux</link>
      <guid isPermaLink="false">http://rdegges.com/tools-i-use-tmux</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Tools" height="369" src="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-07/gbzgGJqHAFBqjzikpublGgrBinGvDjmivmgHawFpHlcaosbDcflxaGEysnrj/tools.png.scaled696.png" width="395" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I love reading about tools other programmers use in their day-to-day existence. There are so many great pieces of software out there that it's impossible to hear about them all. Whenever I read articles (or watch screencasts) that other developers make, I tend to learn a lot.&lt;/p&gt;
&lt;p&gt;So, I decided to start my own series here on my site, dedicated to talking about the tools I use, and how I use them. Unfortunately, I probably don't have much useful information to give in this area--but I figure that if I start writing about it, I'm bound to learn more about the tools I use along the way. So this is a win-win for me.&lt;/p&gt;
&lt;p&gt;As this is the first article in the series, I figured what better time to discuss &lt;a href="http://tmux.sourceforge.net/" title="tmux"&gt;tmux&lt;/a&gt;, my favorite terminal multiplexer!&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Terminal Multiplexers&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you've ever had the need to run multiple terminal windows inside an existing terminal window, you've probably heard of &lt;a href="http://www.gnu.org/software/screen/" title="GNU screen"&gt;GNU screen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;GNU screen is one of the most popular terminal multiplexers of all time. What it allows you to do is have a large amount of virtual terminals that you can create, move around, and use at will. What's great about tools like GNU screen is that they allow you to quickly move between your terminal windows using keyboard shortcuts, which can often times be a lot quicker than alt+tab'ing to a new terminal window on your OS.&lt;/p&gt;
&lt;p&gt;The other great thing about terminal multiplexers like GNU screen and tmux is that they give you the power to tile your windows as you please. For instance, you can run two terminals side by side, one window with code, and another with a shell for testing your code on the command line. This can be a great help in many situations.&lt;/p&gt;
&lt;p&gt;When I first made the jump from using my OS terminal program to using GNU screen a few years ago, my productivity shot up enormously, as I was able to quickly move around through terminals like I never could before. I instantly started writing code faster, finding problems quicker, and spending much less time creating and moving terminal windows around on my desktop.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;tmux - A Cool Terminal Multiplexer&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;While I was using GNU screen for a few years, I always had some issues with it that didn't sit well with me. For one, while I had my GNU screen software highly configured, I was still unable to perform some seemingly basic tasks like create horizontally split windows. This meant that I could only open columns of terminals, restricting the usefulness of my terminal.&lt;/p&gt;
&lt;p&gt;Furthermore, GNU screen had a lot of complex keybindings that tended to make it difficult for me to get used to. I remember spending quite a bit of time when first learning GNU screen just memorizing the basics.&lt;/p&gt;
&lt;p&gt;One frustrating day while I was struggling to adjust some screen keybindings, I decided to look for alternatives. After a bit of research I stumbled upon tmux. What a great day that was.&lt;/p&gt;
&lt;p&gt;tmux, just like screen, is a terminal multiplexer. What's great about tmux is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It's a lot simpler than GNU screen. It has sane defaults configured, and requires much less configuration to be useful.&lt;/li&gt;
&lt;li&gt;It supports both vertical AND horizontally split windows.&lt;/li&gt;
&lt;li&gt;It has a really awesome keybinding that allows you to magically rearrange your terminal windows in a variety of patterns. This is extremely useful for situations where you open multiple windows, and then want them to be moved to a decent looking pattern, but don't want to configure each window manually.&lt;/li&gt;
&lt;li&gt;It has great documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;tmux in Action&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A picture is worth a thousand words. I won't bore you any further, here are some screenies of tmux in action.&lt;/p&gt;
&lt;p&gt;This first picture is just a simple display of tmux with multiple windows open (note the window names at the bottom):&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lumlvaGlvnItAmfsyCCuztAcBsGfqdbImyFndpbrHmnBkpsqokldiBHEJCtf/tmux_simple.png.scaled1000.png"&gt;&lt;img alt="Tmux_simple" height="446" src="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lumlvaGlvnItAmfsyCCuztAcBsGfqdbImyFndpbrHmnBkpsqokldiBHEJCtf/tmux_simple.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;/div&gt;
Next, we have a single tmux window open, broken into three panes: one is vertically split, while the other is horizontally split. As you can see, this makes coding quite convenient since I can code, look at tests, and browse documentation all in the same window:&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lzdinBqsscafepgbzcDupqDhHyGpgngfzqErGwxBsffDdJrhwtGbcHAdIahi/tmux_multiple_panes.png.scaled1000.png"&gt;&lt;img alt="Tmux_multiple_panes" height="383" src="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lzdinBqsscafepgbzcDupqDhHyGpgngfzqErGwxBsffDdJrhwtGbcHAdIahi/tmux_multiple_panes.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Here I just hit a single key, and had tmux automatically re-arrange my panes a few times in a row. Nice, huh?&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-07/iGcwcsGFkJHoFtvEununxFBieICqbqEptDzdehtjgkrrinDrfiyyjiCGuncB/tmux_auto_arrange_1.png.scaled1000.png"&gt;&lt;img alt="Tmux_auto_arrange_1" height="383" src="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-07/iGcwcsGFkJHoFtvEununxFBieICqbqEptDzdehtjgkrrinDrfiyyjiCGuncB/tmux_auto_arrange_1.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;a href="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-07/FvGIwokhrhvrBiyArhdwjqbfdgHzAzHkuzAcisnCBsnhfDAGEwuFGjmwbxJJ/tmux_auto_arrange_2.png.scaled1000.png"&gt;&lt;img alt="Tmux_auto_arrange_2" height="383" src="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-07/FvGIwokhrhvrBiyArhdwjqbfdgHzAzHkuzAcisnCBsnhfDAGEwuFGjmwbxJJ/tmux_auto_arrange_2.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;a href="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-07/rtfDkouDrjEgsGijvfJatlGBhtgICfqpyhsaopakhyemkzEEtcakdhEvBABx/tmux_auto_arrange_3.png.scaled1000.png"&gt;&lt;img alt="Tmux_auto_arrange_3" height="383" src="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-07/rtfDkouDrjEgsGijvfJatlGBhtgICfqpyhsaopakhyemkzEEtcakdhEvBABx/tmux_auto_arrange_3.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;div class='p_see_full_gallery'&gt;&lt;a href="http://rdegges.com/tools-i-use-tmux"&gt;See the full gallery on Posterous&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;tmux - Configuration&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One of the great things about tmux is that it requires almost no configuration to be useful. Unlike GNU screen which requires quite a bit of tweaking (in my opinion) to be useful, tmux has sane defaults out of the box.&lt;/p&gt;
&lt;p&gt;Below is my &lt;strong&gt;~/.tmux.conf&lt;/strong&gt; file. As you can see, it's very simple:&lt;/p&gt;
&lt;p&gt;&lt;div class="data type-text"&gt;
      &lt;table class="lines" cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            &lt;pre class="line_numbers"&gt;&lt;span rel="#L1" id="L1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="L2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="L3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="L4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="L5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="L6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="L7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="L8"&gt;8&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
                &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;set -g prefix C-a&lt;/div&gt;&lt;div class="line" id="LC2"&gt;unbind %&lt;/div&gt;&lt;div class="line" id="LC3"&gt;bind \ split-window -h&lt;/div&gt;&lt;div class="line" id="LC4"&gt;bind - split-window -v&lt;/div&gt;&lt;div class="line" id="LC5"&gt;bind-key k select-pane -U&lt;/div&gt;&lt;div class="line" id="LC6"&gt;bind-key j select-pane -D&lt;/div&gt;&lt;div class="line" id="LC7"&gt;bind-key h select-pane -L&lt;/div&gt;&lt;div class="line" id="LC8"&gt;bind-key l select-pane -R&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The changes I made are simply to remap keys for my own preferences. Here's what my changes do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set the tmux command key to CTRL+a (just like GNU screen). That means all tmux commands are prefixed with &lt;strong&gt;C-a&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;To create vertical split windows, I setup keymappings for &lt;strong&gt;C-a |&lt;/strong&gt;. To me, since the pipe key (|) looks like a vertical split, it makes sense to have that key open a new split window.&lt;/li&gt;
&lt;li&gt;Likewise, I also bound the horizontal split key to &lt;strong&gt;C-a -&lt;/strong&gt; (the dash key), since the dash key looks like a horizontal split.&lt;/li&gt;
&lt;li&gt;The last few changes make moving between split windows easy. To navigate through windows, I assigned vim-like keybindings. EG:   
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C-a h&lt;/strong&gt; will move you one window to the left.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C-a j&lt;/strong&gt; will move you one window down.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C-a k&lt;/strong&gt; will move you one window up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C-a l&lt;/strong&gt; will move you one window right.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, I had to make very few changes to tmux in order for it to be useful to me.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;tmux - Resources&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you'd like to give tmux a try, here are some resources to get you going. tmux has become one of my favorite and most used tools since I started using it earlier last year. I'd highly recommend it to anyone who does a lot of terminal work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tmux.sourceforge.net/" title="tmux"&gt;The main tmux website.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;man tmux&lt;/strong&gt; - has great information and is highly readable.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://robots.thoughtbot.com/post/2641409235/a-tmux-crash-course" title="tmux Crash Course"&gt;tmux crash course&lt;/a&gt;, a really great introduction to using tmux.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/" title="tmux series"&gt;tmux&lt;/a&gt;, a series of blog posts explaining tmux in depth. A great read.&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/tools-i-use-tmux"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/tools-i-use-tmux#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/8X2GRrFJ4zc" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/png" height="369" width="395" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-07/gbzgGJqHAFBqjzikpublGgrBinGvDjmivmgHawFpHlcaosbDcflxaGEysnrj/tools.png">
        <media:thumbnail height="369" width="395" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-07/gbzgGJqHAFBqjzikpublGgrBinGvDjmivmgHawFpHlcaosbDcflxaGEysnrj/tools.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="464" width="724" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lumlvaGlvnItAmfsyCCuztAcBsGfqdbImyFndpbrHmnBkpsqokldiBHEJCtf/tmux_simple.png">
        <media:thumbnail height="320" width="500" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lumlvaGlvnItAmfsyCCuztAcBsGfqdbImyFndpbrHmnBkpsqokldiBHEJCtf/tmux_simple.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="1056" width="1920" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lzdinBqsscafepgbzcDupqDhHyGpgngfzqErGwxBsffDdJrhwtGbcHAdIahi/tmux_multiple_panes.png">
        <media:thumbnail height="275" width="500" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-07/lzdinBqsscafepgbzcDupqDhHyGpgngfzqErGwxBsffDdJrhwtGbcHAdIahi/tmux_multiple_panes.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="1056" width="1920" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-07/iGcwcsGFkJHoFtvEununxFBieICqbqEptDzdehtjgkrrinDrfiyyjiCGuncB/tmux_auto_arrange_1.png">
        <media:thumbnail height="275" width="500" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-01-07/iGcwcsGFkJHoFtvEununxFBieICqbqEptDzdehtjgkrrinDrfiyyjiCGuncB/tmux_auto_arrange_1.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="1056" width="1920" url="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2012-01-07/FvGIwokhrhvrBiyArhdwjqbfdgHzAzHkuzAcisnCBsnhfDAGEwuFGjmwbxJJ/tmux_auto_arrange_2.png">
        <media:thumbnail height="275" width="500" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-07/FvGIwokhrhvrBiyArhdwjqbfdgHzAzHkuzAcisnCBsnhfDAGEwuFGjmwbxJJ/tmux_auto_arrange_2.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="1056" width="1920" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-07/rtfDkouDrjEgsGijvfJatlGBhtgICfqpyhsaopakhyemkzEEtcakdhEvBABx/tmux_auto_arrange_3.png">
        <media:thumbnail height="275" width="500" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-07/rtfDkouDrjEgsGijvfJatlGBhtgICfqpyhsaopakhyemkzEEtcakdhEvBABx/tmux_auto_arrange_3.png.scaled500.png" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/tools-i-use-tmux</feedburner:origLink></item>
    <item>
      <pubDate>Sat, 07 Jan 2012 17:31:00 -0800</pubDate>
      <title>Going to War</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/mkfzwAB8gPc/going-to-war</link>
      <guid isPermaLink="false">http://rdegges.com/going-to-war</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Genghis_khan" height="413" src="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-07/hCnydBjukiAnssiHHhmFpkdAkqfkgvzmwizdFpiGtkvvHwfoyngGqfIqcaei/Genghis_Khan.jpg.scaled696.jpg" width="300" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Sometimes personal development can be hard, really hard. I find that I go through periods where I just feel exhausted of continuously trying to make myself a better person.&lt;/p&gt;
&lt;p&gt;Unfortunately, I don't really see this discussed much online. I think people who write online tend to do so when they're feeling good, thereby eliminating a big amount of the negative personal development articles that would exist otherwise. Since I'm in a neutral mood right now, I figured I'd throw my opinions up here to contribute to the discussion.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Exhaustion&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When I'm exhausted with personal development, I tend to not do much to fix it. Instead of&amp;nbsp;consciously seeking out ways to get out of my slump, I'll usually just sit around thinking about things myself. When I get into this mood, I feel completely exhausted.&lt;/p&gt;
&lt;p&gt;I think that becoming tired of dealing with personal development in a normal thing. When you spend a large amount of your time and energy trying to better yourself (eat better, work better, play better), it is only natural that your body and mind will need some time to rest.&lt;/p&gt;
&lt;p&gt;The real problem arises when after you've sufficently recovered, you still can't get yourself back into the development phase again.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;The War Motive&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To me, nothing is more motivating than a big life or death challenge. We've all seen this in movies, and read about it in books.&lt;/p&gt;
&lt;p&gt;The hero is hopelessly outnumbered, surrounded by bad guys. He's weak, frightened, and near death. He realizes that he's about to die, and then, his life flashes before his eyes. He immediately realizes why he's fighting in the first place, and decides to commit to winning with his life. A moment later he explodes in fury, wiping out his enemies, and emerging victorious.&lt;/p&gt;
&lt;p&gt;The reason the hero won is because he went to war. He knew that he was in a dire situation, and he decided to do whatever it would take to win.&lt;/p&gt;
&lt;p&gt;War can be a powerful motive, not only for heros in movies, but for you. If you find yourself stuck at a point where you can no longer progress, and find yourself battling off the forces that be but not winning--maybe you should consider starting a war.&lt;/p&gt;
&lt;p&gt;Doing so is farily easy: you commit to winning with your life. You make a pact with yourself to fight this thing with every last ounce of energy left in your body and mind, or you die trying.&lt;/p&gt;
&lt;p&gt;This sort of motivation is drastic, probably not recommended by psychiatrists, but effective.&lt;/p&gt;
&lt;p&gt;I've found that the war motive works really well for me. I've used it frequently over the past few years to kick myself out of poor situations and progress regardless of whatever issues I was facing at the time.&lt;/p&gt;
&lt;p&gt;What techniques do you use to motivate yourself, and push yourself beyond your limits?&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/going-to-war"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/going-to-war#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/mkfzwAB8gPc" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="413" width="300" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-07/hCnydBjukiAnssiHHhmFpkdAkqfkgvzmwizdFpiGtkvvHwfoyngGqfIqcaei/Genghis_Khan.jpg">
        <media:thumbnail height="413" width="300" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-07/hCnydBjukiAnssiHHhmFpkdAkqfkgvzmwizdFpiGtkvvHwfoyngGqfIqcaei/Genghis_Khan.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/going-to-war</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 06 Jan 2012 20:37:00 -0800</pubDate>
      <title>How to Instantly Fix Problematic Deployments on Heroku</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/Vn_uaUZ0Gmc/how-to-instantly-fix-problematic-deployments</link>
      <guid isPermaLink="false">http://rdegges.com/how-to-instantly-fix-problematic-deployments</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Broke_production" height="400" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-01-06/EaECemrmctGEzAAsbBtgAhAlqqEifinaGwfrwHdAHibvfhfABmjBdGugxdIo/broke_production.jpg.scaled696.jpg" width="400" /&gt;
&lt;/div&gt;
&lt;strong style="text-align: center;"&gt;NOTE&lt;/strong&gt;&lt;span style="text-align: center;"&gt;: Have no idea what &lt;/span&gt;&lt;a href="http://www.heroku.com/" title="Heroku" style="text-align: center;"&gt;Heroku&lt;/a&gt;&lt;span style="text-align: center;"&gt; is? I feel sorry for you. You should create an account with them immediately, then come back and read this post!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Today I was working with my new co-worker on one of our company's &lt;a href="https://www.djangoproject.com/" title="Django"&gt;Django&lt;/a&gt; projects, and after deploying some code, noticed that our &lt;a href="http://newrelic.com/" title="NewRelic, the Best Fucking Application Monitoring Software Ever Written"&gt;NewRelic&lt;/a&gt; panel was spitting out loads of DatabaseErrors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oh shit!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In situations like this, Heroku's fabulous &lt;a href="http://addons.heroku.com/releases" title="Heroku Releases Addon"&gt;releases&lt;/a&gt; addon can really save the day. While the releases addon is still in beta, it is&amp;nbsp;indespensable to any serious project. Using the releases addon, I simply ran the command: &lt;strong&gt;heroku rollback i&lt;/strong&gt;n the terminal, and everything was fine. How awesome is that?&lt;/p&gt;
&lt;p&gt;The releases addon gives you an extremely useful &lt;strong&gt;rollback&lt;/strong&gt; command to use, that instantly swaps your deployed Heroku code with the most recent deployed copy. This is a lifesaver. Without the releases application, you have only a few choices available to you should a disaster occur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Revert all of your previous commits in your local Git repository, then push your changes to Heroku. This works--but takes a while to do, and can be error prone (do you know what the most recent deployed Git commit was on Heroku vs. your local repo?).&lt;/li&gt;
&lt;li&gt;Slowly go through your most recent commits, looking to find the problem area. Once you've found the problematic code--update it, then re-push to Heroku. Again, this is time consuming and error prone.&lt;/li&gt;
&lt;li&gt;Freak out, and run away.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three of those options suck. The releases addon is a developer safety net, and a good one. Instead of wasting time worrying about stuff, just &lt;strong&gt;rollback&lt;/strong&gt; your Heroku application, and casually debug your application looking for the problems.&lt;/p&gt;
&lt;p&gt;In addition to the awesomeness of the simple &lt;strong&gt;rollback&lt;/strong&gt; command, the advanced releases addon (&lt;strong&gt;heroku addons:add releases:advanced&lt;/strong&gt;) gives you even more power: the ability to instantly deploy any revision of code previously deployed to Heroku.&lt;/p&gt;
&lt;p&gt;Let's say you deploy several times before realizing your application is broken, and there is already an army of angry users with pitchforks heading to your cheeto-covered dungeon.&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Cheeto" height="377" src="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-06/cvwlAzCheqcquiCaskhmjbhHFhenjmBkmEdfgrcxrzyaDIhrmfbItptlAbed/cheeto.png.scaled696.png" width="255" /&gt;
&lt;/div&gt;
The last thing you want to do is throw on your chainmail, grab your longsword, and fight them off. Let's face reality here: you'd much rather be watching &lt;a href="http://www.imdb.com/title/tt0487831/" title="The IT Crowd"&gt;The IT Crowd&lt;/a&gt;&amp;nbsp;and guzzling mountain dew. So instead of going to war, you decide to simply roll back to the last working release.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But wait!&lt;/strong&gt; Your rollback command isn't working! You forgot that the last working release was several deployments ago. Damn.&lt;/p&gt;
&lt;p&gt;Luckily, you remember that since you're using the releases addon, you can simply run &lt;strong&gt;heroku releases&lt;/strong&gt;, and view a list of all your previous releases:&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-01-06/qmJBxzHzukcvscrJafzsflyoxxndeDxIErfqwFnmcHsCvgBodBsieGvFfzJG/heroku_releases.png.scaled1000.png"&gt;&lt;img alt="Heroku_releases" height="385" src="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-06/qmJBxzHzukcvscrJafzsflyoxxndeDxIErfqwFnmcHsCvgBodBsieGvFfzJG/heroku_releases.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;/div&gt;
Oh yes, you think. Release v304 was the last working release. Just to confirm, you then run the &lt;strong&gt;heroku releases:info v304&lt;/strong&gt; command, and after taking a look to make sure, you decide that you've found the correct release to rollback to.&lt;/p&gt;
&lt;p&gt;To finish your rollback, you simply run &lt;strong&gt;heroku rollback v304&lt;/strong&gt;, and &lt;span style="font-size: medium;"&gt;BAM&lt;/span&gt;, everything is working again. Now you can spend the rest of the afternoon writing a &lt;a href="http://www.twilio.com/" title="twilio"&gt;twilio&lt;/a&gt; script that sends text messages to each of your users en-route to your cheeto dungeon to destroy you, informing them that the problem has been solved, and asking them to return to their lairs.&lt;/p&gt;
&lt;p&gt;Whenever you're working on production projects, problems will arise. Being a developer is no easy task! Luckily for us, Heroku is on our side.&lt;/p&gt;
&lt;p&gt;If you're interested in using the Heroku releases addon, you should read through the &lt;a href="http://devcenter.heroku.com/articles/releases" title="Heroku Releases Addon Documentation"&gt;official documentation&lt;/a&gt;, it's really great.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/how-to-instantly-fix-problematic-deployments"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/how-to-instantly-fix-problematic-deployments#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/Vn_uaUZ0Gmc" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="400" width="400" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-06/EaECemrmctGEzAAsbBtgAhAlqqEifinaGwfrwHdAHibvfhfABmjBdGugxdIo/broke_production.jpg">
        <media:thumbnail height="400" width="400" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-06/EaECemrmctGEzAAsbBtgAhAlqqEifinaGwfrwHdAHibvfhfABmjBdGugxdIo/broke_production.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/png" height="377" width="255" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-01-06/cvwlAzCheqcquiCaskhmjbhHFhenjmBkmEdfgrcxrzyaDIhrmfbItptlAbed/cheeto.png">
        <media:thumbnail height="377" width="255" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-06/cvwlAzCheqcquiCaskhmjbhHFhenjmBkmEdfgrcxrzyaDIhrmfbItptlAbed/cheeto.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="500" width="904" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2012-01-06/qmJBxzHzukcvscrJafzsflyoxxndeDxIErfqwFnmcHsCvgBodBsieGvFfzJG/heroku_releases.png">
        <media:thumbnail height="277" width="500" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-01-06/qmJBxzHzukcvscrJafzsflyoxxndeDxIErfqwFnmcHsCvgBodBsieGvFfzJG/heroku_releases.png.scaled500.png" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/how-to-instantly-fix-problematic-deployments</feedburner:origLink></item>
    <item>
      <pubDate>Tue, 03 Jan 2012 18:39:00 -0800</pubDate>
      <title>New Habit - 100 Carbs</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/tPcbsu8SNb0/new-habit-100-carbs</link>
      <guid isPermaLink="false">http://rdegges.com/new-habit-100-carbs</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Since finishing my &lt;a href="http://rdegges.com/writing-habit-complete" title="Writing Habit Complete"&gt;writing habit&lt;/a&gt;, I decided to kick off the new year with a health related habit.&lt;/p&gt;
&lt;p&gt;Over the past year or so, I've been making gradual changes to my diet and exercise regimen, with the intention of losing weight, getting healthier, and getting smarter. There's a lot of evidence that suggests having a fit body also leads to having a fit mind, and that is what originally enticed me to give the whole fitness thing a shot.&lt;/p&gt;
&lt;p&gt;When I first started dieting / exercising, I had no clue what I was doing. No clue whatsoever. I thought eating meat was bad for you and fat content in food was directly correlated to waist size. How wrong I was!&lt;/p&gt;
&lt;p&gt;After several months of eating nothing but vegetabls and breads, running till I couldn't breathe, and struggling for every pound of weight lost, I began to actually research the whole process. I started reading numerous books on health, which foods are good for you, which foods are bad for you, etc.--eventually discovering the &lt;a href="http://en.wikipedia.org/wiki/Ketogenic_diet" title="Ketogenic Diet"&gt;ketogenic diet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A keto diet is essentially a high protein, high fat, and low carb diet. Without going into all the details, a keto diet restricts carb intake because consuming carbs increases the amount of insulin in your bloodstream. When your insulin level is high, your body stores fat. When your insulin level is low, you body doesn't.&lt;/p&gt;
&lt;p&gt;During the three months that I maintained a strict keto diet, I lost nearly 40 lbs, and reached my lowest weight since the start of university in 2006. It felt great.&lt;/p&gt;
&lt;p&gt;Then I started getting busy. I gained some of the weight back, and gradually let my exercise regimen slip out of control.&lt;/p&gt;
&lt;p&gt;So starting today, I'm working my way back to where I was, to finish this thing the way I started--a success. The new habit I'm attempting to build is simple: &lt;strong&gt;eat less than 100 carbs per day&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I'd eventually like to cut my daily carb intake down to around 30 carbs and completely eliminate all sugar intake (sugar is bad for you), but I figure that to start, 100 carbs should be fine. Since I haven't been in hard-core dieting mode a for a while, 100 carbs is enough to make it not so difficult, while still being a challenge.&lt;/p&gt;
&lt;p&gt;These habits are meant to last forever, after all, so I'm in no rush. I'll start with 100 carbs now, and then possibly jump down to 75, 50, and eventually 30, depending on how successful I am along the way.&lt;/p&gt;
&lt;p&gt;Reflecting back on why I think I failed to maintain my diet / exercise regiment earlier last year--I think the primary reason was that I jumped into things too headstrong. I have always been a perfectionist by nature, and when I decide to do things, I typically dive in all the way. While this mentality has served me well in numerous circumstances, it has also backfired more times than I care to mention here.&lt;/p&gt;
&lt;p&gt;When I eventually started to slip off my diet months ago, instead of simply getting back into the groove after a cheat day, and treating my diet as a habit (and thus, a lifestyle change), I instead ended up feeling angry with myself for messing up, and gradually drawing out the problem instead of fixing it.&lt;/p&gt;
&lt;p&gt;Since I dove into it so headstrong before, when I did mess up, I was extremely upset with myself, and had a really hard time continuing. This time, to remedy that possibility, I'm going to be taking things a bit slower, and building sustainable changes that will (with discipline) last a lifetime.&lt;/p&gt;
&lt;p&gt;If you'd like to learn more about ketogenic diets, here are some good resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href="http://www.reddit.com/r/keto" title="Keto Reddit"&gt;keto subreddit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dietdoctor.com/lchf" title="A doctor's guide to ketosis."&gt;A doctor's guide to ketosis&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://lowcarbplate.com/tlcm/" title="Something Awful Keto Guide"&gt;Something Awful Keto Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://www.bodybuilding.com/fun/keto.htm" title="Bodybuilding + Ketosis"&gt;bodybuilding.com guide to ketosis&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;My personal favorite, &lt;a href="http://forum.bodybuilding.com/showthread.php?t=132598293" title="A Guide to Ketosis"&gt;A Guide to Ketosis&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;p&gt;On a side note, if you're currently working on building a health related habit, I'd love to hear about it. I'm extremely interested in health related habits and personal development.&lt;/p&gt;
&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/new-habit-100-carbs"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/new-habit-100-carbs#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/tPcbsu8SNb0" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://rdegges.com/new-habit-100-carbs</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 02 Jan 2012 21:39:00 -0800</pubDate>
      <title>Writing Habit -- Complete</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/dMjGB42euDA/writing-habit-complete</link>
      <guid isPermaLink="false">http://rdegges.com/writing-habit-complete</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Scroll" height="420" src="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-02/mlshfogsBFkfrImdwcHHmxdiArwhezimyfktCjflevtCHrDFxhienGGJFFud/scroll.jpg.scaled696.jpg" width="296" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Two days ago I successfully completed establishing my &lt;a href="http://rdegges.com/establishing-a-writing-habit" title="Establishing a Writing Habit"&gt;writing habit&lt;/a&gt;. It took me exactly 21 days to build (I didn't mess up at all)! My habit was to write for at least 30 minutes per day.&lt;/p&gt;
&lt;p&gt;When I wrote about what I'd &lt;a href="http://rdegges.com/what-ive-learned-about-writing-so-far" title="What I've Learned About Writing (So Far)"&gt;learned&lt;/a&gt; at the half-way point, nearly two weeks ago--I think I was on the right track. The largest impact my daily writing habit has had on me has been mental. Instead of viewing writing as something challenging, it has become something enjoyable and relaxing for me. Over the past few weeks I've drastically changed the way I feel about writing.&lt;/p&gt;
&lt;p&gt;It feels good.&lt;/p&gt;
&lt;p&gt;Will I continue to maintain this habit in the long term? &lt;strong&gt;Yes.&lt;/strong&gt; So far I've written 7 blog articles, and a number of private journal entries that I've been quite proud of. Whenever I write, I tend to learn a lot of new things about whatever subject I'm writing about. Furthermore, and quite possibly most important, writing helps me clarify my thoughts in ways that talking and reading cannot.&lt;/p&gt;
&lt;p&gt;There's something special about writing words, stringing them into sentences, and then shifting those sentences around to construct arguments and ideas that is completely magical. Like I explained in a previous post about writing--it makes me feel like an inventor. While writing I feel like I'm Leonardo da Vinci, obsessively writing away by candlelight in a workshop long after everyone else is asleep. Only writing gives me that magical feeling.&lt;/p&gt;
&lt;p&gt;Since I've recently finished building the habit, below are some tips you may (or may not) find useful if you too are considering developing a writing habit.&lt;/p&gt;
&lt;p&gt;First of all--try to find (early on) a good time for writing in your day. My days are typically chaotic, as my wife's work schedule changes from day-to-day, and depending on the situation at my work I may be busy in either morning, noon, or night. I found that for me, I tend to be in the &lt;em&gt;writing mood&lt;/em&gt; most at night time, when things are quiet and I know that I'm no longer needed for any other activities by friends, family, or work. Having a good time each day you can set aside to write may mean the difference between successfully building your writing habit, or failing.&lt;/p&gt;
&lt;p&gt;Take caffine before writing. Seriously. I've mentioned before that I'm a &lt;a href="http://rdegges.com/my-use-and-abuse-of-caffine" title="My Use and Abuse of Caffeine"&gt;caffeine junkie&lt;/a&gt;. While I'm not particularly proud of my addiction, I've found that caffine makes a world of difference in my writing. It helps me focus, and more importantly, makes me a lot more creative. Several times over the past few weeks I wrote in an uncaffeinated state, and during those times I seemed to mope along &lt;em&gt;at best&lt;/em&gt;, accomplishing very little. I've found that while under the influence of caffeine I'm a lot more thoughtful, creative, and successful with my writing.&lt;/p&gt;
&lt;p&gt;Don't restrict yourself to a single topic or genre. Before I started working on building this writing habit, I briefly considered wording it in a way that would restrict me to a particular type of writing (eg: writing a journal for 30 minutes each day, or something to that effect). I'm glad I didn't. What I realized is that some days I'm in the mood to write a private journal, while some days I'd much rather be working on a technical post, or even ranting about random things. I think that giving yourself the freedom to write whatever you want, so long as you write something, can be a great motivator and really help push you through the days where you just don't think you can do it.&lt;/p&gt;
&lt;p&gt;Hopefully my experiences have been useful and/or entertaining to you. If there's anything you'd like to know, or if you have any questions--feel free to leave a comment.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/writing-habit-complete"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/writing-habit-complete#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/dMjGB42euDA" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="420" width="296" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-01-02/mlshfogsBFkfrImdwcHHmxdiArwhezimyfktCjflevtCHrDFxhienGGJFFud/scroll.jpg">
        <media:thumbnail height="420" width="296" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-01-02/mlshfogsBFkfrImdwcHHmxdiArwhezimyfktCjflevtCHrDFxhienGGJFFud/scroll.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/writing-habit-complete</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 02 Jan 2012 21:23:00 -0800</pubDate>
      <title>What I'm Doing in 2012</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/1aHhUhO4HqM/what-im-doing-in-2012</link>
      <guid isPermaLink="false">http://rdegges.com/what-im-doing-in-2012</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Courage-wolf-796" height="576" src="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-02/yDyqDfjymivFHwAlazafkquyGHtJvzGoHuBzGttHEBgAcydBewwGwcoHIEgB/courage-wolf-796.jpg.scaled696.jpg" width="576" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I'm really glad the new year is here. For the longest time I thought new year's resolutions were a bit silly, and I never participated in them. The past few years, however, I've completely changed my opinion. Maybe I'm getting older, but the thought of starting a new year makes me feel happy and optimistic about things to come. &lt;strong&gt;A clean slate!&lt;/strong&gt; Let's do this!&lt;/p&gt;
&lt;p&gt;Last year I focused on accomplishing goals. I wanted to visit San Francisco, Santa Barbara, and a slew of other things. Some of my goals were specific enough that I accomplished them, while some were way too vague and didn't materialize.&lt;/p&gt;
&lt;p&gt;This year is going to be all about habits for me. Instead of focusing on doing specific things, I'm going to be focusing on building habits into my daily routine. Over the past year I've come to really appreciate habit building. Instead of focusing on the outcome (eg: your goals), you focus on the process.&lt;/p&gt;
&lt;p&gt;I've found that building habits is my personal niche. It makes me feel productive, while keeping me relaxed. When I'm working on building habits I'm not constantly stressed about results, or burdered with the possibility of failure--instead, I just feel relaxed, confident, and happy. What makes this work for me is that while building habits I simply tell myself "Randall, just write for 30 mintues a day. If you can do that everyday, you'll become a better writer in no time. Don't worry about writing X amount of blog posts per week, or exercising X amount of minutes each day--just have fun with it, and make the most of each day."&lt;/p&gt;
&lt;p&gt;Currently I'm using &lt;a href="http://habitforge.com/" title="HabitForge"&gt;HabitForge&lt;/a&gt; to track my habits. I've been using them for just about a year now, with great success. The way HabitForge works is you tell them what habit you want to build, and each day they email you (for 21 days in a row), asking if you did your habit (yes or no). Once you complete your habit 21 days in a row, HabitForge considers your habit "done", by which time you should be so used to performing your habit day after day, that it is second nature. If you fail to complete your habit any day during the 21 day entry period, your cycle resets to day 1, and you have to complete another 21 days of your habit in a row.&lt;/p&gt;
&lt;p&gt;What I like about the HabitForge system is that it works for me. It works really well. I find that once I start working on developing a habit, I don't want that 21-day counter to reset, so I try really hard to make sure I do my habit each day. After trying really hard for 15 days or so, it becomes much easier to do. For me, I just sort of do them on autopilot after that point.&lt;/p&gt;
&lt;p&gt;Just yesterday I finished establishing my &lt;a href="http://rdegges.com/establishing-a-writing-habit" title="Establishing a Writing Habit"&gt;writing habit&lt;/a&gt;. It was a great success. Since I started, I've written for at least 30 minutes every day. This has made a big impact on me already. I feel much more confident in my writing, and I'm enjoying the process of writing much more than before. If I continue on this path, by January 1st, 2013 I'll have written for at least 182.5 hours. That's a lot!&lt;/p&gt;
&lt;p&gt;Another thing I've come to thoroughly enjoy about building habits is that they don't let you fool yourself into achieving false goals. For instance, if I say I want to lose 30lbs--I could easily lose 30lbs by running everyday, eating a very low amount of calories, and generally pushing myself to lose the weight quickly; all for the sake of reaching my goal.&lt;/p&gt;
&lt;p&gt;What if, instead of saying "I want to lose X lbs", I say "I want to eat only animal meats and vegetables"? If that were the case, I'd be building a healthy habit while losing weight as a side-effect; focusing more on the lifestyle change than the outcome.&lt;/p&gt;
&lt;p&gt;With all that said, here are a few of the habits I've got in mind for this year. These are subject to change, but I plan on writing posts here on my blog detailing each habit I build through the year.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spend at least 30 minutes per day working on open source code.&lt;/li&gt;
&lt;li&gt;Spend at least one hour per day reading.&lt;/li&gt;
&lt;li&gt;Exercise for 30 minutes per day (take a walk, do CrossFit, ride a bike--something).&lt;/li&gt;
&lt;li&gt;Eat less than 30 carbs per day. This is a tricky one to maintain long term, but I've read quite a lot about it the past year (and done it for 3 months in a row), to great success.&lt;/li&gt;
&lt;li&gt;Work on a business project of my own for at least 30 minutes per day.&lt;/li&gt;
&lt;li&gt;Tidy up my apartment for 15 minutes per day.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also other habits I'd like to build for the long term. Stuff like going on dates with my wife a certain amount of times per month, reviewing my personal and professional progress every month, etc. Certain things like that are easily overlooked as time passes, but are things that I'd like to ensure I do so that I can make necessary adjustments to myself when necessary.&lt;/p&gt;
&lt;p&gt;Other than the above, in more general terms, there are a lot of other things I'd like to do this year.&lt;/p&gt;
&lt;p&gt;Over the past year I got a lot better at programming Python and Django, and this year I intend to break out of the intermediate level and enter the expert level. It's very hard for me to gauge my progress in this area as it is entirely subjective, and the field of programming itself contains limitless information that is impossible for any one person to learn. To combat this, I plan to continue building software using these technologies, learning new techniques, and tools as I go.&lt;/p&gt;
&lt;p&gt;Another thing I'd like to do this year is slowly improve my text editing skills with vim. While I've been using vim for a long time, I still consider myself a beginner. After watching people like &lt;a href="https://www.destroyallsoftware.com/" title="Gary Bernhardt"&gt;Gary Bernhardt&lt;/a&gt; use vim, not only do I feel like a complete n00b, but I'm also intensely driven to become better. My initial plan for tackling my vim deamons is to watch through every single episode of &lt;a href="http://vimcasts.org/" title="vimcasts"&gt;vimcasts&lt;/a&gt;. Since it's hard to remember the vim shortcuts right away, I'd like to watch an episode once a week, and specifically practice the video topic that week to commit the topic to memory.&lt;/p&gt;
&lt;p&gt;I'd also like to write a book this year. I started working on a book, Learn Asterisk the Fun Way, earlier last year--but haven't made nearly as much progress as I would have liked. This year I'd like to really commit to the project, and see it through to completion. Publishing a book has always been a dream of mine, and something that would make me really proud of myself.&lt;/p&gt;
&lt;p&gt;Here's to a having a great, happy, relaxed, and interesting 2012.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/what-im-doing-in-2012"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/what-im-doing-in-2012#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/1aHhUhO4HqM" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="576" width="576" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-01-02/yDyqDfjymivFHwAlazafkquyGHtJvzGoHuBzGttHEBgAcydBewwGwcoHIEgB/courage-wolf-796.jpg">
        <media:thumbnail height="500" width="500" url="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2012-01-02/yDyqDfjymivFHwAlazafkquyGHtJvzGoHuBzGttHEBgAcydBewwGwcoHIEgB/courage-wolf-796.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/what-im-doing-in-2012</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 30 Dec 2011 17:43:00 -0800</pubDate>
      <title>DevOps Django - Part 4 - Choosing Heroku</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/E-DBmm0FH3o/devops-django-part-4-choosing-heroku</link>
      <guid isPermaLink="false">http://rdegges.com/devops-django-part-4-choosing-heroku</guid>
      <description>&lt;p&gt;
	&lt;div style="margin: 8px;"&gt;
&lt;p&gt;This is the fourth article in a series I'm writing titled DevOps Django. If you're new, you may want to read the&amp;nbsp;&lt;a href="http://rdegges.com/devops-django-part-1-goals" title="DevOps Django - Part 1 - Goals"&gt;first part&lt;/a&gt;&amp;nbsp;of the series before this one.&amp;nbsp;In this article I'll be continuing where I left off in the&amp;nbsp;&lt;a href="http://rdegges.com/devops-django-part-3-the-heroku-way" title="DevOps Django - Part 3 - The Heroku Way"&gt;previous article&lt;/a&gt;: explaining why I chose to move my company's teleconferencing service from Rackspace to Heroku.&lt;/p&gt;
&lt;p&gt;Making the decision to move my company's infrastructure from Rackspace to Heroku was no easy task. As I'm sure you all know--moving infrastructure components is an enormous risk, even in the best of circumstances. However, despite the immense risk involved, a change was needed.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;span style="font-size: xx-large;"&gt;Time&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned earlier in this series, I work for a tech startup. With a small team of people, you don't have much time to mess around. Our greatest expense as a company is engineering time. Our company's revenue is directly correlated to our productivity. The more bugs we fix, features we deliver, and users we make happy--the more money we make.&lt;/p&gt;
&lt;p&gt;Even though we were using the best devops tools available (puppet, nagios, etc.), we were spending almost all of our engineering time building and maintaining our infrastructure. For me, this meant a typical day ended up looking something like the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;85% of my time spent writing or updating puppet modules to fix (or add) required functionality to our infrastructure.&lt;/li&gt;
&lt;li&gt;10% of my time spent planning tasks, adding bugs to the tracker, updating the TODO list.&lt;/li&gt;
&lt;li&gt;5% of my time doing actual development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regardless of the fact that I enjoy writing puppet modules and building a large, scalable infrastructure--it is disheartening to spend an entire month working extremely hard, building awesome backend tools, only to have nothing to show your users for your hard work. While I'm&amp;nbsp;&lt;em&gt;extremely&lt;/em&gt;&amp;nbsp;happy and grateful to have learned so much about deploying robust services, a change was necessary.&lt;/p&gt;
&lt;p&gt;When I sat down and calculated what a typical workday would look like for me if we moved to Heroku, I immediately knew we needed to make the switch, regardless of the risk. Based on my time estimates, a typical day for me (after moving all our infrastructure to Heroku) would look something like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10% of time planning tasks, working on TODO items, etc.&lt;/li&gt;
&lt;li&gt;90% of time hacking on our company projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;That is a drastic change.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Going from 5% to 90% of available hacking time per day?&amp;nbsp;&lt;strong&gt;I'll take it!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There's nothing I love more than writing code (exluding my wife and dog). Building infrastructure tools is fun and all, but in comparison to building new libraries and features? No comparison.&lt;/p&gt;
&lt;p&gt;With the ridiculous amount of time Heroku would save each day, my company would be able to ship insane amounts of code. When I discussed this with&amp;nbsp;&lt;a href="http://www.chrisbrunner.com/" title="Chris Brunner"&gt;my boss&lt;/a&gt;, the decision seemed clear: use Heroku.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;span style="font-size: xx-large;"&gt;Price&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After calculating the manpower time Heroku would save, the next thing I wanted to calculate was the price. Exactly how much will it cost us to move to Heroku?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I received a lot of price related questions when I published the&amp;nbsp;&lt;a href="http://rdegges.com/devops-django-part-3-the-heroku-way" title="DevOps Django - Part 3 - The Heroku Way"&gt;last installment&lt;/a&gt;&amp;nbsp;of this series. A lot of people emailed me saying that they'd love to use Heroku, but after looking at their prices, decided to stick with AWS or Rackspace. Hopefully this information clears up any misconceptions.&lt;/p&gt;
&lt;p&gt;To start, I'd like to take a moment to explain Heroku's overall pricing scheme. Understanding how Heroku bills will probably answer a lot of questions.&lt;/p&gt;
&lt;p&gt;Heroku's core service is a&amp;nbsp;&lt;a href="http://devcenter.heroku.com/articles/dynos" title="Heroku Dyno Documentation"&gt;dyno&lt;/a&gt;.&amp;nbsp;A dyno is essentially a long running program that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses up to 512M of RAM (and can burst up to 1.5G if you don't mind swap).&lt;/li&gt;
&lt;li&gt;Shares CPU with other dynos on the system.&lt;/li&gt;
&lt;li&gt;Can scale horizontally as much as necessary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For each application you have on Heroku, you get 1 free dyno per month. If you just want to run a small website, you can do it completely free of charge. For each additonal dyno you run, Heroku charges 35$ per month (5 cents per hour, at the time of writing).&lt;/p&gt;
&lt;p&gt;Based on Heroku's simple pricing rules, you can easily gauge how much running your application will cost. What's nice about Heroku's billing is that, like AWS (which Heroku is built on top of), you pay only for your usage (per hour). This allows you to instantly scale up (and down) your dynos based on traffic. If you get a lot of hits every Friday night, you can spin up a few extra dynos to handle the load, then remove them Saturday morning, only spending a few dollars in the process.&lt;/p&gt;
&lt;p&gt;In regards to Heroku's database pricing, here's what you need to know: every application you create can use a free shared&amp;nbsp;&lt;a href="http://devcenter.heroku.com/articles/database" title="Heroku PostgreSQL Docs"&gt;PostgreSQL database&lt;/a&gt;. The free database you get allows you store&amp;nbsp;&lt;strong&gt;as much data as you want&lt;/strong&gt;. The catch? The free database only provides 5M of RAM for your data. That means queries will be slow; however--for a majority of sites, a shared database will suffice. What's great about the shared database is that, like their paid counterparts, Heroku manages it for you. That means no data loss, full access to your backups, etc.&lt;/p&gt;
&lt;p&gt;Heroku's dedicated databases are much more robust than their free counterparts. In terms of pricing, their cost goes up based on the amount of allowed connections, RAM, and CPU units. Currently, the cheapest dedicated database plan costs 200$ per month, allows 16 concurrent connections, has 1.7G of RAM, and 1 CPU unit.&lt;/p&gt;
&lt;p&gt;What's nice about the dedicated database plans (and what justifies their price, in my opinion), is that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You get direct&amp;nbsp;&lt;a href="http://www.postgresql.org/docs/8.1/static/app-psql.html" title="psql"&gt;psql&lt;/a&gt;&amp;nbsp;access.&lt;/li&gt;
&lt;li&gt;They run PostgreSQL 9 (instead of 8.3).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can instantly create read slaves, and duplicate masters (for staging, testing, etc.).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You are billed by the hour (just like dynos).&lt;/li&gt;
&lt;li&gt;They are fully managed (you'll never lose data, or have to worry about downtime).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you take into account what you get for those database prices, you'll see that you're getting an insanely good deal. My favorite feature is Heroku's concept of forking and following.&lt;/p&gt;
&lt;p&gt;Let's say you have a single paid database (with the name ``&lt;strong&gt;HEROKU_POSTGRESQL_GREEN&lt;/strong&gt;``), and you want to create a read slave. Heroku allows you to "&lt;em&gt;follow&lt;/em&gt;" your existing database (``&lt;strong&gt;HEROKU_POSTGRESQL_GREEN&lt;/strong&gt;``), and in doing so, automatically provisions your new database as a read slave. For instance, to provision a new read slave in the scenario I just described, I could simply run ``&lt;strong&gt;heroku addons:add heroku-postgresql:ronin --follow HEROKU_POSTGRESQL_GREEN&lt;/strong&gt;``, and I'd have a new read slave up and running in a short period of time.&lt;/p&gt;
&lt;p&gt;Similarly to Heroku's "&lt;em&gt;follow&lt;/em&gt;" feature is "&lt;em&gt;fork&lt;/em&gt;". Forking a database gives you a new database with a snapshot of your existing database's data. It won't stay up-to-date with changes (aka: become a read slave). This is useful for creating staging environments with real production data in them, testing schema changes, etc.&lt;/p&gt;
&lt;p&gt;Given the amount of work it takes to create new read slaves and databases by hand (or using tools like puppet and chef), Heroku's method is infinitely simpler, and more graceful. Furthermore, in my experience, the process is very fast. When I've provisioned read slaves for my applications, they only take as long to finish building as the amount of data needed to copy over to them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OK, let's talk about addons.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Heroku's addons are... well... perfect. All the addons I use in production:&amp;nbsp;&lt;a href="http://addons.heroku.com/memcache" title="Heroku Memcached Addon"&gt;memcached&lt;/a&gt;,&amp;nbsp;&lt;a href="http://addons.heroku.com/newrelic" title="Heroku NewRelic Addon"&gt;NewRelic&lt;/a&gt;(this particular addon is so amazing that I'm dedicating an entire section of this series to it),&lt;a href="http://addons.heroku.com/redistogo" title="Heroku Redis Addon"&gt;Redis&lt;/a&gt;, and&amp;nbsp;&lt;a href="http://addons.heroku.com/rabbitmq" title="RabbitMQ"&gt;RabbitMQ&lt;/a&gt;&amp;nbsp;are all excellent.&lt;/p&gt;
&lt;p&gt;The addons are all very farily priced (in my opinion), and have free tiers that allow you to use them at no cost with small amounts of data. Just as with Heroku's free tier, a majority of the addons' free tiers are sufficient to use for small websites without paying a dime. This lets you bootstrap your projects from the start, and pay for them as they grow.&lt;/p&gt;
&lt;p&gt;As with Heroku's dynos, all the addons I've used provision instantly. In addition to fast provisioning--all addons can also be resized; you can downgrade or upgrade them at any time using the Heroku command line tool. This makes scaling your infrastructure components a one liner.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;span style="font-size: xx-large;"&gt;Hidden Cost&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One thing that played an important role in our decision was the hidden cost of running our infrastructure ourselves.&lt;/p&gt;
&lt;p&gt;When you're simply looking at basic price comparisons between services (in our case, Rackspace vs. Heroku), it's easy to miscalculate cost. In our case, we looked at the cost of Rackspace instances vs. the cost of Heroku dynos.&lt;/p&gt;
&lt;p&gt;Since Heroku dynos give you 512M of RAM to work with, I based my initial price comparison on this factor. A single Heroku dyno costs 35$ per month, and a 512M Rackspace server costs 21.90$ per month. According to this simplistic analysis--Heroku looks approximately 1.5x's as expensive.&lt;/p&gt;
&lt;p&gt;The hidden costs show themselves in three primary areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Infrastructure management cost.&lt;/li&gt;
&lt;li&gt;Scaling cost.&lt;/li&gt;
&lt;li&gt;Bandwidth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;Infrastructure Management Cost&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Quite possibly the largest hidden cost for us was infrastructure management.&lt;/p&gt;
&lt;p&gt;The most obvious manifestation of infrastructure management cost in our company was engineering time. As I stated above, it was not uncommon for me to spend 85% of my time (per day!) writing infrastructure related code. That's an enormous investment.&lt;/p&gt;
&lt;p&gt;The second hidden infrastructure cost is related to building reliable services. Since my company primarily builds teleconferencing systems, high availability is a requirement. It is simply unacceptable for us to have even small periods of downtime, since we're dealing with real-time conversations.&lt;/p&gt;
&lt;p&gt;What this meant in our case was that we needed to have multiple copies of everything. One web server? No good. One MySQL master server? No good. One load balancer? No good. One RabbitMQ server? No good. I'm sure you can see where this is going.&lt;/p&gt;
&lt;p&gt;Having multiple backup servers ready to handle outages adds considerable expense to any infrastructure. For us, it meant we paid nearly twice as much as necessary to host our servers so that we could reliably recover from failures.&lt;/p&gt;
&lt;p&gt;In addition to the extra server cost per month, there is also a high overhead for time required to not only build working backup and failover programs for each piece of our infrastructure, but also to build (and test) the recovery software itself, to ensure that when we do fail over, it actually works.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;Scaling Cost&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;While not nearly as devious infrastructure management cost--scaling cost is also infrequently mentioned.&lt;/p&gt;
&lt;p&gt;In the teleconferencing business, it is normal to get large amounts of traffic during certain hours of the day. Since our business is fairly easy to predict, dynamically resizing our infrastructure based on actual need can save a lot of money.&lt;/p&gt;
&lt;p&gt;Unfortunately, in order to dynamically resize your infrastructure, you need to spend an enormous amount of time building tools that can do this. In my case, I spent many hours over a period of almost a year writing&amp;nbsp;&lt;a href="http://docs.fabfile.org/en/1.3.3/index.html" title="python fabric"&gt;fabric&lt;/a&gt;&amp;nbsp;scripts that could bootstrap new nodes (new webservers, rabbitmq servers, etc.) using the&amp;nbsp;&lt;a href="http://libcloud.apache.org/" title="apache libcloud"&gt;apache-libcloud&lt;/a&gt;&amp;nbsp;library. While both fabric and apache-libcloud make writing these sorts of scripts easier, it is still a large task to do it right.&lt;/p&gt;
&lt;p&gt;Even after writing scripts that make dynamically creating and removing servers simple--there is still a time factor involved in the actual process. For instance--booting a Rackspace server can take anywhere from 60 seconds to 5 minutes. In addition to that, once the server has been booted, the scripts I wrote would install the required base software along with puppet (to handle the node configuration). Once puppet is installed, it would take another large block of time (up to 30 minutes for some applications) to fully finish provisioning the server for usage. That's a long time.&lt;/p&gt;
&lt;p&gt;Having a 35+ minute delay when you need to scale your infrastructure? Unacceptable.&lt;/p&gt;
&lt;p&gt;One of Heroku's greatest strengths is their incredibly simple scaling procedures. You can instantly add and remove dynos with a single command. Furthermore, their scaling seems to be instant. There is no waiting to provision new servers, install puppet, etc.--it just works.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;Bandwidth&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Depending on what sort of applications you run, bandwidth pricing may be a concern for you. In my case, we don't use much bandwidth, so it was never a considerable cost--but I thought I'd mention this anyhow.&lt;/p&gt;
&lt;p&gt;The way Heroku handles bandwidth pricing is that each application you have is allowed 2TB of bandwidth per month, included in your cost. Any more than that, and I'm assuming they'll charge you extra (although I could not find information on this anywhere on their site).&lt;/p&gt;
&lt;p&gt;In comparison to Heroku, Rackspace charges for bandwidth in a per-gigabyte fashion. According to the &lt;a href="http://www.rackspace.com/cloud/cloud_hosting_products/servers/pricing/" title="Rackspace Pricing Calculator"&gt;Rackspace pricing calculator&lt;/a&gt; I used on their site, 2TB of bandwidth on Rackspace can cost you an additional&amp;nbsp;$368.64 per month. That's a lot in comparison to the 0$ you'd pay for the same amount of bandwidth using Heroku.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;span style="font-size: xx-large;"&gt;Summary&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After analyzing the costs (both obvious and hidden) of both keeping our setup the way it was, or switching to Heroku; we decided overwhelmingly to move to Heroku.&lt;/p&gt;
&lt;p&gt;In terms of usefulness, simplicity, elegance, and cost--there is absolutely no comparison. For my company, using Heroku was clearly the best choice to make.&lt;/p&gt;
&lt;p&gt;Since switching to Heroku, my company has saved lots of money on server costs, and even more money in engineering time. Since the switch, we've completed more features, bug fixes, and have overall accomplishd more than at any other point in the year. The effect has been tremendous.&lt;/p&gt;
&lt;p&gt;In the next part of this series, I'll be discussing how I actually moved my company's infrastructure from Rackspace to Heroku. I'll get into the technical details, and explain the entire setup from start to finish.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/devops-django-part-4-choosing-heroku"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/devops-django-part-4-choosing-heroku#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/E-DBmm0FH3o" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://rdegges.com/devops-django-part-4-choosing-heroku</feedburner:origLink></item>
    <item>
      <pubDate>Sun, 25 Dec 2011 00:08:00 -0800</pubDate>
      <title>My "Done" List</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/VEIwAJzEjDU/my-done-list</link>
      <guid isPermaLink="false">http://rdegges.com/my-done-list</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Code_wolf" height="400" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2011-12-25/IcjriGsywmJrtlAhhzDtpbjEayqlfJimwyfAntJGucprgEfEvwhAkiEEyrnp/code_wolf.jpg.scaled696.jpg" width="400" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I really enjoy thinking and writing about programming. Since I started writing code years ago, I've been obsessed with code quality and best practices--and I think it's safe to say that a lot of hackers out there feel the same.&lt;/p&gt;
&lt;p&gt;I'm pretty sure my urge to write excellent code is driven by some innate desire to perfect everything; regardless, I stopped trying to fight it long ago, and started embracing it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: what I'm about to discuss is stupidly obvious. I actually feel quite stupid writing this; however, since this has made such a large impact on my code quality and programming mentality, I figured I would share it despite my shame.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Have a "Done" List&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One of the greatest productivity tricks I've learned has been this: &lt;strong&gt;always have a "done" list&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A "done" list is checklist that you use as a personal binding contract. Having a "done" list means making a commitment to yourself that each time you touch a piece of code, you don't consider it "done" until you've completely gone through your checklist.&lt;/p&gt;
&lt;p&gt;For instance, my "done" list is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Purpose of what I'm doing is logged in some form of tracking system (&lt;a href="https://github.com/" title="GitHub"&gt;GitHub&lt;/a&gt; Issues, &lt;a href="http://sprint.ly/" title="sprintly"&gt;sprintly&lt;/a&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Tests are written.&lt;/li&gt;
&lt;li&gt;Code implemented.&lt;/li&gt;
&lt;li&gt;Tests pass.&lt;/li&gt;
&lt;li&gt;Code review.&lt;/li&gt;
&lt;li&gt;Documentation written.&lt;/li&gt;
&lt;li&gt;Deployed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If that means it takes a while longer to code, then so be it. A "done" list is a simple way to hold yourself to a high devleopment standard, and consistently write quality code.&lt;/p&gt;
&lt;p&gt;I've found that even when I'm not able to consistently go through my "done" list every time I touch code--through the process of trying to meet each of my "done" requirements, I write much better code than I would otherwise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do you have a "done" list? If so, what's on it?&lt;/strong&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/my-done-list"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/my-done-list#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/VEIwAJzEjDU" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="400" width="400" url="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2011-12-25/IcjriGsywmJrtlAhhzDtpbjEayqlfJimwyfAntJGucprgEfEvwhAkiEEyrnp/code_wolf.jpg">
        <media:thumbnail height="400" width="400" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2011-12-25/IcjriGsywmJrtlAhhzDtpbjEayqlfJimwyfAntJGucprgEfEvwhAkiEEyrnp/code_wolf.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/my-done-list</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 19 Dec 2011 22:23:00 -0800</pubDate>
      <title>What I've Learned About Writing (So Far)</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/LYlLd-2d8rA/what-ive-learned-about-writing-so-far</link>
      <guid isPermaLink="false">http://rdegges.com/what-ive-learned-about-writing-so-far</guid>
      <description>&lt;p&gt;
	&lt;p&gt;As I mentioned a few days ago, I've been working on establishing a &lt;a href="http://rdegges.com/establishing-a-writing-habit" title="Establishing a Writing Habit"&gt;writing habit&lt;/a&gt; in my daily life. Today marks the 10th continual day, since starting, that I've been writing for at least 30 minutes a day.&lt;/p&gt;
&lt;p&gt;I figured now would be a good time to reflect on what I've learned so far. Above all else, what I've learned so far is that&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Practice Works&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I've read numerous books on skill building, including one of my all time favorites, &lt;a href="http://www.amazon.com/gp/product/1591842247/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=projectb14ck-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1591842247" title="Talent is Overrated (amazon)"&gt;Talent is Overrated&lt;/a&gt;&amp;nbsp;(affiliate link). The book discusses how people who are excellent at what they do become excellent. The secret is: disciplined practice. Top performers (in all fields) set aside time each day to practice what they are bad at, and struggle through exercises.&lt;/p&gt;
&lt;p&gt;Focused practice over longs periods of time builds skill. There are no shortcuts.&lt;/p&gt;
&lt;p&gt;While I've always enjoyed writing casually, this has been the first time in my life that I've actually set aside time each day to sit down and write for a specific timeframe.&lt;/p&gt;
&lt;p&gt;Although it has only been 10 days so far, I've noticed that my continued practice is already making a difference. So far the difference doesn't seem to be in my writing itself, but in my attitude towards writing.&lt;/p&gt;
&lt;p&gt;I've noticed that I've been able to write with a much higher level of joy in the past few days than at any previous time in my life. Maybe this is just an emotional side effect of the continuous success I've had in sticking to my schedule for the past 10 days--but I have been enjoying writing a lot more than normal.&lt;/p&gt;
&lt;p&gt;Furthermore, I've become a lot less rigid with my writing. As a perfectionist, I've always had problems expressing my thoughts on paper. When I would attempt to write, I'd spend long periods of time working out each sentence in my head perfectly before writing it down. This behavior tended to eat up a lot of momentum.&lt;/p&gt;
&lt;p&gt;Since I've started writing daily, I've been able to simply type what I'm thinking, gradually refining it. This feels great. It feels like the shackles that have held me back from expressing my thoughts are beginning to loosen.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Goals&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I don't have any specific goals in regards to my writing at the moment. At least for a while, I'd like to simply continue writing for 30 minutes each day, and gradually become better at expressing my thoughts in a clear, concise, and structured way.&lt;/p&gt;
&lt;p&gt;I'm hoping that as I practice writing more and more, it will become more natural for me, and I'll be able to experience a greater feeling of relief and happiness while writing.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/what-ive-learned-about-writing-so-far"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/what-ive-learned-about-writing-so-far#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/LYlLd-2d8rA" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://rdegges.com/what-ive-learned-about-writing-so-far</feedburner:origLink></item>
    <item>
      <pubDate>Sun, 18 Dec 2011 16:15:00 -0800</pubDate>
      <title>DevOps Django - Part 3 - The Heroku Way</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/8zSpaiu16pQ/devops-django-part-3-the-heroku-way</link>
      <guid isPermaLink="false">http://rdegges.com/devops-django-part-3-the-heroku-way</guid>
      <description>&lt;p&gt;
	&lt;div style="margin: 8px;"&gt;
&lt;div&gt;This article is part of a series I'm writing called DevOps Django, which explains how to best deploy modern Django sites. If you're new, you should probably read the&amp;nbsp;&lt;a href="http://rdegges.com/devops-django-part-1-goals" title="DevOps Django - Part 1 - Goals"&gt;first article&lt;/a&gt;&amp;nbsp;of the series before this one.&lt;/div&gt;
&lt;p /&gt;
&lt;div&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Most_interesting_man_on_heroku" height="501" src="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2011-12-18/CGHGEnvAyxulJAxlFdhJgDiFtsutyfFcjrkydIJICzdDvidkfpBxHaktfjlo/most_interesting_man_on_heroku.jpg.scaled696.jpg" width="400" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p /&gt;
&lt;div&gt;&lt;span style="font-size: xx-large;"&gt;My Search for Solutions&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;In the&amp;nbsp;&lt;a href="http://rdegges.com/devops-django-part-2-the-pain-of-deployment" title="DevOps Django - Part 2 - The Pain of Deployment"&gt;previous installment&lt;/a&gt;&amp;nbsp;of this series, I discussed (in depth) the problems with deploying Django as a devops guy. After struggling with deployment for ~2 years, and finding very little relief in modern devops tools (puppet, monit, nagios, etc.), I started looking for new solutions.&lt;/p&gt;
&lt;p&gt;Several months ago I was reading&amp;nbsp;&lt;a href="http://news.ycombinator.com/" title="Hacker News"&gt;Hacker News&lt;/a&gt;&amp;nbsp;and noticed that&amp;nbsp;&lt;a href="http://www.heroku.com/" title="Heroku"&gt;Heroku&lt;/a&gt;&amp;nbsp;had recently added Python support to their platform-as-a-service stack. If you're not familiar with Heroku, they're a very popular ployglot hosting platform. They've been around since 2007 providing Ruby hosting, but over the past year they've added support for multiple languages, and seem to be kicking ass and growing like mad.&lt;/p&gt;
&lt;p&gt;I've continuously heard their name mentioned by other programmers, but this was the first I'd heard of them having any Python support, so I bookmarked their&amp;nbsp;&lt;a href="http://devcenter.heroku.com/articles/django" title="Heroku Django Tutorial"&gt;Django tutorial&lt;/a&gt;&amp;nbsp;and told myself I'd give it a spin sometime.&lt;/p&gt;
&lt;p&gt;Coincidentally, a few weeks later I was asked to give an impromptu lightning talk during a&lt;a href="http://pyladies.com/" title="Python Ladies"&gt;pyladies&lt;/a&gt;&amp;nbsp;hack-a-thon, so I decided to give Heroku a spin, and do my lightning talk on that. In a weird twist of fate, the few hours I spent learning Heroku turned out to be some of the best invested hours of my life.&lt;/p&gt;
&lt;p&gt;During the hack-a-thon I built and deployed a simple Django site (with celery support) in just under an hour. If I were to build the same site and attempt to deploy it on EC2, I'd have easily spent a week getting things deployed using puppet, monit, nagios, etc.&lt;/p&gt;
&lt;p&gt;After the hack-a-thon ended, I decided to play around with Heroku a bit more, and see what the platform really had to offer other than what I used during my short sprint.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;A Second Look&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Later that week, I had a few hours to kill, so I revisited Heroku's website, and read through all their&amp;nbsp;&lt;a href="http://devcenter.heroku.com/" title="Heroku DevCenter"&gt;help resources&lt;/a&gt;&amp;nbsp;and tutorials. I also took an in-depth look at their&amp;nbsp;&lt;a href="http://addons.heroku.com/" title="Heroku Addons"&gt;addons&lt;/a&gt;, trying to decide what their services could be used for: personal projets, business ideas, work projects?&lt;/p&gt;
&lt;p&gt;The first thing I was blown away to discover is that Heroku has an enormous amount of addons. They literally have addons for almost any piece of infrastructure you could ever want:&lt;a href="http://addons.heroku.com/heroku-postgresql" title="Heroku PostgreSQL Addon"&gt;PostgreSQL&lt;/a&gt;,&amp;nbsp;&lt;a href="http://addons.heroku.com/redistogo" title="Redis"&gt;Redis&lt;/a&gt;,&amp;nbsp;&lt;a href="http://addons.heroku.com/scheduler" title="Heroku Scheduler Addon"&gt;cron&lt;/a&gt;,&amp;nbsp;&lt;a href="http://addons.heroku.com/memcache" title="Heroku Memcached Addon"&gt;memcached&lt;/a&gt;,&amp;nbsp;&lt;a href="http://addons.heroku.com/rabbitmq" title="Heroku RabbitMQ Addon"&gt;RabbitMQ&lt;/a&gt;,&amp;nbsp;&lt;a href="http://addons.heroku.com/websolr" title="Heroku Solr Addon"&gt;Solr&lt;/a&gt;, etc. Upon seeing this, I started to get excited.&lt;/p&gt;
&lt;p&gt;Second, I took the opportunity to play around with their extremely easy to install and use&amp;nbsp;&lt;a href="http://devcenter.heroku.com/categories/command-line" title="Heroku CLI Tool"&gt;CLI tool&lt;/a&gt;, and was blown away again. Heroku's CLI tool gives you complete control over your Heroku applications. You're able to create new Heroku applications out of Git repositories, instantly provision addons for your application (PostgreSQL, Redis, etc.), view streaming logfiles, instantly scale up (and down) your nodes, etc. Furthermore, you're able to run shell commands locally using their CLI tool. Need to access the Django shell? No problem, you can simply execute ``&lt;strong&gt;heroku run python manage.py shell&lt;/strong&gt;`` from your terminal.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;By this point, I was really itching to use Heroku for something serious.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While I was able to build and deploy a simple Django site on Heroku in under an hour during the hack-a-thon, I knew that I needed to port a much larger, more complex site over to Heroku to really see if it could meet my professional needs.&lt;/p&gt;
&lt;p&gt;So, I checked out a fresh copy of the teleconferencing service that I develop at work, and got to it.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;How I Ported My Work Application to Heroku&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you'd like to see details about what technologies the teleconferencing service uses, check out the&amp;nbsp;&lt;a href="http://rdegges.com/devops-django-part-2-the-pain-of-deployment" title="DevOps Django - Part 2 - The Pain of Deployment"&gt;previous part&lt;/a&gt;&amp;nbsp;of this series. As the teleconferencing service is large, complex, and infrastructure heavy--I figured that if I could port it to Heroku then I'd be able to use Heroku for almost anything.&lt;/p&gt;
&lt;p&gt;The first thing I did was create a new Heroku application using their CLI tool: ``&lt;strong&gt;heroku create --stack cedar&lt;/strong&gt;``, then deploy my application to Heroku using Git: ``&lt;strong&gt;git push heroku master&lt;/strong&gt;``.&lt;/p&gt;
&lt;p&gt;Secondly, I installed a few addons so I could use my required infrastructure components (RabbitMQ, memcached, PostgreSQL, and cron):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;``&lt;strong&gt;heroku addons:add rabbitmq&lt;/strong&gt;``&lt;/li&gt;
&lt;li&gt;``&lt;strong&gt;heroku addons:add memcache&lt;/strong&gt;``&lt;/li&gt;
&lt;li&gt;``&lt;strong&gt;heroku addons:add shared-database&lt;/strong&gt;``&lt;/li&gt;
&lt;li&gt;``&lt;strong&gt;heroku addons:add scheduler&lt;/strong&gt;``&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: By leaving off the size of the addons at the end, you install the cheapest (smallest) plan for each service. By adding these addons just as I've shown above, it adds 0$ per month to your bill.&lt;/p&gt;
&lt;p&gt;Next, I modified my production settings file (``&lt;strong&gt;project/settings/prod.py&lt;/strong&gt;``, in my case), to work with Heroku's hosted RabbitMQ, memcached, and PostgreSQL services. In the end, my settings file looked something like this:&lt;/p&gt;
&lt;p&gt;&lt;div class="data type-python"&gt;
      &lt;table class="lines" cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            &lt;pre class="line_numbers"&gt;&lt;span rel="#L1" id="L1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="L2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="L3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="L4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="L5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="L6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="L7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="L8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="L9"&gt;9&lt;/span&gt;
&lt;span rel="#L10" id="L10"&gt;10&lt;/span&gt;
&lt;span rel="#L11" id="L11"&gt;11&lt;/span&gt;
&lt;span rel="#L12" id="L12"&gt;12&lt;/span&gt;
&lt;span rel="#L13" id="L13"&gt;13&lt;/span&gt;
&lt;span rel="#L14" id="L14"&gt;14&lt;/span&gt;
&lt;span rel="#L15" id="L15"&gt;15&lt;/span&gt;
&lt;span rel="#L16" id="L16"&gt;16&lt;/span&gt;
&lt;span rel="#L17" id="L17"&gt;17&lt;/span&gt;
&lt;span rel="#L18" id="L18"&gt;18&lt;/span&gt;
&lt;span rel="#L19" id="L19"&gt;19&lt;/span&gt;
&lt;span rel="#L20" id="L20"&gt;20&lt;/span&gt;
&lt;span rel="#L21" id="L21"&gt;21&lt;/span&gt;
&lt;span rel="#L22" id="L22"&gt;22&lt;/span&gt;
&lt;span rel="#L23" id="L23"&gt;23&lt;/span&gt;
&lt;span rel="#L24" id="L24"&gt;24&lt;/span&gt;
&lt;span rel="#L25" id="L25"&gt;25&lt;/span&gt;
&lt;span rel="#L26" id="L26"&gt;26&lt;/span&gt;
&lt;span rel="#L27" id="L27"&gt;27&lt;/span&gt;
&lt;span rel="#L28" id="L28"&gt;28&lt;/span&gt;
&lt;span rel="#L29" id="L29"&gt;29&lt;/span&gt;
&lt;span rel="#L30" id="L30"&gt;30&lt;/span&gt;
&lt;span rel="#L31" id="L31"&gt;31&lt;/span&gt;
&lt;span rel="#L32" id="L32"&gt;32&lt;/span&gt;
&lt;span rel="#L33" id="L33"&gt;33&lt;/span&gt;
&lt;span rel="#L34" id="L34"&gt;34&lt;/span&gt;
&lt;span rel="#L35" id="L35"&gt;35&lt;/span&gt;
&lt;span rel="#L36" id="L36"&gt;36&lt;/span&gt;
&lt;span rel="#L37" id="L37"&gt;37&lt;/span&gt;
&lt;span rel="#L38" id="L38"&gt;38&lt;/span&gt;
&lt;span rel="#L39" id="L39"&gt;39&lt;/span&gt;
&lt;span rel="#L40" id="L40"&gt;40&lt;/span&gt;
&lt;span rel="#L41" id="L41"&gt;41&lt;/span&gt;
&lt;span rel="#L42" id="L42"&gt;42&lt;/span&gt;
&lt;span rel="#L43" id="L43"&gt;43&lt;/span&gt;
&lt;span rel="#L44" id="L44"&gt;44&lt;/span&gt;
&lt;span rel="#L45" id="L45"&gt;45&lt;/span&gt;
&lt;span rel="#L46" id="L46"&gt;46&lt;/span&gt;
&lt;span rel="#L47" id="L47"&gt;47&lt;/span&gt;
&lt;span rel="#L48" id="L48"&gt;48&lt;/span&gt;
&lt;span rel="#L49" id="L49"&gt;49&lt;/span&gt;
&lt;span rel="#L50" id="L50"&gt;50&lt;/span&gt;
&lt;span rel="#L51" id="L51"&gt;51&lt;/span&gt;
&lt;span rel="#L52" id="L52"&gt;52&lt;/span&gt;
&lt;span rel="#L53" id="L53"&gt;53&lt;/span&gt;
&lt;span rel="#L54" id="L54"&gt;54&lt;/span&gt;
&lt;span rel="#L55" id="L55"&gt;55&lt;/span&gt;
&lt;span rel="#L56" id="L56"&gt;56&lt;/span&gt;
&lt;span rel="#L57" id="L57"&gt;57&lt;/span&gt;
&lt;span rel="#L58" id="L58"&gt;58&lt;/span&gt;
&lt;span rel="#L59" id="L59"&gt;59&lt;/span&gt;
&lt;span rel="#L60" id="L60"&gt;60&lt;/span&gt;
&lt;span rel="#L61" id="L61"&gt;61&lt;/span&gt;
&lt;span rel="#L62" id="L62"&gt;62&lt;/span&gt;
&lt;span rel="#L63" id="L63"&gt;63&lt;/span&gt;
&lt;span rel="#L64" id="L64"&gt;64&lt;/span&gt;
&lt;span rel="#L65" id="L65"&gt;65&lt;/span&gt;
&lt;span rel="#L66" id="L66"&gt;66&lt;/span&gt;
&lt;span rel="#L67" id="L67"&gt;67&lt;/span&gt;
&lt;span rel="#L68" id="L68"&gt;68&lt;/span&gt;
&lt;span rel="#L69" id="L69"&gt;69&lt;/span&gt;
&lt;span rel="#L70" id="L70"&gt;70&lt;/span&gt;
&lt;span rel="#L71" id="L71"&gt;71&lt;/span&gt;
&lt;span rel="#L72" id="L72"&gt;72&lt;/span&gt;
&lt;span rel="#L73" id="L73"&gt;73&lt;/span&gt;
&lt;span rel="#L74" id="L74"&gt;74&lt;/span&gt;
&lt;span rel="#L75" id="L75"&gt;75&lt;/span&gt;
&lt;span rel="#L76" id="L76"&gt;76&lt;/span&gt;
&lt;span rel="#L77" id="L77"&gt;77&lt;/span&gt;
&lt;span rel="#L78" id="L78"&gt;78&lt;/span&gt;
&lt;span rel="#L79" id="L79"&gt;79&lt;/span&gt;
&lt;span rel="#L80" id="L80"&gt;80&lt;/span&gt;
&lt;span rel="#L81" id="L81"&gt;81&lt;/span&gt;
&lt;span rel="#L82" id="L82"&gt;82&lt;/span&gt;
&lt;span rel="#L83" id="L83"&gt;83&lt;/span&gt;
&lt;span rel="#L84" id="L84"&gt;84&lt;/span&gt;
&lt;span rel="#L85" id="L85"&gt;85&lt;/span&gt;
&lt;span rel="#L86" id="L86"&gt;86&lt;/span&gt;
&lt;span rel="#L87" id="L87"&gt;87&lt;/span&gt;
&lt;span rel="#L88" id="L88"&gt;88&lt;/span&gt;
&lt;span rel="#L89" id="L89"&gt;89&lt;/span&gt;
&lt;span rel="#L90" id="L90"&gt;90&lt;/span&gt;
&lt;span rel="#L91" id="L91"&gt;91&lt;/span&gt;
&lt;span rel="#L92" id="L92"&gt;92&lt;/span&gt;
&lt;span rel="#L93" id="L93"&gt;93&lt;/span&gt;
&lt;span rel="#L94" id="L94"&gt;94&lt;/span&gt;
&lt;span rel="#L95" id="L95"&gt;95&lt;/span&gt;
&lt;span rel="#L96" id="L96"&gt;96&lt;/span&gt;
&lt;span rel="#L97" id="L97"&gt;97&lt;/span&gt;
&lt;span rel="#L98" id="L98"&gt;98&lt;/span&gt;
&lt;span rel="#L99" id="L99"&gt;99&lt;/span&gt;
&lt;span rel="#L100" id="L100"&gt;100&lt;/span&gt;
&lt;span rel="#L101" id="L101"&gt;101&lt;/span&gt;
&lt;span rel="#L102" id="L102"&gt;102&lt;/span&gt;
&lt;span rel="#L103" id="L103"&gt;103&lt;/span&gt;
&lt;span rel="#L104" id="L104"&gt;104&lt;/span&gt;
&lt;span rel="#L105" id="L105"&gt;105&lt;/span&gt;
&lt;span rel="#L106" id="L106"&gt;106&lt;/span&gt;
&lt;span rel="#L107" id="L107"&gt;107&lt;/span&gt;
&lt;span rel="#L108" id="L108"&gt;108&lt;/span&gt;
&lt;span rel="#L109" id="L109"&gt;109&lt;/span&gt;
&lt;span rel="#L110" id="L110"&gt;110&lt;/span&gt;
&lt;span rel="#L111" id="L111"&gt;111&lt;/span&gt;
&lt;span rel="#L112" id="L112"&gt;112&lt;/span&gt;
&lt;span rel="#L113" id="L113"&gt;113&lt;/span&gt;
&lt;span rel="#L114" id="L114"&gt;114&lt;/span&gt;
&lt;span rel="#L115" id="L115"&gt;115&lt;/span&gt;
&lt;span rel="#L116" id="L116"&gt;116&lt;/span&gt;
&lt;span rel="#L117" id="L117"&gt;117&lt;/span&gt;
&lt;span rel="#L118" id="L118"&gt;118&lt;/span&gt;
&lt;span rel="#L119" id="L119"&gt;119&lt;/span&gt;
&lt;span rel="#L120" id="L120"&gt;120&lt;/span&gt;
&lt;span rel="#L121" id="L121"&gt;121&lt;/span&gt;
&lt;span rel="#L122" id="L122"&gt;122&lt;/span&gt;
&lt;span rel="#L123" id="L123"&gt;123&lt;/span&gt;
&lt;span rel="#L124" id="L124"&gt;124&lt;/span&gt;
&lt;span rel="#L125" id="L125"&gt;125&lt;/span&gt;
&lt;span rel="#L126" id="L126"&gt;126&lt;/span&gt;
&lt;span rel="#L127" id="L127"&gt;127&lt;/span&gt;
&lt;span rel="#L128" id="L128"&gt;128&lt;/span&gt;
&lt;span rel="#L129" id="L129"&gt;129&lt;/span&gt;
&lt;span rel="#L130" id="L130"&gt;130&lt;/span&gt;
&lt;span rel="#L131" id="L131"&gt;131&lt;/span&gt;
&lt;span rel="#L132" id="L132"&gt;132&lt;/span&gt;
&lt;span rel="#L133" id="L133"&gt;133&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
                &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Production settings and globals.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;environ&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urlparse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlparse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uses_netloc&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;S3&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CallingFormat&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC10"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;common&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC11"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC12"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC13"&gt;&lt;span class="c"&gt;# Helper lambda for gracefully degrading environmental variables:&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC14"&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC15"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC16"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC17"&gt;&lt;span class="c"&gt;########## EMAIL CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC18"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#email-backend&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC19"&gt;&lt;span class="n"&gt;EMAIL_BACKEND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;django.core.mail.backends.smtp.EmailBackend&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC20"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC21"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#email-host&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC22"&gt;&lt;span class="n"&gt;EMAIL_HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;EMAIL_HOST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;smtp.gmail.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC23"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC24"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#email-host-password&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC25"&gt;&lt;span class="n"&gt;EMAIL_HOST_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;EMAIL_HOST_PASSWORD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC26"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC27"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#email-host-user&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC28"&gt;&lt;span class="n"&gt;EMAIL_HOST_USER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;EMAIL_HOST_USER&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your_email@example.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC29"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC30"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#email-port&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC31"&gt;&lt;span class="n"&gt;EMAIL_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;EMAIL_PORT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;587&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC32"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC33"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#email-subject-prefix&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC34"&gt;&lt;span class="n"&gt;EMAIL_SUBJECT_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;[&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;] &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;SITE_NAME&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC35"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC36"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#email-use-tls&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC37"&gt;&lt;span class="n"&gt;EMAIL_USE_TLS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC38"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC39"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#server-email&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC40"&gt;&lt;span class="n"&gt;SERVER_EMAIL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EMAIL_HOST_USER&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC41"&gt;&lt;span class="c"&gt;########## END EMAIL CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC42"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC43"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC44"&gt;&lt;span class="c"&gt;########## DATABASE CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC45"&gt;&lt;span class="c"&gt;# See: http://devcenter.heroku.com/articles/django#postgres_database_config&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC46"&gt;&lt;span class="n"&gt;uses_netloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;postgres&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC47"&gt;&lt;span class="n"&gt;uses_netloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mysql&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC48"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC49"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC50"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DATABASE_URL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC51"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urlparse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;DATABASE_URL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC52"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;DATABASES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC53"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;NAME&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC54"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;USER&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC55"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;PASSWORD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC56"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;HOST&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC57"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;PORT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC58"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC59"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scheme&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;postgres&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC60"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;DATABASES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ENGINE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;django.db.backends.postgresql_psycopg2&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC61"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scheme&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;mysql&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC62"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;DATABASES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ENGINE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;django.db.backends.mysql&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC63"&gt;&lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC64"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Unexpected error:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC65"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC66"&gt;&lt;span class="c"&gt;#DATABASE_ROUTERS = (&amp;#39;settings.routers.MasterSlaveRouter&amp;#39;,)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC67"&gt;&lt;span class="c"&gt;########## END DATABASE CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC68"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC69"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC70"&gt;&lt;span class="c"&gt;########## CACHE CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC71"&gt;&lt;span class="c"&gt;# See: https://docs.djangoproject.com/en/1.3/ref/settings/#caches&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC72"&gt;&lt;span class="n"&gt;CACHES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC73"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC74"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;BACKEND&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;django_pylibmc.memcached.PyLibMCCache&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC75"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;LOCATION&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;localhost:11211&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC76"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;TIMEOUT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC77"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;BINARY&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC78"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;OPTIONS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC79"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;tcp_nodelay&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC80"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;ketama&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC81"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC82"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC83"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC84"&gt;&lt;span class="c"&gt;########## END CACHE CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC85"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC86"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC87"&gt;&lt;span class="c"&gt;########## CELERY CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC88"&gt;&lt;span class="c"&gt;# See: http://docs.celeryproject.org/en/latest/configuration.html#broker-transport&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC89"&gt;&lt;span class="n"&gt;BROKER_TRANSPORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;amqplib&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC90"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC91"&gt;&lt;span class="c"&gt;# See: http://docs.celeryproject.org/en/latest/configuration.html#broker-url&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC92"&gt;&lt;span class="n"&gt;BROKER_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;RABBITMQ_URL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC93"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC94"&gt;&lt;span class="c"&gt;# See: http://docs.celeryproject.org/en/latest/configuration.html#celery-result-backend&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC95"&gt;&lt;span class="n"&gt;CELERY_RESULT_BACKEND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;amqp&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC96"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC97"&gt;&lt;span class="c"&gt;# See: http://docs.celeryproject.org/en/latest/configuration.html#celery-task-result-expires&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC98"&gt;&lt;span class="n"&gt;CELERY_TASK_RESULT_EXPIRES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC99"&gt;&lt;span class="c"&gt;########## END CELERY CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC100"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC101"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC102"&gt;&lt;span class="c"&gt;########## STORAGE CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC103"&gt;&lt;span class="c"&gt;# See: http://django-storages.readthedocs.org/en/latest/index.html&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC104"&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC105"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;storages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC106"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC107"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC108"&gt;&lt;span class="c"&gt;# See: http://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html#settings&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC109"&gt;&lt;span class="n"&gt;DEFAULT_FILE_STORAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;storages.backends.s3boto.S3BotoStorage&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC110"&gt;&lt;span class="n"&gt;STATICFILES_STORAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;storages.backends.s3boto.S3BotoStorage&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC111"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC112"&gt;&lt;span class="n"&gt;AWS_CALLING_FORMAT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CallingFormat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SUBDOMAIN&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC113"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC114"&gt;&lt;span class="n"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AWS_ACCESS_KEY_ID&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC115"&gt;&lt;span class="n"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AWS_SECRET_ACCESS_KEY&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC116"&gt;&lt;span class="n"&gt;AWS_STORAGE_BUCKET_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;AWS_STORAGE_BUCKET_NAME&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC117"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC118"&gt;&lt;span class="n"&gt;STATIC_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;https://s3.amazonaws.com/&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;AWS_STORAGE_BUCKET_NAME&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC119"&gt;&lt;span class="c"&gt;########## END STORAGE CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC120"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC121"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC122"&gt;&lt;span class="c"&gt;########## WEBSERVER CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC123"&gt;&lt;span class="c"&gt;# See: http://gunicorn.org/&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC124"&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC125"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="s"&gt;&amp;#39;gunicorn&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC126"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC127"&gt;&lt;span class="c"&gt;########## END WEBSERVER CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC128"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC129"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line" id="LC130"&gt;&lt;span class="c"&gt;########## SECRET KEY CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC131"&gt;&lt;span class="n"&gt;SECRET_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;SECRET_KEY&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC132"&gt;&lt;span class="c"&gt;########## END SECRET KEY CONFIGURATION&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC133"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;As quick note, everytime you push code to Heroku, they automatically read your top-level ``&lt;strong&gt;requirements.txt&lt;/strong&gt;`` file, and install any packages you've defined. This makes handling site dependencies completely transparent to you (the developer). In order to get my site working on Heroku, the only change I had to make to my requirements file was adding ``&lt;strong&gt;django-pylibmc-sasl&lt;/strong&gt;``, as the Heroku memcached addon requires SASL authentication, which the commonly used ``&lt;strong&gt;python-memcached&lt;/strong&gt;`` library doesn't provide.&lt;/p&gt;
&lt;p&gt;Just for clarity, here's my ``&lt;strong&gt;requirements.txt&lt;/strong&gt;`` file:&lt;/p&gt;
&lt;p&gt;&lt;div class="data type-text"&gt;
      &lt;table class="lines" cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            &lt;pre class="line_numbers"&gt;&lt;span rel="#L1" id="L1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="L2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="L3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="L4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="L5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="L6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="L7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="L8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="L9"&gt;9&lt;/span&gt;
&lt;span rel="#L10" id="L10"&gt;10&lt;/span&gt;
&lt;span rel="#L11" id="L11"&gt;11&lt;/span&gt;
&lt;span rel="#L12" id="L12"&gt;12&lt;/span&gt;
&lt;span rel="#L13" id="L13"&gt;13&lt;/span&gt;
&lt;span rel="#L14" id="L14"&gt;14&lt;/span&gt;
&lt;span rel="#L15" id="L15"&gt;15&lt;/span&gt;
&lt;span rel="#L16" id="L16"&gt;16&lt;/span&gt;
&lt;span rel="#L17" id="L17"&gt;17&lt;/span&gt;
&lt;span rel="#L18" id="L18"&gt;18&lt;/span&gt;
&lt;span rel="#L19" id="L19"&gt;19&lt;/span&gt;
&lt;span rel="#L20" id="L20"&gt;20&lt;/span&gt;
&lt;span rel="#L21" id="L21"&gt;21&lt;/span&gt;
&lt;span rel="#L22" id="L22"&gt;22&lt;/span&gt;
&lt;span rel="#L23" id="L23"&gt;23&lt;/span&gt;
&lt;span rel="#L24" id="L24"&gt;24&lt;/span&gt;
&lt;span rel="#L25" id="L25"&gt;25&lt;/span&gt;
&lt;span rel="#L26" id="L26"&gt;26&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
                &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;Django==1.3.1&lt;/div&gt;&lt;div class="line" id="LC2"&gt;docutils==0.8.1&lt;/div&gt;&lt;div class="line" id="LC3"&gt;psycopg2==2.4.2&lt;/div&gt;&lt;div class="line" id="LC4"&gt;Fabric==1.3.2&lt;/div&gt;&lt;div class="line" id="LC5"&gt;South==0.7.3&lt;/div&gt;&lt;div class="line" id="LC6"&gt;gunicorn==0.13.4&lt;/div&gt;&lt;div class="line" id="LC7"&gt;newrelic==1.0.5.156&lt;/div&gt;&lt;div class="line" id="LC8"&gt;django-celery==2.4.2&lt;/div&gt;&lt;div class="line" id="LC9"&gt;django-kombu==0.9.4&lt;/div&gt;&lt;div class="line" id="LC10"&gt;django-storages==1.1.3&lt;/div&gt;&lt;div class="line" id="LC11"&gt;boto==2.1.1&lt;/div&gt;&lt;div class="line" id="LC12"&gt;pylibmc==1.2.2&lt;/div&gt;&lt;div class="line" id="LC13"&gt;django-pylibmc-sasl==0.2.4&lt;/div&gt;&lt;div class="line" id="LC14"&gt;django-sorting==0.1&lt;/div&gt;&lt;div class="line" id="LC15"&gt;django-guardian==1.0.3&lt;/div&gt;&lt;div class="line" id="LC16"&gt;django-pagination==1.0.7&lt;/div&gt;&lt;div class="line" id="LC17"&gt;pyst2==0.4&lt;/div&gt;&lt;div class="line" id="LC18"&gt;django-annoying==0.7.6&lt;/div&gt;&lt;div class="line" id="LC19"&gt;django-tastypie==0.9.11&lt;/div&gt;&lt;div class="line" id="LC20"&gt;django-coverage==1.2.1&lt;/div&gt;&lt;div class="line" id="LC21"&gt;django-nose==0.1.3&lt;/div&gt;&lt;div class="line" id="LC22"&gt;nosexcover==1.0.7&lt;/div&gt;&lt;div class="line" id="LC23"&gt;django-debug-toolbar==0.8.5&lt;/div&gt;&lt;div class="line" id="LC24"&gt;Sphinx==1.1.2&lt;/div&gt;&lt;div class="line" id="LC25"&gt;django-cache-machine==0.6&lt;/div&gt;&lt;div class="line" id="LC26"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;As you can see in the settings file, Django is simply using environment variables to interact with the various infrastructure components we added earlier. All of Heroku's addons work by exporting one (or more) environment variables that your application can use. This makes using Heroku addons extremely convenient. You can reuse most of your Django settings across all your projets, since you're storing the important stuff in environment variables. No coupling required.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;Additionally, the Heroku CLI tool also allows you to set, edit, and remove your own environment variables. I used this functionality to set my application's ``&lt;strong&gt;SECRET_KEY&lt;/strong&gt;``, along with other arbitrary stuff (like my&amp;nbsp;&lt;a href="http://aws.amazon.com/s3/" title="Amazon S3"&gt;Amazon S3&lt;/a&gt;&amp;nbsp;credentials, etc.). To add these environment variables to my Heroku application, I simply ran: ``&lt;strong&gt;heroku config:add SECRET_KEY=xxx&amp;nbsp;AWS_ACCESS_KEY_ID=xxx ...&lt;/strong&gt;``.&lt;/p&gt;
&lt;p&gt;The next thing I did was define a top-level file, ``&lt;strong&gt;Procfile&lt;/strong&gt;``, which Heroku uses to specify the different types of 'dynos' you'll be running. Essentially, a Procfile just lists a series of executable commands that do stuff. Here's the Procfile I wrote:&lt;/p&gt;
&lt;p&gt;&lt;div class="data type-text"&gt;
      &lt;table class="lines" cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            &lt;pre class="line_numbers"&gt;&lt;span rel="#L1" id="L1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="L2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="L3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="L4"&gt;4&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
                &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;web: python project/manage.py run_gunicorn -b &amp;quot;0.0.0.0:$PORT&amp;quot; -w 3 --log-level info --settings=settings.prod&lt;/div&gt;&lt;div class="line" id="LC2"&gt;scheduler: python project/manage.py celeryd -B -E --settings=settings.prod&lt;/div&gt;&lt;div class="line" id="LC3"&gt;worker: python project/manage.py celeryd -E --settings=settings.prod&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Each line contains a reference name, followed by the command you want to run. In my case, I've got three separate 'dyno' types: a gunicorn instance (this is my actual Django web application), a celerybeat instance (for scheduling periodic tasks), and a celery worker instance (for processing asynchronous tasks).&lt;/p&gt;
&lt;p&gt;The way Heroku runs and manages your application is via these dyno types. For instance, let's say I want to have Heroku run three 'web' instances (this is the equivalent of running three separate web servers), I could run: ``&lt;strong&gt;heroku scale web=3&lt;/strong&gt;`` from the CLI, and Heroku would instantly ensure that three of my 'web' dynos are running--automatically load balancing incoming HTTP requests across the three.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: You can run ``&lt;strong&gt;heroku ps&lt;/strong&gt;`` to see what processes (and how many of each) are running.&lt;/p&gt;
&lt;p&gt;After defining my ``&lt;strong&gt;Procfile&lt;/strong&gt;``, I just ran ``&lt;strong&gt;heroku scale web=1 scheduler=1 worker=1&lt;/strong&gt;``, and Heroku instantly spun up my entire cloud infrastructure.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: x-large;"&gt;&lt;strong&gt;INSANE&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: If you are running celerybeat, be sure to only run it a single time, and no more. If you have multiple celerybeat instances running, you'll have duplicate tasks in your queue. That's why I specifically created two separate celery dyno types, "&lt;em&gt;scheduler&lt;/em&gt;" and "&lt;em&gt;worker&lt;/em&gt;", so that I could safely scale my worker processes using: ``&lt;strong&gt;heroku scale worker=x&lt;/strong&gt;``, while keeping only a single scheduler.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;A Quick Recap&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It took me a total of ~2 hours to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make a large website and API completely Heroku compatible.&lt;/li&gt;
&lt;li&gt;Fully provision a PostgreSQL server.&lt;/li&gt;
&lt;li&gt;Fully provision a memcached server.&lt;/li&gt;
&lt;li&gt;Fully provision a RabbitMQ server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And don't forget--this is the amount of time it took me while still learning about Heroku, and reading through the documentation. I think it is fair to say that if there were more tutorials, articles, and information available, this process could be shortened substantially.&lt;/p&gt;
&lt;p&gt;I'll repeat this again: that is&amp;nbsp;&lt;em&gt;&lt;strong&gt;INSANE&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Compared to the time, effort, and maintenance required to setup my teleconferencing application normally using a standard devops toolset, this was a piece of cake. I didn't have to provision a puppet server, manage a puppet repo, or anything.&lt;/p&gt;
&lt;p&gt;Heroku makes deployment so easy, you don't even need a&amp;nbsp;&lt;a href="http://docs.fabfile.org/en/1.3.3/index.html" title="Python Fabric"&gt;fabfile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;The Heroku Way&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Through the process of learning, using, and eventually moving my company's entire infrastructure over to Heroku, I learned quite a bit about Heroku's ideals.&lt;/p&gt;
&lt;p&gt;In my&amp;nbsp;&lt;a href="http://rdegges.com/deploying-django" title="Deploying Django"&gt;first article&lt;/a&gt;&amp;nbsp;discussing the "&lt;em&gt;deployment problem&lt;/em&gt;" in the Django community, I said that I have a dream for the Django community; a dream that all Django developers can build their websites with peace of mind, knowing a production deployment is no more than 10 minutes away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heroku is quickly making my dream a reality.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The "&lt;em&gt;Heroku Way&lt;/em&gt;", as I refer to it now, consists of a few simple principles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build your Django sites using standard open source tools.&lt;/li&gt;
&lt;li&gt;Use Git to manage your deployment revisions.&lt;/li&gt;
&lt;li&gt;Instantly provision, resize, or remove any infrastructure components you need.&lt;/li&gt;
&lt;li&gt;Keep your private data decoupled from your codebase via environment variables.&lt;/li&gt;
&lt;li&gt;Instantly scale your infrastructure up and down as you please.&lt;/li&gt;
&lt;li&gt;Pay by usage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After having tried numerous deployment methods myself, and after using Heroku, I strongly believe that Heroku's approach to solving the&amp;nbsp;&lt;em&gt;deployment problem&lt;/em&gt;&amp;nbsp;is the right way. As a developer, using Heroku is a big win:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can deploy both small and large sites the same way (and scale them as large as you'd like with no added complexity).&lt;/li&gt;
&lt;li&gt;It's cost effective (Heroku's prices aren't much more expensive than Amazon's, which Heroku is built on top of). I'll go into more depth on this in my next article.&lt;/li&gt;
&lt;li&gt;You aren't locked into anything: the same codebase you use to develop your site locally can be used on Heroku in a matter of minutes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deploying code to Heroku&amp;nbsp;&lt;em&gt;&lt;strong&gt;feels right&lt;/strong&gt;&lt;/em&gt;. As a developer, you shouldn't have to spend 90% of your time writing puppet rules and working with vendor APIs to provision servers. You shouldn't need two weeks to scale your site when you get an influx of users.&lt;/p&gt;
&lt;p&gt;Instead, you should be coding--which is precisely what Heroku is designed to help you do.&lt;/p&gt;
&lt;p&gt;In the next part of this series, I'll be detailing my decision to move from Rackspace to Heroku. Making an infrastructure move is a big decision. In the next article I'll discuss my reasoning with you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: If you read this far--I'd like to ask you a question. Would you be interested in a book about Django deployments? If so, what sort of topics would you expect to be covered?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: I've finished the next part of the series! You can read it &lt;a href="http://rdegges.com/devops-django-part-4-choosing-heroku" title="DevOps Django - Part 4 - Choosing Heroku"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/devops-django-part-3-the-heroku-way"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/devops-django-part-3-the-heroku-way#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/8zSpaiu16pQ" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="501" width="400" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2011-12-18/CGHGEnvAyxulJAxlFdhJgDiFtsutyfFcjrkydIJICzdDvidkfpBxHaktfjlo/most_interesting_man_on_heroku.jpg">
        <media:thumbnail height="501" width="400" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2011-12-18/CGHGEnvAyxulJAxlFdhJgDiFtsutyfFcjrkydIJICzdDvidkfpBxHaktfjlo/most_interesting_man_on_heroku.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/devops-django-part-3-the-heroku-way</feedburner:origLink></item>
    <item>
      <pubDate>Wed, 14 Dec 2011 20:00:00 -0800</pubDate>
      <title>system76 "Bonobo" Ubuntu Laptop Review</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/eB7C9vIAYeI/system76-bonobo-ubuntu-laptop-review</link>
      <guid isPermaLink="false">http://rdegges.com/system76-bonobo-ubuntu-laptop-review</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2011-12-19/BiDbHEAcpDybvztajarlDjigeBApkFEdjqeypIbIGyuDvcbbzcuqIeziriCw/product_images--bonobo-0d56b90b84e3dbb.png.scaled1000.png"&gt;&lt;img alt="Product_images--bonobo-0d56b90b84e3dbb" height="344" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2011-12-19/BiDbHEAcpDybvztajarlDjigeBApkFEdjqeypIbIGyuDvcbbzcuqIeziriCw/product_images--bonobo-0d56b90b84e3dbb.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;a href="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2011-12-19/doeqkyizguFmDkCxqEBeHoofcdxxdBDoqHBhryjngsraipfiuueAnHfJskkz/product_images--bonobo-4f12bc8ecf986ca.png.scaled1000.png"&gt;&lt;img alt="Product_images--bonobo-4f12bc8ecf986ca" height="344" src="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2011-12-19/doeqkyizguFmDkCxqEBeHoofcdxxdBDoqHBhryjngsraipfiuueAnHfJskkz/product_images--bonobo-4f12bc8ecf986ca.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;a href="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2011-12-19/zrJbsyDIdClJiCcGqHJtalEAwfcHEjAFjoIstbtqFlbkmgpImAHeAcArevcp/product_images--bonobo-dd5ad28e128ed55.png.scaled1000.png"&gt;&lt;img alt="Product_images--bonobo-dd5ad28e128ed55" height="344" src="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2011-12-19/zrJbsyDIdClJiCcGqHJtalEAwfcHEjAFjoIstbtqFlbkmgpImAHeAcArevcp/product_images--bonobo-dd5ad28e128ed55.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;a href="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2011-12-19/wbcJolkeouEoJlkwmECjiveudfJAdlFGkedytFumHeouydxldwsemnfJqexd/product_images--bonobo-19fd027e5bc03f0.png.scaled1000.png"&gt;&lt;img alt="Product_images--bonobo-19fd027e5bc03f0" height="344" src="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2011-12-19/wbcJolkeouEoJlkwmECjiveudfJAdlFGkedytFumHeouydxldwsemnfJqexd/product_images--bonobo-19fd027e5bc03f0.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;div class='p_see_full_gallery'&gt;&lt;a href="http://rdegges.com/system76-bonobo-ubuntu-laptop-review"&gt;See the full gallery on Posterous&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;I don't normally write product reviews on my blog (although I do frequently write &lt;a href="http://www.amazon.com/gp/pdp/profile/A3E3Y9R7W5NAI8" title="My Amazon Reviewer Profile"&gt;amazon reviews&lt;/a&gt;), so this is a bit out of place. However, I feel the need to write about the &lt;a href="http://www.system76.com/laptops/model/bonobo" title="system76 Bonobo Laptop"&gt;system76 laptop&lt;/a&gt; I recently purchased.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I'm &lt;em&gt;not&lt;/em&gt; making any money off this. I'm not in any way affiliated with system76. I don't have any affiliate links, or any of that jazz.&lt;/p&gt;
&lt;p&gt;As a programmer (and more importantly, nerd) I spend a majority of my days (and nights) online. As a linux guy, finding a decent laptop that has full hardware compatibility can be a huge pain. Over the past year I've been using a laptop as my primary machine, which has compounded this issue and made it a nightmare for me to find new laptops when an old one dies. Incase you're wondering, I've gone through 4 laptops this past year, and each time spent no less than 4 days finding a suitable replacement.&lt;/p&gt;
&lt;p&gt;The problem with finding a decent linux laptop is that even if you google the exact model you plan on purchasing before hand, there is no guarantee it will work. At least in my experience, googling laptop models before purchase is a lot like playing Russian roulette--you may get lucky, but it's a risk.&lt;/p&gt;
&lt;p&gt;The last time I purchased a laptop earlier this year I spent quite a while online researching the best options, eventually settling with a high end HP that was within my price range. Fast forward two weeks to delivery day--I'm installing Ubuntu on the laptop, and to my dismay, there are no video card drivers available. Damnet.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;system76&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After having several awful linux laptop experiences, I asked some friends to recommend a decent hardware vendor with full linux support. That's when I first heard of &lt;a href="http://www.system76.com/home/" title="system76 Ubuntu Systems"&gt;system76&lt;/a&gt;. They're a hardware vendor that builds and ships Ubuntu ready laptops, destkops, and servers.&lt;/p&gt;
&lt;p&gt;A few weeks back, when my current laptop started dying, I decided to give system76 a try and I ordered their &lt;a href="http://www.system76.com/laptops/model/bonobo" title="system76 Bonobo"&gt;Bonobo&lt;/a&gt; model (their largest laptop). I got the base model with a couple small modifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 120G SSD drive (I like speed).&lt;/li&gt;
&lt;li&gt;8G of RAM.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I decided to go with their largest model (it's a 17.3") because I love looking at lots of code on a single screen. I don't use any external monitors, so having a large screen is important for my day-to-day workflow.&lt;/p&gt;
&lt;p&gt;With the background out of the way, here's my review of the actual laptop.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;First Impressions&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;system76 did a great job on first impressions. You know how most laptops typically come in awful boxes, filled with tons of spam? system76 doesn't do that at all. The shipping box was simple, easy to open, and not cluttered.&lt;/p&gt;
&lt;p&gt;Inside their shipping box there was simply the laptop, the carrying case, and a card with links to the system76 website for help. Elegant.&lt;/p&gt;
&lt;p&gt;My first thoughts upon seeing the actual laptop (once I pulled it out and set it on my table) was: &lt;em&gt;woa&lt;/em&gt;. The laptop is really big and sturdy looking. It's got a metallic casing around it (not plastic), and looks expensive. The lid of the laptop has the system76 logo etched into it, which looks brilliant.&lt;/p&gt;
&lt;p&gt;The screen on this thing is amazing. It's huge, clear, and surprisingly crisp. Maybe I've just been using shitty laptops 'till now, but this thing makes my old Sony Vaio look like a child's toy.&lt;/p&gt;
&lt;p&gt;The keyboard is sturdy with thick, responsive keys. This is a big win for me, as I type fast, and having highly responsive keys just feels &lt;strong&gt;right&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Also: there are no stickers on the laptop. I hate getting a new machine covered in Intel, Windows, and other ridiculous stickers. This gives the laptop a really nice clean look, and it's refreshing to not be bombarded by hardware ads.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Software Support&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After working my way through the first boot process just to see what it was like (it was fine), I popped in my own Ubuntu 11.04 CD and formatted the box. I was curious to see if this laptop was truly linux compatible, or if it was just loaded with a bunch of special drivers to make things work decently.&lt;/p&gt;
&lt;p&gt;Surprisingly, I had absolutly no issues installing Ubuntu. Everything worked perfectly out of the box. Webcam, microphone, video card drivers, etc. It was a pretty great feeling to get everything installed fresh with no issues whatsoever.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Speed&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This thing is fast. Really, insanely fast. I don't have much else to say about this, except that I've never had such a fast system. Ubuntu boots in less than 2 seconds, consistently.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Pricing&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you've ever purchased a laptop online from a major hardware vendor (Dell, HP, etc.), you'll notice that when customizing the laptop components, you've got a million choices. It's typical to be able to choose from at least 20 different CPUs, 30 times of RAM, etc.&lt;/p&gt;
&lt;p&gt;From what I saw, system76 takes a different approach. All their base systems have excellent hardware, and they only offer a few upgrade options. I prefer this a lot more to the traditional model. Why? Because pricing is a lot clearer. Instead of purchasing a laptop that you think will cost 500$, and then upgrading it to make it decent and then realizing that the price is now 3,000$--you know right off the bat what sort of price you're looking at.&lt;/p&gt;
&lt;p&gt;While this laptop was expensive (I paid ~1,800$), its hardware stats are comparable to similarly priced HP laptops.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Problems&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I've only been using this laptop for two weeks so far. If I experience any other problems I'll update this post to include them.&lt;/p&gt;
&lt;p&gt;The power key. The most annoying problem I've had with the laptop to date is the power key. It's hard to press. I can push it down easily enough, but it seems like you have to push it down and hold it for a second for it to actually recognize your keypress. This is pretty annoying as it takes me at least two tries to turn the thing on.&lt;/p&gt;
&lt;p&gt;The caps lock / num lock / wifi icons that light up when they're on are ugly. They look like they're pixelated globe icons from the 1980s. system76--if you read this, consider using something a bit nicer looking. They really detract from the clean, professional look of the laptop.&lt;/p&gt;
&lt;p&gt;Lastly, the power cable for this thing is massive. The laptop doesn't use your standard size power cord, it has a massive black box at least 3x's larger than any laptop cord I've owned before. While I understand this is the largest model of laptop, and it has high end power-hungry hardware, the cord size still matters (at least to me). I haven't carried this laptop anywhere with me yet, but I assume that when I do, my carrying case will be at least a few pounds heavier with the cord inside.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Conclusion&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;system76 makes a damn good laptop, as far as I'm concerned. Despite a few minor flaws, this thing has been excellent. I can honstely say that I've never owned such a great laptop in my life.&lt;/p&gt;
&lt;p&gt;It's fast, sturdy, looks great, and has perfect linux hardware compatibility.&lt;/p&gt;
&lt;p&gt;If you're a linux guy looking for a great laptop, I'd strongly recommend you give system76 a shot for your next purchase.&lt;/p&gt;
&lt;p&gt;You can check out all their systems on their main site:&amp;nbsp;&lt;a href="http://www.system76.com/"&gt;http://www.system76.com/&lt;/a&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/system76-bonobo-ubuntu-laptop-review"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/system76-bonobo-ubuntu-laptop-review#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/eB7C9vIAYeI" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/png" height="420" width="850" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2011-12-19/BiDbHEAcpDybvztajarlDjigeBApkFEdjqeypIbIGyuDvcbbzcuqIeziriCw/product_images--bonobo-0d56b90b84e3dbb.png">
        <media:thumbnail height="247" width="500" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2011-12-19/BiDbHEAcpDybvztajarlDjigeBApkFEdjqeypIbIGyuDvcbbzcuqIeziriCw/product_images--bonobo-0d56b90b84e3dbb.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="420" width="850" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2011-12-19/doeqkyizguFmDkCxqEBeHoofcdxxdBDoqHBhryjngsraipfiuueAnHfJskkz/product_images--bonobo-4f12bc8ecf986ca.png">
        <media:thumbnail height="247" width="500" url="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2011-12-19/doeqkyizguFmDkCxqEBeHoofcdxxdBDoqHBhryjngsraipfiuueAnHfJskkz/product_images--bonobo-4f12bc8ecf986ca.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="420" width="850" url="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2011-12-19/zrJbsyDIdClJiCcGqHJtalEAwfcHEjAFjoIstbtqFlbkmgpImAHeAcArevcp/product_images--bonobo-dd5ad28e128ed55.png">
        <media:thumbnail height="247" width="500" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2011-12-19/zrJbsyDIdClJiCcGqHJtalEAwfcHEjAFjoIstbtqFlbkmgpImAHeAcArevcp/product_images--bonobo-dd5ad28e128ed55.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="420" width="850" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2011-12-19/wbcJolkeouEoJlkwmECjiveudfJAdlFGkedytFumHeouydxldwsemnfJqexd/product_images--bonobo-19fd027e5bc03f0.png">
        <media:thumbnail height="247" width="500" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2011-12-19/wbcJolkeouEoJlkwmECjiveudfJAdlFGkedytFumHeouydxldwsemnfJqexd/product_images--bonobo-19fd027e5bc03f0.png.scaled500.png" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/system76-bonobo-ubuntu-laptop-review</feedburner:origLink></item>
    <item>
      <pubDate>Tue, 13 Dec 2011 18:51:00 -0800</pubDate>
      <title>Establishing a Writing Habit</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/rnC_hTw-plE/establishing-a-writing-habit</link>
      <guid isPermaLink="false">http://rdegges.com/establishing-a-writing-habit</guid>
      <description>&lt;p&gt;
	&lt;p&gt;I'm a big fan of personal growth and development. My thought on the matter is that each of us is only given a little time to live, so we might as well make the most of it. Improving yourself is always a good time investment.&lt;/p&gt;
&lt;p&gt;A few years ago I started building positive habits. I read a few &lt;a href="http://www.shelfluv.com/rdegges" title="My Reading List"&gt;books&lt;/a&gt;, and learned that one of the most effective ways to cultivate yourself is by slowly building positive habits into your daily routine, one at a time. Shortly thereafter I discovered &lt;a href="http://habitforge.com/" title="HabitForge"&gt;HabitForge&lt;/a&gt;, a webapp that helps you build new habits by sending you daily email reminders and tracking your progress.&lt;/p&gt;
&lt;p&gt;Let's say you want to read for 30 minutes every day. According to the research HabitForge has done, if you force yourself to read 30 minutes a day for 21 days in a row, your 30 minutes of reading will have become a natural habit. Of course, your habit won't come &lt;em&gt;completely&lt;/em&gt; naturally (you will still have to put fourth conscious effort to do it each day), but it will be significantly easier for you to maintain day after day.&lt;/p&gt;
&lt;p&gt;The catch is that if you &lt;a href="http://www.writersstore.com/system/0001/4643/don_t-break-the-chain-calendar-year_medium.jpg" title="Jerry Seinfeld Calendar"&gt;break-the-chain&lt;/a&gt;, you have to start your 21 day habit building cycle fresh. This means that if you read for 20 days in a row, but on the 21st day forget--you're our of luck. You'll need to start again from day 1, and work through a full 21 day period before your habit will become second nature.&lt;/p&gt;
&lt;p&gt;The great thing about the 21 day method is that it seems to work (at least it does for me). Last year I built several habits that I've kept since. My only regret is that I didn't continue to add more habits after successfully establishing a few great ones.&lt;/p&gt;
&lt;p&gt;Which brings me to the topic of this article...&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Writing&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I've always enjoyed writing. It appeals to my sentimental side. There's something about writing that just feels great. The best way I can describe the way I feel when writing is:&lt;/p&gt;
&lt;p&gt;Imagine &lt;a href="http://en.wikipedia.org/wiki/Leonardo_da_Vinci" title="Leonardo da Vinci"&gt;Leonardo da Vinci&lt;/a&gt; in his workshop in Italy in the late 1400's. He's been obsessively locked up in there for weeks on end buliding a new prototype. It's late at night, and there are papers scattered across his desk. He's sitting on a wooden stool, hunched over the desk working by candlelight, madly scribbling his discoveries using a &lt;a href="http://images4.wikia.nocookie.net/__cb20061214140705/uncyclopedia/images/0/0c/Feather_Pen_scan.jpg" title="Feather Pen"&gt;feather pen&lt;/a&gt; into an extremely aged looking notebook.&lt;/p&gt;
&lt;p&gt;That's how writing makes me feel.&lt;/p&gt;
&lt;p&gt;Unfortunately, while I have written quite a lot over the past few years--I've come nowhere close producing either the quality or quantity of writing that I'd like to.&lt;/p&gt;
&lt;p&gt;A few days ago I started a new habit on HabitForge, my first one in a few months--dedicated to writing. I'm going to make "writing for 30 minutes" a daily part of my routine. It isn't much, but I'm hoping that 30 minutes of intensely focused writing will help me grow as a writer.&lt;/p&gt;
&lt;p&gt;If you're one of the few people who do actually read what I write on here, you can expect to see more frequently articles in the coming days and weeks.&lt;/p&gt;
&lt;p&gt;If you're looking to build new positive habits into your life, why not make an account at &lt;a href="http://habitforge.com/" title="HabitForge"&gt;HabitForge&lt;/a&gt; (it's totally free) and get started?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: I wrote some reflections on my habit so far, you can read them &lt;a href="http://rdegges.com/what-ive-learned-about-writing-so-far" title="What I've Learned About Writing (So Far)"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: My writing habit is built! I've written for 30 minutes for each of the 21 days without fail. I wrote another post which also includes some tips and thoughts, you can read it &lt;a href="http://rdegges.com/writing-habit-complete" title="Writing Habit - Complete"&gt;here&lt;/a&gt;.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/establishing-a-writing-habit"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/establishing-a-writing-habit#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/rnC_hTw-plE" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://rdegges.com/establishing-a-writing-habit</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 12 Dec 2011 22:30:00 -0800</pubDate>
      <title>DevOps Django - Part 2 - The Pain of Deployment</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/rJL0eAlXM_4/devops-django-part-2-the-pain-of-deployment</link>
      <guid isPermaLink="false">http://rdegges.com/devops-django-part-2-the-pain-of-deployment</guid>
      <description>&lt;p&gt;
	&lt;p&gt;This article is part of a series I'm writing called DevOps Django. This series is meant to explain how to best deploy modern Django sites. If you're new, you should probably read the &lt;a href="http://rdegges.com/devops-django-part-1-goals" title="DevOps Django - Part 1 - Goals"&gt;first article&lt;/a&gt; of the series before this one.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;What I Build&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned in the first article of the series, I work at a tech startup building telephony services. Our primary product is a hosted teleconferencing platform that hundreds of thousands of callers use each month. As all my experience with deployment has (primarily) come from building and maintaining this platform, I'd like to take this opportunity to explain what I actually build.&lt;/p&gt;
&lt;p&gt;Our product is broken up in two primary components: a telephony layer that powers our core teleconferencing service, and a web layer that powers our API backend and user portal. Having two completely separate (and isolated) infrastructures means having to deal with multiple deployment patterns.&lt;/p&gt;
&lt;p&gt;Our telephony infrastructure is built on top of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ubuntu.com/business/server/overview" title="ubuntu-server"&gt;ubuntu-server&lt;/a&gt;, a great Debian based operating system.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.asterisk.org/" title="Asterisk"&gt;Asterisk&lt;/a&gt;, the open source PBX engine.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://opensips.org/" title="OpenSIPS"&gt;OpenSIPS&lt;/a&gt;, the open source SIP router.&lt;/li&gt;
&lt;li&gt;Cisco hardware (for routing physical calls over multiple &lt;a href="http://en.wikipedia.org/wiki/Ds3" title="DS3"&gt;DS3&lt;/a&gt; circuits).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Network_File_System_(protocol)" title="NFS"&gt;NFSd&lt;/a&gt;, for storing large amounts of sound files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The majority of our telephony code is written in Asterisk's custom scripting language (&lt;a href="http://www.voip-info.org/wiki/view/Asterisk+Dialplan+Introduction" title="dialplan"&gt;dialplan&lt;/a&gt;). This language lets us completely control call behavior. With it, we can do things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Play sound files.&lt;/li&gt;
&lt;li&gt;Record sounds.&lt;/li&gt;
&lt;li&gt;Bridge multiple calls together.&lt;/li&gt;
&lt;li&gt;Recognize touch tone input and perform other actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's a small diagram which shows how our physical infrastructure is architectured (excuse my poor diagrams, I'm awful with this stuff):&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Telephonyinfrastructure" height="407" src="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2011-12-10/fjEjvEnGrlzuACAhnxxclhCEzrotvdiInEmeHEHFxoGzGlesvdekagBydfgH/TelephonyInfrastructure.png.scaled696.png" width="587" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The way things work here is that callers (eg: you) dial our phone number on your cell phone (or landline, whatever) and your call travels through the&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Public_switched_telephone_network" title="PSTN"&gt;PSTN&lt;/a&gt;&amp;nbsp;(public telephone network). Your call eventually arrives at our Cisco equipment, which converts the calls from hard line formats into &lt;a href="http://en.wikipedia.org/wiki/Voice_over_IP" title="VoIP"&gt;VoIP&lt;/a&gt;, so that we can easily move the call around our network.&lt;/p&gt;
&lt;p&gt;From there, your call is sent to our load balancer (OpenSIPS), which determines which Asterisk server should handle your call. At this point, your call is then sent to Asterisk, which does whatever needs to be done.&lt;/p&gt;
&lt;p&gt;The NFS server is used to store user generated soundfiles. This way, our Asterisk servers can remain stateless (we can simply plug more Asterisk servers into our network at any time to increase capacity).&lt;/p&gt;
&lt;p&gt;Where things get interesting is our web infrastructure.&amp;nbsp;Our web stack provides lots of functionality to our systems, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The ability to manage conference rooms in real time. This includes stuff like muting callers, banning callers, changing caller nick names for easy identification, etc.&lt;/li&gt;
&lt;li&gt;Centralized logging of all user metrics: which conference rooms they use, how often, what features they use the most.&lt;/li&gt;
&lt;li&gt;Billing integration that allows us to track how many minutes are being used by each conference room.&lt;/li&gt;
&lt;li&gt;Account management for users (and administrators).&lt;/li&gt;
&lt;li&gt;An API that our telephony infrastructure uses to communicate with us.&lt;/li&gt;
&lt;li&gt;Other cool features that I won't get into.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our web stack&amp;nbsp;&lt;em&gt;&lt;strong&gt;WAS&lt;/strong&gt;&lt;/em&gt; built using the following technologies:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I'm choosing to list the old technologies here as this article is focused primarily on my original problems deploying Django. While I've solved a majority of my problems, that will be discussed in a future part of this article series.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://python.org/" title="Python"&gt;Python&lt;/a&gt;, our favorite programming language.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.djangoproject.com/" title="Django"&gt;Django&lt;/a&gt;, our favorite web framework.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rabbitmq.com/" title="RabbitMQ"&gt;RabbitMQ&lt;/a&gt;, a useful queueing system.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://celeryproject.org/" title="Celery"&gt;Celery&lt;/a&gt;, a distributed task queue.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://memcached.org/" title="memcached"&gt;Memcached&lt;/a&gt;, a simple caching server.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://freeradius.org/" title="freeradius"&gt;FreeRADIUS&lt;/a&gt;, an annoying and stupid (but necessary) system for logging call metrics.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mysql.com/" title="MySQL"&gt;MySQL&lt;/a&gt;, an incredibly frustrating database server.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://git-scm.com/" title="Git"&gt;Git&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://github.com/" title="GitHub"&gt;GitHub&lt;/a&gt;, for version control.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And this is a list of our old infrastructure tools (most of these are gone now in our new environment):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://puppetlabs.com/" title="puppet"&gt;Puppet&lt;/a&gt;, a centralized configuration management service. Essentially, it allows you to write scripts that automatically configure your servers in a modular fashion.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mmonit.com/monit/" title="monit"&gt;monit&lt;/a&gt;, application monitoring software we used for automatically fixing critical problems and sending alerts. It lets you do stuff like say "send me an alert if the CPU usage on this box goes above 50%".&lt;/li&gt;
&lt;li&gt;&lt;a href="http://munin-monitoring.org/" title="munin"&gt;munin&lt;/a&gt;, a simple monitoring tool that generates useful graphs (network traffic, CPU usage, etc.).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nagios.org/" title="Nagios"&gt;nagios&lt;/a&gt;, a popular system monitoring tool.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://haproxy.1wt.eu/" title="haproxy"&gt;HAproxy&lt;/a&gt;, the fast HTTP load balancer.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nginx.org/" title="nginx"&gt;nginx&lt;/a&gt;, our web server of choice for buffering HTTP requests locally to our&amp;nbsp;&lt;a href="http://www.wsgi.org/en/latest/index.html" title="WSGI"&gt;WSGI&lt;/a&gt;&amp;nbsp;server.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gunicorn.org/" title="gunicorn"&gt;gunicorn&lt;/a&gt;, a unicorn with a gun. OK, not really... It's actually a pretty awesome pure python WSGI server.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jenkins-ci.org/" title="Jenkins"&gt;Jenkins&lt;/a&gt;, a simple continuous integration server for running tests and deploying code to production.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rackspace.com/" title="Rackspace"&gt;Rackspace&lt;/a&gt;, our server host.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the core technologies that we used to develop our web stack over the past two years (up until a few weeks ago).&lt;/p&gt;
&lt;p&gt;I've taken the liberty of drawing this up in a small diagram (again, excuse my poor diagramming skills):&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;a href="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2011-12-10/CAnsucIByoplsyvxEzbHEbJpdEpmHdGsfIGECwFeFpevcpatczabDGfyfsIt/WebInfrastructure.png.scaled1000.png"&gt;&lt;img alt="Webinfrastructure" height="300" src="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2011-12-10/CAnsucIByoplsyvxEzbHEbJpdEpmHdGsfIGECwFeFpevcpatczabDGfyfsIt/WebInfrastructure.png.scaled696.png" width="696" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;As you can probably imagine, we use Python and Django to build our website and backend API. These are the core technologies that power our web services. RabbitMQ holds our queued tasks, and Celery processes the queued tasks and executes them on worker servers asynchronously. Memcached is used to store data in memory for fast retrieval (stuff like lists of banned callers, etc.) and MySQL was used to store all of our persistent data.&lt;/p&gt;
&lt;p&gt;FreeRADIUS is really in a leage of its own, as we use it exclusively to track call metrics from our physical Cisco devices. Most high end Cisco equpiment supports radius logging, so we have a FreeRADIUS instance running at all times to track our physical call metrics (which calls enter and leave our network before ever talking to our telephony servers), as this data is far more accurate than data that arrives via API calls (due to timing issues across the network).&lt;/p&gt;
&lt;p&gt;In regards to our monitoring software (puppet, etc.) we used quite a mix. The reason being that no one piece covered all our basic requirements. For our services, we wanted to have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alerts when stuff goes down.&lt;/li&gt;
&lt;li&gt;The ability to automatically fix weird issues (restart services that stopped, etc.).&lt;/li&gt;
&lt;li&gt;Graphs to show CPU usage, memory usage, etc., so that (as a devops guy) you can scale your infrastructure as necessary, spot bottlenecks, etc.&lt;/li&gt;
&lt;li&gt;The ability to automatically provision new servers. Manually provisioning servers is:      
&lt;ul&gt;
&lt;li&gt;A waste of time and energy.&lt;/li&gt;
&lt;li&gt;Error prone (what if you forget to do something?).&lt;/li&gt;
&lt;li&gt;Not scalable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The ability to quickly and easily confirm things are working.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A lot of our core functionality comes from the integration between our telephony services (which are colocated at various datacenters around the US), and our centralized cloud platform. Due to the dynamic nature of our architecture, our web platform is extremely important.&amp;nbsp;If our web platform goes down, our users see a majority of their features vanish instantly, as we can't log usage data, perform authentication checks against users, etc.&lt;/p&gt;
&lt;p&gt;With both parts of our stack working together, we're able to give our users a really great experience both through their phone and browser.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Why Deployment was Painful&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As our product focuses on real time user communication, we have a lot of technical challenges. Our service needs to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide fast interaction between our physical telephony infrastructure and cloud infrastructure.&lt;/li&gt;
&lt;li&gt;Provide accurate logging information for billing.&lt;/li&gt;
&lt;li&gt;Maintain high availability for our systems, as even a minute of downtime effects thousands of callers.&lt;/li&gt;
&lt;li&gt;Rapidly push changes to our applications in production with no maintenance windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With our intense availability requirements, I'd say that (up until our recent infrastructure change), I was spending about 90% of my time working on either maintaining our infrastructure and tools, updating components, automating components, or scaling our components.&lt;/p&gt;
&lt;p&gt;Given the fact that we have so many different technologies (a lot of them requiring their own servers and redundancy), complexity couldn't be helped--even using modern tools like puppet, monit, nagios, etc.&lt;/p&gt;
&lt;p&gt;If you're into &lt;em&gt;devops&lt;/em&gt; type stuff, you might be wondering what problems I had given my setup.&amp;nbsp;After all, a majority of the technologies I was using are quite popular in high-tech circles. People look at you funny if you work at a tech company that &lt;strong&gt;&lt;em&gt;doesn't&lt;/em&gt;&lt;/strong&gt; use puppet (or chef) and nagios. These tools have a reputation for making your life easier (as a developer), and &lt;strong&gt;&lt;em&gt;supposedly&lt;/em&gt;&lt;/strong&gt; let you focus more on coding than sysadmin taks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Despite the hype, building out your infrastructure and monitoring tools is hard. Really hard. If you want to do it right.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Firstly, let's talk time. The time required to learn all of the infrastructure technologies we used was immense. As anyone who knows me can attest, I spend a ridiculous amount of time programming. Even with the insane hours I consistently pull hacking code,&amp;nbsp;it took a long time before I was able to build quality puppet modules, monitoring scripts, and deployment tools.&lt;/p&gt;
&lt;p&gt;Once we started heavily using our infrastructure toolset: puppet, nagios, monit, etc., I found that I'd spend&amp;nbsp;&lt;em&gt;&lt;strong&gt;at least&lt;/strong&gt;&lt;/em&gt;&amp;nbsp;90% of my time throughout the workday either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing new monitoring and deployment modules.&lt;/li&gt;
&lt;li&gt;Fixing bugs in old monitoring and deployment modules.&lt;/li&gt;
&lt;li&gt;Dealing with random one-off issues that occur because of slight differences in production environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Since my company is small, and engineering time is our most valuable resource, this was a real killer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Secondly, hosting cost becomes an issue. When you require high availability for your services, you can't run just one of anything. This led to a ton of overhead cost on Rackspace, as we had at least two of everything running constantly. Ouch. Not to mention the time it took to engineer the backups / restoration / monitoring tools so that they would actually be useful in the event that a service died.&lt;/p&gt;
&lt;p&gt;For the longest time I always assumed builiding failproof services would be easy. How wrong I was! Even the simplest of services, take RabbitMQ for instance, requires an immense amount of planning, thought, and maintained focus to build properly. In an environment where you rely on that RabbitMQ server being available 24x7 with as many &lt;a href="http://en.wikipedia.org/wiki/High_availability" title="Five Nines"&gt;nines of availability&lt;/a&gt; as possible, even the simplest of services can become an enormous pain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Engineering failover that works is an art. A time consuming art.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Third, MySQL.&amp;nbsp;&lt;em&gt;&lt;strong&gt;ARG!&lt;/strong&gt;&lt;/em&gt;&amp;nbsp;Ever tried to automate MySQL deployments? I dare you to build a puppet module that can successfully spin up MySQL replication slaves on demand. It is so painful that I'd rather slap myself in the face with a porcupine than attempt that again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I tried endlessly to find (and build) a decent puppet-mysql module. I found numerous semi-maintained ones on GitHub, but never found a single working one. The one I ended up building myself (and using) was so tightly coupled to my specific deployment scenario that I actually still wake up in hot sweats on occasion just from thinking about it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MySQL is annoying to manage in production.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fourth, complexity. Having so many tools deployed just to keep things running is a real pain. Not only is it a time sink, expensive, and hard to maintain--it is complex.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complexity gets you in subtle ways.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For me, complexity manifested itself in coupling issues. With such a large amount of scripts, tools, and services--making a change anywhere in the codebase was likely to break some part of our deployment or monitoring toolset. This was especially annoying, as it diverted a lot of attention that could have been spent better elsewhere.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Painful Lessons&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Since I first started building our teleconferencing service almost two full years ago, I've learned quite a bit about deploying Django. Before completely overhauling our service and porting everything to Django, I was relatively inexperienced with production deployments, having only built small passion projects.&lt;/p&gt;
&lt;p&gt;What I learned through all of my experiences learning (and using) a variety of popular sysadmin and devops type tools is that nothing in the sysadmin (or devops) world is perfect. There are some great tools out there (puppet), but they've got a long way to go before they're simple enough that a single devops guy can build out an entire production infrastructure solo.&lt;/p&gt;
&lt;p&gt;By far the greatest hurdle I encountered over the past two years has been infrastructure. There is a huge time investment gap between building a basic infrastructure (installing nginx, gunicorn, celery, etc., on a single server), and automatically provisioning that same infrastructure (with puppet, etc.). In regards to the difficulty of actualy writing code that can scale across a large infrastructure, the challenges have been much simpler to overcome. In fact, I'm happy to say that using Django has been an excellent choice for us.&lt;/p&gt;
&lt;p&gt;Regardless of the difficulties I've had over the past two years in building out our infrastructure, and &lt;em&gt;&lt;strong&gt;effectively&lt;/strong&gt;&lt;/em&gt; deploying Django--it has been a great learning experience. I've learned more these past two years than at any previous point in my life.&lt;/p&gt;
&lt;p&gt;But for me, what it really comes down to, is...&lt;/p&gt;
&lt;p&gt;I'm a programmer at heart. I like coding and building new things. At the end of the day, it hurts me inside to spend a ton of time working really hard to maintain and scale your infrastructure, and then realize that through all your effort, you've only managed to fight off the chaos for another day. Bummer. I'd rather be hacking on new Django modules, or playing around with the latest async javascript framework.&lt;/p&gt;
&lt;p&gt;But that's just me.&lt;/p&gt;
&lt;p&gt;In the next part of the series, I'll be discussing the first part of the deployment solution I discovered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt;: I finished part 3, you can read it &lt;a href="http://rdegges.com/devops-django-part-3-the-heroku-way" title="DevOps Django - Part 3 - The Heroku Way"&gt;here&lt;/a&gt;.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/devops-django-part-2-the-pain-of-deployment"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/devops-django-part-2-the-pain-of-deployment#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/rJL0eAlXM_4" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/png" height="407" width="587" url="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2011-12-10/fjEjvEnGrlzuACAhnxxclhCEzrotvdiInEmeHEHFxoGzGlesvdekagBydfgH/TelephonyInfrastructure.png">
        <media:thumbnail height="347" width="500" url="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2011-12-10/fjEjvEnGrlzuACAhnxxclhCEzrotvdiInEmeHEHFxoGzGlesvdekagBydfgH/TelephonyInfrastructure.png.scaled500.png" />
      </media:content>
      <media:content type="image/png" height="385" width="893" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2011-12-10/CAnsucIByoplsyvxEzbHEbJpdEpmHdGsfIGECwFeFpevcpatczabDGfyfsIt/WebInfrastructure.png">
        <media:thumbnail height="216" width="500" url="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2011-12-10/CAnsucIByoplsyvxEzbHEbJpdEpmHdGsfIGECwFeFpevcpatczabDGfyfsIt/WebInfrastructure.png.scaled500.png" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/devops-django-part-2-the-pain-of-deployment</feedburner:origLink></item>
    <item>
      <pubDate>Mon, 05 Dec 2011 10:25:00 -0800</pubDate>
      <title>DevOps Django - Part 1 - Goals</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/hDslr3f3q98/devops-django-part-1-goals</link>
      <guid isPermaLink="false">http://rdegges.com/devops-django-part-1-goals</guid>
      <description>&lt;p&gt;
	&lt;div style="margin: 8px;"&gt;
&lt;p&gt;A little over a month ago I published an article (&lt;a href="http://rdegges.com/deploying-django" title="Deploying Django"&gt;Deploying Django&lt;/a&gt;) describing the state of&amp;nbsp;&lt;a href="https://www.djangoproject.com/" title="Django"&gt;Django&lt;/a&gt;&amp;nbsp;deployment. If you don't want to read the backstory, I'll summarize it for you here:&amp;nbsp;&lt;em&gt;&lt;strong&gt;deploying Django is hard&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Surprisingly, my previous article drew quite a bit of attention from the Django community. I was fortunate enough to speak with some really brilliant people, and hear stories from lots of developers who had both good and bad experiences with deployment. However, the overwhelming majority of developers I spoke with all agreed: deploying Django is hard.&lt;/p&gt;
&lt;p&gt;Now, a lot of the "deployment problem" (as I've come to refer to it) is not directly Django's fault, but rather a side effect of working with so many technologies, services, and libraries. It is only natural that building complex and performant software require sufficient deployment and administration attention in order to work well.&lt;/p&gt;
&lt;p&gt;After writing&amp;nbsp;&lt;a href="http://rdegges.com/deploying-django" title="Deploying Django"&gt;Deploying Django&lt;/a&gt;, I decided to embark on a personal quest to find, implement, and write about the best possible deployment strategies currently around. Since then, I've been extremely fortunate in that I've found what I consider to be the best possible deployment strategy for modern Django projects.&lt;/p&gt;
&lt;p&gt;The goal of this article series is to tell my own tale of deploying Django: what my problems were, what solutions I've found, and what problems still exist--in hopes that my experiences will help guide other Djangonauts looking for a&amp;nbsp;&lt;em&gt;better way&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: xx-large;"&gt;Deployment Goals&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To kickstart this article, I'd like to explain where I'm coming from: what I do, what I value, and what my deployment goals are--as these are all crucial to the story. Everyone has different needs, and there's a good chance that your needs (and subsequently, goals) may be vastly different from mine.&lt;/p&gt;
&lt;p&gt;I'm the lead developer at a small telecommunications startup in the USA. My company builds various telephony services, all of which are free for personal usage. For more than a year, I was the sole technical employee, responsible for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Building our products.&lt;/li&gt;
&lt;li&gt;Building our architecture.&lt;/li&gt;
&lt;li&gt;Scaling our services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: I'm still responsible for all of the above, but we've expanded a bit so I'm no longer alone =)&lt;/p&gt;
&lt;p&gt;As we're a small tech company, our primary concern is productivity. Our revenue is directly related to the amount of bugs we fix and features we add, so it is in our best interest to free up as much engineering time as possible so that we can focus on adding value to our users' lives.&lt;/p&gt;
&lt;p&gt;What this means for my company is that we greatly value devops work. Any pieces of our infrastructure that we can automate and scale through code are infintely valuable to us, as they free up engineering time in the long run, giving us more time to make an impact in our product.&lt;/p&gt;
&lt;p&gt;In an perfect world, as a developer, I should be able to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run a single command to deploy my application into production.&lt;/li&gt;
&lt;li&gt;Run a single command to automatically scale up (or scale down) my application.&lt;/li&gt;
&lt;li&gt;Instantly add services to my infrastructure that my application needs (&lt;a href="http://memcached.org/" title="memcached"&gt;memcached&lt;/a&gt;,&amp;nbsp;&lt;a href="http://redis.io/" title="redis"&gt;redis&lt;/a&gt;,&lt;a href="http://www.postgresql.org/" title="PostgreSQL"&gt;postgresql&lt;/a&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Have full access to logs and metrics for all parts of my infrastructure, so that I can find problems and fix them based on facts, not assumptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Furthermore,&amp;nbsp;&lt;em&gt;&lt;strong&gt;I want my application and all of its related infrastructure components to *just work*, and require NO maintenance.&amp;nbsp;&lt;/strong&gt;&lt;/em&gt;For instance, if I provision a redis&amp;nbsp;server, I want to know that it will always be up and available, and that I will never need to make changes to it again (other than scaling it up or down).&lt;/p&gt;
&lt;p&gt;I think we can all agree that if the conditions above could be met with minimal work, life as a developer would be&amp;nbsp;&lt;a href="http://s3.amazonaws.com/kym-assets/photos/images/original/000/090/603/258witx.gif?1293746728" title="grand"&gt;grand&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the next part of this series, I'll explain my company's product technology in detail, highlighting the pain points of deployment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt;: I finished Part 2, so you can continue reading &lt;a href="http://rdegges.com/devops-django-part-2-the-pain-of-deployment" title="DevOps Django - Part 2 - The Pain of Deployment"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/devops-django-part-1-goals"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/devops-django-part-1-goals#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/hDslr3f3q98" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://rdegges.com/devops-django-part-1-goals</feedburner:origLink></item>
    <item>
      <pubDate>Sun, 30 Oct 2011 00:00:00 -0700</pubDate>
      <title>Deploying Django</title>
      <link>http://feedproxy.google.com/~r/rdegges/~3/vHwfgqsc99M/deploying-django</link>
      <guid isPermaLink="false">http://rdegges.com/deploying-django</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Cookie-monster-wtf-is-this" height="314" src="http://getfile2.posterous.com/getfile/files.posterous.com/temp-2011-10-29/pEaqgvlBqjkzwuzlfuxdojtvwmizyJCHxckxwzajalkxzyprIuomhdrfomqm/cookie-monster-wtf-is-this.jpg.scaled696.jpg" width="324" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Over the past two years, I've learned a &lt;em&gt;hell&lt;/em&gt; of a lot about deploying Django apps into production. And yes, I really do mean a &lt;strong&gt;HELL&lt;/strong&gt; of a lot. While Django is a great web framework, one of its primary weaknesses (in my opinion) is a lack of strong deployment documentation and community standards. There has been no easy way (until now, &lt;em&gt;kinda&lt;/em&gt;) to deploy your apps into production in a reliable, simple fashion. Period.&lt;/p&gt;
&lt;p&gt;Sure, there are excellent &lt;em&gt;best practices&lt;/em&gt; that a few &lt;strong&gt;awesome&lt;/strong&gt; programmers follow, but for the majority of users, the best practices are just too complex and time consuming to setup and administer for typical site.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;Real World Deployment&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Let's pretend, for a moment, that you're an intermediate Django programmer. You spend 8 hours a day working on a single project that is built purely in python / Django. Your &lt;a href="http://img88.imageshack.us/img88/2310/200311chinpokomongi2.jpg" title="primary main objective"&gt;primary main objective&lt;/a&gt; is to keep your users happy (fix bugs, release new features, etc.). You're fairly familiar with the Django ecosystem: you know which apps to look at for solving various problems, and you know where to find information you don't already know.&lt;/p&gt;
&lt;p&gt;Let's further assume that you're also an all-around-geek, and manage your own &lt;a href="http://www.rackspace.com/" title="rackspace"&gt;Rackspace&lt;/a&gt; or &lt;a href="http://aws.amazon.com/" title="amazon"&gt;Amazon&lt;/a&gt; servers which you use to host your Django app. You boot your fresh new &lt;a href="http://www.ubuntu.com/" title="ubuntu"&gt;Ubuntu&lt;/a&gt; cloud server, then install &lt;a href="http://www.apache.org/" title="apache"&gt;Apache&lt;/a&gt; and &lt;a href="http://code.google.com/p/modwsgi/" title="mod_wsgi"&gt;mod_wsgi&lt;/a&gt; to run your Django site. You then spin up a second server and install &lt;a href="http://www.postgresql.org/" title="postgres"&gt;PostgreSQL&lt;/a&gt;, which your site uses as its primary data store.&lt;/p&gt;
&lt;p&gt;You think you're doing a good job--you wrote your app and got it online,&amp;nbsp;spent time learning how to use your cloud provider's APIs to boot up your new server, and you managed to install, configure, and administrate your app. Furthermore, you know where to look for problems: apache error logs, Django 500 and 404 emails, etc. In your mind, you're &lt;a href="http://www.awesomeness.net/colbert_arms_folded.jpg"&gt;awesome&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you think about the amount of effort you put into your work, you feel highly accomplished. Not only did you do a good job getting everything running, but you also spent &lt;em&gt;&lt;strong&gt;years&lt;/strong&gt;&lt;/em&gt; learning all the technologies that power your site: HTML, CSS, Javascript, Python, Django, linux, etc.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;... BUT ...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After&amp;nbsp;three months of building your site, and 1 month of getting it running in production, you finally have real users. As a matter of fact, you're getting about 20 hits per second. While this may be awesome for business, your web server's load is &lt;a href="https://si0.twimg.com/profile_images/135126819/404-fffuuu_bigger.png" title="FFFFFUUUUUU"&gt;14&lt;/a&gt;, and your users' HTTP requests start timing out.&lt;/p&gt;
&lt;p&gt;Since your Postgres server still has reasonable load, you decide to scale your site horizontally by spinning up a second web server, and splitting HTTP requests between the two. This way, you can serve twice as many users and keep your site running smoothly.&lt;/p&gt;
&lt;p&gt;You spin up a new server, install Apache / mod_wsgi again, then copy your code over. After a few hours researching HTTP load balancing, you decide to use&amp;nbsp;&lt;a href="http://haproxy.1wt.eu/" title="haproxy"&gt;HAproxy&lt;/a&gt;&amp;nbsp;to proxy your requests. A week later, you have HAproxy running on a new server, and can see HTTP requests hitting each web server.&lt;/p&gt;
&lt;p&gt;Finally, your users can view your site again, whew. &lt;em&gt;&lt;strong&gt;WRONG&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As your site has grown, you've noticed that several pages have started eating lots of CPU cycles. Upon further analysis, you see the problem: rendering the dashboard page requires about 30 time intensive SELECT queries on your PostgreSQL server. &lt;strong&gt;&lt;em&gt;Damn&lt;/em&gt;&lt;/strong&gt;. To make matters worse, you can tell that if you don't get this fixed right away, the database server will be destroyed by the week's end.&lt;/p&gt;
&lt;p&gt;To avoid repeating the large SQL queries, you decide to cache the page data for an hour the first time a user visits the page. That way, repeat requests for that page will not generate repeat SQL queries, thereby taking load off the database. You provision a new server, and install &lt;a href="http://memcached.org/" title="memcached"&gt;memcached&lt;/a&gt;. Two days later, you've got a caching server working, and you've rewritten most of your Django views to utilized memcached.&lt;/p&gt;
&lt;p&gt;Now you can finally get back to coding! &lt;em&gt;&lt;strong&gt;WRONG&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Your pages are still loading slowly. You analyze your codebase, and realize the new problem: once your cached page expires (at the end each hour), multiple users hit the page simultaneously, generating numerous time intensive SQL queries, effectively hammering your database server and causing HTTP timeouts. Back to the drawing board.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At this point, you're frustrated with progress.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After a few days of research, you discover how to solve your caching problems: &lt;a href="http://en.wikipedia.org/wiki/Cache_invalidation" title="cache invalidation"&gt;cache invalidation&lt;/a&gt; + &lt;a href="http://activemq.apache.org/how-do-distributed-queues-work.html" title="how distributed queues work"&gt;distributed message queues&lt;/a&gt;. Essentially, each time a user adds new data to your site, you'll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dump a small message onto the queue that says "do some processing, then update the cache".&lt;/li&gt;
&lt;li&gt;Your queue will get the message, and hold onto it.&lt;/li&gt;
&lt;li&gt;Your worker processes will grab the oldest message from the queue, one at a time, and do what needs to be done (do processing, update the cache, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This way, your page cache is never stale, and you never run into the same traffic stampede issues that you previously had.&lt;/p&gt;
&lt;p&gt;The only problem now is that setting up a distributed message queue is a lot of work. You need to setup a &lt;a href="http://www.rabbitmq.com/" title="rabbitmq"&gt;RabbitMQ&lt;/a&gt;, &lt;a href="http://ask.github.com/celery/userguide/periodic-tasks.html" title="celerybeat"&gt;celerybeat&lt;/a&gt;, and one (or more)&amp;nbsp;&lt;a href="http://celeryproject.org/" title="celery"&gt;celeryd&lt;/a&gt; servers.&lt;/p&gt;
&lt;p&gt;Two weeks and a lot of &lt;a href="http://www.amazon.com/gp/product/B000NGNEKY/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=projectb14ck-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=B000NGNEKY" title="rockstar no carb energy drinks"&gt;energy drinks&lt;/a&gt; later, you've got it all set up and working. You've rewritten most of your initial Django code to make good use of celery and memcached.&lt;/p&gt;
&lt;p&gt;But... then you realize the Postgres server is dying. &lt;em&gt;&lt;strong&gt;FUCK!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Even with all the fancy new scaling tools implemented, the database just can't handle the constant load. Two weeks later you finish deploying multiple PostgreSQL read slaves, and configure your Django database routing rules to use the new PostgreSQL cluster effectively.&lt;/p&gt;
&lt;p&gt;At this point, you're dying to get back to programming. You've spent almost two months keeping your site running, but that's it. You haven't had time to work on bug fixes, or feature requests for your site. To top it all off, you've had to rapidly learn numerous new technologies just to keep things going, and you're afraid that if anything fails, you'll be completely screwed.&lt;/p&gt;
&lt;p&gt;In order to maintain your sanity, you spend a few more days researching server management tools, and discover &lt;a href="http://puppetlabs.com/" title="puppet"&gt;puppet&lt;/a&gt;. Then...&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Oh-my-god" height="319" src="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2011-10-30/dyBsDeavxgBaBwJtkpxfbcGejCinIAicsBFagbvzgykxaqpfBroJvzhcxBob/Oh-My-God.jpeg.scaled696.jpg" width="470" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oh my fucking GOD!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes, grasshopper! You now see it: you have only begun to discover the amount of work that lays ahead. You've barely scratched the surface as to the tools, methods, and skills necessary to manage and operate even the &lt;em&gt;simplest&lt;/em&gt; of production sites. Your work is cut out for you.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;The Truth&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If I've learned anything in the past two years working with production Django deployments, it's that &lt;strong&gt;deployment is fucking &lt;em&gt;hard&lt;/em&gt;&lt;/strong&gt;. Every real project I've put into production over the past few years has involved hundreds (if not thousands) of hours worth of infrastructure management. Even though I'd like to think that my overall syadmin skills are slightly above that of your typical programmer, I still spend an inordinate amount of time working on infrastructure.&lt;/p&gt;
&lt;p&gt;After speaking to loads of other programmers in the Django community, I realize&amp;nbsp;it isn't only me who has this problem, it's &lt;em&gt;&lt;strong&gt;everyone&lt;/strong&gt;&lt;/em&gt;. While I don't have any statistics to back this up, I'd estimate that typical Django programmers spends at &lt;em&gt;&lt;strong&gt;least&lt;/strong&gt;&lt;/em&gt; half their time working on infrastructure related tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Django community is at an interesting place right now.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We're sitting on verge of an enormous technology breakthrough. There are currently sufficient tools, methods, and practices that allow Django developers to build simple, robust, and scalable applications. However, the community as a whole lacks direction and confidence in deployment.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;What Django Needs&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In order to fix the deployment problems in the Django community, several things need to happen. If community members realize the importance of this problem, it is more likely to get resolved quickly. By solving the deployment problem, Django can set an&amp;nbsp;unprecedented standard for web development.&lt;/p&gt;
&lt;p&gt;First and foremost, all of the Django hosting companies around (&lt;a href="http://www.heroku.com/" title="Heroku"&gt;Heroku&lt;/a&gt;, &lt;a href="https://gondor.io/" title="Gondor"&gt;Gondor&lt;/a&gt;, &lt;a href="https://www.ep.io/" title="epio"&gt;epio&lt;/a&gt;, &lt;a href="http://djangozoom.com/" title="djangozoom"&gt;djangozoom&lt;/a&gt;, etc.) need to really step up their game. These companies are in the best position to fix the delployment problem. Their livelihood depends on making developer's lives easier, and since they have developers giving them money, they're in the best position to gather real world usage data from numerous Django developers, and build elegant deployment abstractions.&lt;/p&gt;
&lt;p&gt;I'd personally like to see Heroku succeed as the dominant Django hosting provider. In my opinion, they are tackling the deployment problem the best way. Their model is simple: provide solid support for hosting your apps, and a &lt;a href="http://addons.heroku.com/" title="heroku addons"&gt;large collection of add-ons&lt;/a&gt;&amp;nbsp;that any developer can easily add and remove from their site in an instant. Their addons allow you (as a developer) to completely ignore 90% of typical infrastructure work, focusing purely on application code. Furthermore, since Heroku is running on Amazon's cloud, it's likely that their prices will drop over time as their user base continues to grow and Amazon's infrastructure becomes a commodity.&lt;/p&gt;
&lt;p&gt;Second, we need strong deployment leadership from Django's core team. In my opinion, &lt;a href="http://jacobian.org/" title="Jacob Kaplan-Moss"&gt;Jacob Kaplan-Moss&lt;/a&gt; is best posed to take on the role of deployment-&lt;a href="http://en.wikipedia.org/wiki/Benevolent_Dictator_For_Life" title="BDFL"&gt;BDFL&lt;/a&gt;. Jacob (one of the Django creators and core developers) is an outspoken &lt;a href="http://en.wikipedia.org/wiki/DevOps" title="devops"&gt;devops&lt;/a&gt; advocate, frequently giving presentations on Django deployment and infrastructure best practices.&lt;/p&gt;
&lt;p&gt;With a strong leader willing to tackle the deployment problem, the official &lt;a href="https://docs.djangoproject.com/en/1.3/howto/deployment/" title="Django deployment documentation"&gt;deployment documentation&lt;/a&gt; needs to be heavily updated. Currently, the official documentation is woefully inadequate--covering only the most basic deployment patterns. In order for the Django community to continue to grow and succeed, the official deployment documentation needs to have a strong voice and opinion--it needs to say:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Here's how to do caching right.&lt;/li&gt;
&lt;li&gt;Here's how to properly setup asynchronous tasks.&lt;/li&gt;
&lt;li&gt;Here's how to scale your database for certain usage patterns.&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While this will surely upset a lot of people who believe in Python's flexibility, Django &lt;strong&gt;needs&lt;/strong&gt; to take an opinionated stance in regards to tools, patterns, and practices. Without a stance, the community will stay as it is: stuck in a confused state regarding deployment.&amp;nbsp;If we (as a community) can agree to take a stance on deployment: decide what to do, and what not to do--it will revolutionize Django.&lt;/p&gt;
&lt;p&gt;Third, the open source community needs to develop high-level abstractions for common patterns. There are currently excellent tools available to Django developers wanting to build production apps (celery, rabbitmq, memcached, redis, etc.), but due to the complexity associated with setting them up and managing them, they are not used nearly as often as they should be.&lt;/p&gt;
&lt;p&gt;Developers need tools to fully automate and manage various pieces of Django infrastructure. If it was as easy to deploy an auto-scaling distributed cache as it was to start a Django app on the command line, Django developers everywhere would be much happier.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: x-large;"&gt;I Have a Dream&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In my dream, all Django developers (from the newest to the most experienced) can rapidly build their web apps, knowing that production deployment is at most 10 minutes away from completion.&lt;/p&gt;
&lt;p&gt;Imagine a world where (as a developer) you can build an app, and have it running live in a best-practices, scalable, and sustainable way in no more than 10 minutes. The possible benefits are tremendous:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Production Django sites will typically be more reliable than their counterparts.&lt;/li&gt;
&lt;li&gt;Django developers worldwide will have confidence in not only writing, but also deploying their applications to the world.&lt;/li&gt;
&lt;li&gt;New developers will be greatly attracted to Django as a framework, due to its immensely simplified and powerful deployment options.&lt;/li&gt;
&lt;li&gt;Django developers will be able to spend more time, each day, writing python and Django code, instead of focusing their efforts on infrastructure management.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;We're at an awesome time in Django history.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Each of us has the ability to greatly effect the future of the framework we all love so much. We have the ability to influence the newest generation of sites that power the internet. We need to collectively decide to show our fellow developers the light, and remove the confusion that exists around deployment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt;: Based on the feeback I received from this article, I decided to write a series on deploying Django. If you're interested, you can read the first part &lt;a href="http://rdegges.com/devops-django-part-1-goals" title="DevOps Django - Part 1 - Goals"&gt;here&lt;/a&gt;.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rdegges.com/deploying-django"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://rdegges.com/deploying-django#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rdegges/~4/vHwfgqsc99M" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/816693/GrimReaper.png</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4wzEhgtZp6cV</posterous:profileUrl>
        <posterous:firstName>Randall</posterous:firstName>
        <posterous:lastName>Degges</posterous:lastName>
        <posterous:nickName>rdegges</posterous:nickName>
        <posterous:displayName>Randall Degges</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="314" width="324" url="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2011-10-29/pEaqgvlBqjkzwuzlfuxdojtvwmizyJCHxckxwzajalkxzyprIuomhdrfomqm/cookie-monster-wtf-is-this.jpg">
        <media:thumbnail height="314" width="324" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2011-10-29/pEaqgvlBqjkzwuzlfuxdojtvwmizyJCHxckxwzajalkxzyprIuomhdrfomqm/cookie-monster-wtf-is-this.jpg.scaled500.jpg" />
      </media:content>
      <media:content type="image/jpeg" height="319" width="470" url="http://getfile0.posterous.com/getfile/files.posterous.com/temp-2011-10-30/dyBsDeavxgBaBwJtkpxfbcGejCinIAicsBFagbvzgykxaqpfBroJvzhcxBob/Oh-My-God.jpeg">
        <media:thumbnail height="319" width="470" url="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2011-10-30/dyBsDeavxgBaBwJtkpxfbcGejCinIAicsBFagbvzgykxaqpfBroJvzhcxBob/Oh-My-God.jpeg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://rdegges.com/deploying-django</feedburner:origLink></item>
  </channel>
</rss>

