<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Uptonian Thoughts</title>
	<atom:link href="http://www.thomasupton.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thomasupton.com/blog</link>
	<description>If we could only see us now...</description>
	<lastBuildDate>Mon, 21 May 2012 03:22:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Syntastic</title>
		<link>http://www.thomasupton.com/blog/2012/05/syntastic/</link>
		<comments>http://www.thomasupton.com/blog/2012/05/syntastic/#comments</comments>
		<pubDate>Sun, 20 May 2012 19:13:08 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=750</guid>
		<description><![CDATA[I love writing with vim, but, for many valid reasons, some people are averse to it. I think the steep (–ish) learning curve has something to do with it, but I think some people really don&#8217;t want to give up their IDE. The thing is, vim isn&#8217;t just a text editor. You can extend it &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/05/syntastic/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p>I love writing with <code>vim</code>, but, for many valid reasons, some people are averse to it. I think the steep (–ish) learning curve has something to do with it, but I think some people really don&#8217;t want to give up their IDE. The thing is, <code>vim</code> isn&#8217;t <em>just</em> a text editor. You can extend it to do pretty much anything, including features that normally show up in IDEs.</p>

<p>I recently started using <a href="https://github.com/scrooloose/syntastic">syntastic</a>, which is a <code>vim</code> plugin that runs linters or syntax checkers and displays warnings and errors right in your window. IDEs like Eclipse or Xcode provide this syntax-checking for a couple of languages, but syntastic supports many languages and linters out of the box with pluggable support for nearly any language.</p>

<h2>Setup</h2>

<p>If you use <a href="https://github.com/tpope/vim-pathogen">pathogen</a> like every sane <code>vim</code> user does, installing syntastic is just like any other plugin. Clone the repository or create a submodule in <code>bundle/syntastic</code> and you&#8217;re ready to go.</p>

<p>I mainly work with Javascript, Python, HTML, and CSS, so that&#8217;s what I&#8217;ll talk about. It&#8217;s worth checking out the syntax checkers in <code>bundle/syntastic/syntax_checkers/</code>, even if you just look at the list of files there. You might have to dive into the files to figure out which linters are actually supported as it&#8217;s not clearly documented.</p>

<p>Before we get to configuring individual syntax checkers, syntastic itself has a couple of configuration options. Syntastic has what it refers to as a &#8220;mode map&#8221;, which is basically just a way to configure which file types are checked. Here is the relevant config option from <a href="https://github.com/tupton/vim-support/blob/master/vimrc#L302">my vimrc</a>:</p>

<pre><code>" On by default, turn it off for html
let g:syntastic_mode_map = { 'mode': 'active',
    \ 'active_filetypes': [],
    \ 'passive_filetypes': ['html'] }
</code></pre>

<p>The &#8216;mode&#8217; option set to active means that syntastic is on by default, so we can leave the list of &#8216;active_filetypes&#8217; empty. The &#8216;passive_filetypes&#8217; names filetypes that syntastic does not attempt to check. I don&#8217;t check HTML files because I mainly work with templates that either can&#8217;t or won&#8217;t validate with most HTML syntax checkers. If templates use non-standard attributes, it&#8217;s hard for a syntax checker to do its job.</p>

<h3>Python</h3>

<p>Setting up syntastic for use with python was extremely easy. <a href="http://pypi.python.org/pypi/pyflakes">pyflakes</a> has relatively sane defaults, so running it with no configuration is more than acceptable. Just install <code>pyflakes</code> with <code>pip install pyflakes</code> and syntastic will automatically do the rest.</p>

<h3>Javascript</h3>

<p>There are a number of Javascript linters, including <a href="http://www.jslint.com/">JS Lint</a> and Google&#8217;s <a href="https://developers.google.com/closure/utilities/">Closure linter</a>, but I decided to use the communtiy-driven <a href="http://www.jshint.com/">JS Hint</a>.  JS Hint can be configured with a jshintrc, which just is a JSON object that contains options. There are two categories of options: those that enforce stricter rules than the defaults and those that relax default checks. The <a href="http://www.jshint.com/options/">options page of the jshint website</a> does a great job of explaining each option. You can <a href="https://github.com/tupton/dotfiles/blob/master/jshintrc">view my jshintrc on my Github page</a>. I added a few &#8220;enforcing&#8221; options, but the only &#8220;relaxing&#8221; option I use is the &#8220;sub&#8221; option, which allows subscript notation when accessing properties, e.g. <code>this['domNode']</code> as well as <code>this.domNode</code>.</p>

<h2>Usage</h2>

<p><img src="http://farm8.staticflickr.com/7085/7235544916_6f48ae8f45_o_d.png" alt="syntastic and underscore.js" /></p>

<p>By default, syntastic runs your file through the configured filetype&#8217;s linter whenever the buffer is written. If there are errors, they are highlighted inline. When your cursor is on a line with an error, the description of the error is visible in the status line. You can use the <code>:Errors</code> command to open a quickfix window with a list of all errors in the file. Pressing enter on an error will take you to that line in the file. Syntastic uses <a href="http://vimdoc.sourceforge.net/htmldoc/sign.html">vim&#8217;s signs</a>, which means that a gutter with a sign appears on the left side of every line with an error on it, making it easy to scan the buffer for errors.</p>

<p>You can configure syntastic in many other ways, including telling it to check a buffer whenever it is opened. I explored the help file (<code>:help syntastic</code>) when I first started using syntastic, and it was incredibly helpful. I encourage anyone who uses syntastic to do the same.</p>

<p>Syntastic has already helped me avoid many typos and silly errors that would ordinarily be hard to track down. It&#8217;s an invaluable tool in my workflow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/05/syntastic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mint</title>
		<link>http://www.thomasupton.com/blog/2012/04/mint/</link>
		<comments>http://www.thomasupton.com/blog/2012/04/mint/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 23:37:38 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Webapps]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=746</guid>
		<description><![CDATA[I just started using Mint to track statistics on my site. I&#8217;ve been using Google Analytics for a long time, and I will continue to do so, but it is definitely geared more towards sites trying to earn money. Mint seemed to offer a more streamlined and customizable interface for people who just want to &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/04/mint/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm8.staticflickr.com/7180/7089520649_0beff76701_o_d.png" alt="Mint" /></p>

<p>I just started using <a href="http://haveamint.com/">Mint</a> to track statistics on my site. I&#8217;ve been using Google Analytics for a long time, and I will continue to do so, but it is definitely geared more towards sites trying to earn money. Mint seemed to offer a more streamlined and customizable interface for people who just want to look at stats.</p>

<p>Mint is a pluggable, extensible stats system. Mint modules are known as &#8220;peppers,&#8221; and each one provides some small functionality. There is a <a href="http://www.haveamint.com/peppermill/pepper/4/default/">default pepper</a> that provides some basic stats functionality like page views, unique visitors, search terms that brought those visitors to your site, and which pages they are looking at. There are a large number of official and community peppers over at the Peppermill that offer much more functionality and statistical views.</p>

<h2>Installation</h2>

<p>Installing Mint was a breeze. I just followed the simple instructions and I was good to go. If you have unfettered access to your server (via <code>ssh</code>) you should have no issues.</p>

<h3>Issues with mod_pagespeed</h3>

<p>I did run into a couple strange display issues when I went to view my Mint stats. Each pane took up the maximum width when it was opened. Even though I could view all my stats, the interface didn&#8217;t look good. After posting in the forum and fruitlessly trying to edit the Mint source code, I disabled <a href="http://code.google.com/speed/page-speed/docs/module.html"><code>mod_pagespeed</code></a> on the hunch that my code changes weren&#8217;t taking effect because <code>mod_pagespeed</code> was caching everything. All of a sudden, the Mint interface looked fine, and it turned out that my small tweaks didn&#8217;t really make much of a difference after all. I still haven&#8217;t figured out exactly why <code>mod_pagespeed</code> was causing issues, but disabling it sure did fix them. If anyone has any insight into this, please let me know.</p>

<h2>Peppers</h2>

<p>I mentioned that Mint is pluggable and extensible. In fact, that is its entire basis: every bit of functionality is provided by modular plugins called peppers. Mint comes with the default pepper that I mentioned before, but there are many more available. I use a number of them.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/5/backup_restore/">Backup/Restore</a></h3>

<p>This pepper is self-explanatory: back up and restore your Mint stats. That&#8217;s it.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/57/iphone/">iPhone</a></h3>

<p>The default Mint interface isn&#8217;t that great for a smaller screen like the iPhone, so this pepper displays an optimized interface when you view Mint on an iPhone.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/60/outbound/">Outbound</a></h3>

<p>A lot of analytics apps try to show you where your visitors come from, and that information is important. You might be interested in where your visitors go next, so this pepper shows your most popular outbound links.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/7/user_agent_007/">User Agent 007</a></h3>

<p>This cleverly-named pepper shows a breakdown of your visitors by user agent.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/9/real_estate/">Real Estate</a></h3>

<p>This one shows a breakdown of your visitors by the size of their screen.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/6/local_searches/">Local Searches</a></h3>

<p>If your blogging software has a search mechanism, this pepper shows you what your visitors are searching for. Note that this is different than the search engine queries that bring visitors to your site that the default pepper shows.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/45/doorbell/">Doorbell</a></h3>

<p>When you&#8217;re viewing your Mint interface, the doorbell pepper provides a some audio feedback when you get a new visitor.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/92/errors/">Errors</a></h3>

<p>This pepper shows any error pages that your visitors may have seen, along with the page that was requested that caused that error.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/29/locations/">Locations</a></h3>

<p>This pepper provides a breakdown of your visitors by geographic location.</p>

<h3><a href="http://www.haveamint.com/peppermill/pepper/67/sparks/">Sparks!</a></h3>

<p>Sparklines provide a great way to view useful trends in a small space. This combined with the iPhone pepper makes checking visitor trends on the go a snap.</p>

<p>I use both Google analytics and Mint on my site, but I find myself looking at Mint much, much more often. It just offers a better view into the kind of people visiting your site, especially if you&#8217;re coming from a position of trying to understand what kind of content brings them to your site in the first place. Mint comes highly recommended.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/04/mint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Handle Pattern</title>
		<link>http://www.thomasupton.com/blog/2012/03/the-handle-pattern/</link>
		<comments>http://www.thomasupton.com/blog/2012/03/the-handle-pattern/#comments</comments>
		<pubDate>Sun, 25 Mar 2012 18:12:06 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Webapps]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=732</guid>
		<description><![CDATA[I&#8217;m not entirely sure if there&#8217;s a better name for this pattern that already exists, but I like &#8220;handle pattern&#8221; to describe this method of keeping track of and managing &#8220;subscriptions&#8221;. var subscriber = (function() { var _listeners = {}; var s = { // Listen to a channel and call a callback when that &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/03/the-handle-pattern/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m not entirely sure if there&#8217;s a better name for this pattern that already exists, but I like &#8220;handle pattern&#8221; to describe this method of keeping track of and managing &#8220;subscriptions&#8221;.</p>

<pre>
<code data-language="javascript">
var subscriber = (function() {
    
    var _listeners = {};
        
    var s = {
        // Listen to a channel and call a callback when that channel fires
        listen: function(channel, cb) {
            // Add the callback to the list of listeners on the given channel
            _listeners[channel] = _listeners[channel] || [];
            _listeners[channel].push(cb);
            
            return {
                // Return an object that can be used to remove the callback from the channel
                unlisten: function() {
                    // Remove the callback from the list of listeners on that channel
                    _listeners[channel].splice(_listeners[channel].indexOf(cb), 1);
                }
            }
        },
        
        // Manually fire events on a given channel.
        publish: function(channel) {
            _listeners[channel] = _listeners[channel] || [];
            _listeners[channel].forEach(function(cb) {
                cb();
            });
        }
    };
    
    return s;
})();
    
var h = subscriber.listen('update', function() {
    console.log('The update event was fired!');
});

subscriber.publish('update'); // &gt; "The update event was fired!"

h.unlisten();
    
subscriber.publish('update'); // &gt; &lt;no output&gt;
</code>
</pre>

<p>When you have an event-driven application, like a Javascript app that performs actions based on user interaction or based on back end &#8220;pushes&#8221; to a listening front end, you often have a central &#8220;publisher&#8221; that handles firing events when certain actions occur. It makes sense to have a static <code>listen</code> function that takes a &#8220;channel&#8221; and a callback function to call when that channel gets updated. The problem comes when you have to decide how to <em>stop</em> listening to that channel. If you go with a static <code>unlisten</code> function on the publisher with the same signature as <code>listen</code> (the channel and callback), you need to keep track of which callback is listening to which channel, and it can get messy.</p>

<p>Instead, <code>listen</code> can return a <code>handle</code>, which is just an object that contains a method <code>unlisten</code> that knows exactly how to stop listening on the specific channel and with the specific callback that was given to <code>listen</code>. Then, the caller just needs to keep track of the return values of <code>listen</code> (as opposed to the <em>arguments</em> to <code>listen</code>) in order to be able to <code>unlisten</code> later.</p>

<p>The <a href="http://dojotoolkit.org/">Dojo</a> <a href="http://dojotoolkit.org/reference-guide/1.7/dojo/Stateful.html">Stateful</a> interface uses this pattern to watch values on objects. If you watch a property, a callback can be fired each time that property changes. The return value of <code>watch</code> is a handle that can be used to stop watching that particular property value.</p>

<p>Feel free to <a href="http://jsfiddle.net/tupton/nZKQz/">play around with this code on JSFiddle</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/03/the-handle-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Commit FIXME or TODO</title>
		<link>http://www.thomasupton.com/blog/2012/02/dont-commit-fixme-or-todo/</link>
		<comments>http://www.thomasupton.com/blog/2012/02/dont-commit-fixme-or-todo/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 18:41:13 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=721</guid>
		<description><![CDATA[function getObject($id) { $object = null; // TODO Do we need to validate username? $objects = $this->db->retrieveForUsername($this->username); // FIXME Write `retrieveForIdAndUsername` instead of iterating here foreach ($objects as $o) { if ($o->id() == $id) { $object = $o; break; } } return $object; } This shouldn&#8217;t happen. I&#8217;m not talking about the comically bad code &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/02/dont-commit-fixme-or-todo/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<pre>
<code data-language="php">
function getObject($id) {
    $object = null;
        
    // TODO Do we need to validate username?
    $objects = $this->db->retrieveForUsername($this->username);
        
    // FIXME Write `retrieveForIdAndUsername` instead of iterating here
    foreach ($objects as $o) {
        if ($o->id() == $id) {
            $object = $o;
            break;
        }
    }
        
    return $object;
}
</code>
</pre>

<p>This shouldn&#8217;t happen. I&#8217;m not talking about the comically bad code – it&#8217;s a contrived example, but it proves the point – but about the little &#8220;notes&#8221; left by whoever committed this.</p>

<p>Do we need to validate the username? Probably. Find out, and take the necessary action. If you know your codebase well, it should take about ten seconds to know the answer.</p>

<p>The <code>FIXME</code> is a bit more time-consuming, but the payoff is greater. If you leave this <code>FIXME</code>, I&#8217;m going to assume one of two things: you&#8217;re a lazy programmer, or you&#8217;re a bad programmer. You&#8217;re lazy because you can&#8217;t be bothered to write something correctly or you&#8217;re bad because you don&#8217;t know <em>how</em> to write it correctly. <sup id="fnref:bad-dev"><a href="#fn:bad-dev" rel="footnote">1</a></sup></p>

<p>Of course, use <code>TODO</code> or <code>FIXME</code> while you&#8217;re developing to keep a list of tasks that you have to finish before your feature is complete. Just don&#8217;t commit them to where other developers can see them and <em>certainly</em> don&#8217;t merge them to trunk.</p>

<p>If you&#8217;re lazy with that code now, there&#8217;s no way you&#8217;re going to overcome that laziness and come back to fix it later.</p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:bad-dev">
<p>One could argue that being aware of bad code is better than nothing, but that&#8217;s fluffy. If you&#8217;re aware of a problem, you&#8217;re probably smart enough to do something about it.&#160;<a href="#fnref:bad-dev" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/02/dont-commit-fixme-or-todo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Microwave Ovens Suck</title>
		<link>http://www.thomasupton.com/blog/2012/02/microwave-ovens-suck/</link>
		<comments>http://www.thomasupton.com/blog/2012/02/microwave-ovens-suck/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 00:50:14 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=716</guid>
		<description><![CDATA[Really. My microwave helpfully makes the numbers 1 through 6 shortcuts for running for that number of minutes, on full power. When&#8217;s the last time you needed to microwave something for six whole minutes? Most of my microwaving involves re-heating leftovers or softening things like tortillas or butter. These things don&#8217;t take minutes; they take &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/02/microwave-ovens-suck/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p>Really. My microwave helpfully makes the numbers 1 through 6 shortcuts for running for that number of minutes, on full power. When&#8217;s the last time you needed to microwave something for <em>six whole minutes</em>?</p>

<p>Most of my microwaving involves re-heating leftovers or softening things like tortillas or butter. These things don&#8217;t take minutes; they take <em>seconds</em>. And if I have something that really need to warm up over the course of one or two minutes, it certainly doesn&#8217;t need to be that long at full power. Those preset buttons are absolutely useless. I need presets for 10, 20, and 30 seconds, and maybe 90, and at power levels of 5, 7, and &#8220;hi&#8221;. Not &#8220;high&#8221;, mind you, &#8220;hi&#8221;.</p>

<p>The rest of my microwaving time is spent trying to defrost frozen meat, like a chicken breast or a tilapia filet. There&#8217;s a button for this, yes, but it requires that I guess the weight of the thing I&#8217;m defrosting. I don&#8217;t own a kitchen scale, but even if I did, I sure as hell wouldn&#8217;t bust it out to figure out how to long I need to defrost my meat. Let me tell you what I&#8217;m defrosting, and then figure out how long to defrost it. Defrosting is not a new science or even science at all.</p>

<p>Here&#8217;s another irksome feature: when I open the microwave door before the timer goes off, I really appreciate that it remembers how much time was left. Once eight hours have passed, though, I think it&#8217;s safe to assume that I&#8217;m no longer in need of that timer. &#8220;PRESS START&#8221; is not helpful after that long. Show me the clock again after a reasonable amount of time has passed.</p>

<p>Another thing: that awful beeping sound. I know some smug person with too much time on his hands has Googled his unit&#8217;s manual and has memorized the arcane sequence of button presses required to mute the microwave, but I haven&#8217;t. Why is there not just a mute button? It&#8217;s not for lack of room: put it under my &#8220;9 &#8221; button or in between &#8220;Defrost&#8221; and &#8220;Popcorn&#8221; (which always burns those poor defenseless kernels) or even in the place of the &#8220;Reminder&#8221; button, because I don&#8217;t keep my todo list on my microwave.</p>

<p>Can someone &#8220;<a href="http://www.nest.com/">Nest</a>-ify&#8221; the microwave? I would buy one in a heartbeat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/02/microwave-ovens-suck/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuration</title>
		<link>http://www.thomasupton.com/blog/2012/02/configuration/</link>
		<comments>http://www.thomasupton.com/blog/2012/02/configuration/#comments</comments>
		<pubDate>Sun, 19 Feb 2012 02:43:38 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Howto]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=709</guid>
		<description><![CDATA[Starting a fresh environment on a new system isn&#8217;t a very common or regular task, but when you do, it comes in handy to have a quick and easy way to do it. To help with this, I keep my vim environment and my environment dot files in version control on Github. I use Pathogen &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/02/configuration/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p>Starting a fresh environment on a new system isn&#8217;t a very common or regular task, but when you do, it comes in handy to have a quick and easy way to do it. To help with this, I keep my <a href="https://github.com/tupton/vim-support"><code>vim</code> environment</a> and my <a href="https://github.com/tupton/dotfiles">environment dot files</a> in version control on Github.</p>

<p>I use <a href="https://github.com/tpope/vim-pathogen">Pathogen</a> to manage my <code>vim</code> plugins. I follow the examples in <a href="http://vimcasts.org/episodes/synchronizing-plugins-with-git-submodules-and-pathogen/">this great article on plugin management with Pathogen</a> to keep most of my plugins as <code>git</code> submodules. Installing my <code>vim</code> environment is just a matter of cloning the <code>git</code> repository and symlinking my <code>vimrc</code>.</p>

<p>I just spent some time cleaning up and organizing my dotfiles.  I wasn&#8217;t even using my old dotfiles repository on GitHub, but I quickly rectified that. I now keep my dotfiles in <code>~/.dotfiles</code> and symlink them to <code>~</code>. There is a helper script in my <a href="https://github.com/tupton/dotfiles">dotfiles repository</a> that sets up these symlinks.</p>

<p>Along with the usual <code>bashrc</code>, there are a few config files that aren&#8217;t as common. My <code>ackrc</code> defines a few convenient options and ignores directories with built artifacts in them. My (old) <code>pythonrc</code> defines a tab-completion function, although this might be outdated at this point. There&#8217;s a <code>tm_properties</code> config for <a href="http://blog.macromates.com/2011/textmate-2-0-alpha/">TextMate 2</a>.</p>

<p>Hopefully the fact that my configuration is out in the open will bring to light some useful features that I probably take for granted but you might not know about. So, go explore! Check out my <code>inputrc</code>, for example. I know that I discover new things almost every time I look at someone else&#8217;s <code>vimrc</code> or <code>bashrc</code>.</p>

<p>Do you have any configuration tips or tricks? Let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/02/configuration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coffee</title>
		<link>http://www.thomasupton.com/blog/2012/01/coffee/</link>
		<comments>http://www.thomasupton.com/blog/2012/01/coffee/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 20:37:42 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Drinks]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=705</guid>
		<description><![CDATA[Like most of the world, I love coffee. I usually drink a cup or two a day, and sometimes more. I&#8217;m lucky enough to live close to places that sell great coffee: Whole Foods roasts their own coffee, and there are numerous local places with great beans. I usually make a full &#8220;batch&#8221; of coffee &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/01/coffee/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm8.staticflickr.com/7164/6654753833_ab1c242b36_z_d.jpg" alt="Coffee" /></p>

<p>Like <a href="http://www.youtube.com/watch?v=OTVE5iPMKLg">most of the world</a>, I love coffee. I usually drink a cup or two a day, and sometimes more. I&#8217;m lucky enough to live close to places that sell great coffee: Whole Foods roasts their own coffee, and there are numerous local places with great beans.</p>

<p>I usually make a full &#8220;batch&#8221; of coffee in a French press (or <em>сafetière</em>), but sometimes that&#8217;s too much. I know it&#8217;s considered blasphemous, but I got a Keurig single cup brewer for Christmas, and I absolutely love it. I was apprehensive about Keurig machines until I found out about refillable &#8220;K-Cups&#8221; that you could fill with your own, delicious coffee. I use the <a href="http://www.amazon.com/gp/product/B000DLB2FI/ref=as_li_ss_tl?ie=UTF8&amp;tag=thomupto-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000DLB2FI">official Keurig &#8220;My K-Cup&#8221;</a>, but that requires that you replace the entire holster mechanism each time. It&#8217;s not time consuming, but it is a bit annoying.</p>

<p>I discovered the <a href="http://www.amazon.com/ekobrew-Refillable-Keurig-Brewers-1-Count/dp/B0051SU0OW/ref=sr_1_1?ie=UTF8&amp;qid=1325967276&amp;sr=8-1">Ekobrew</a>, which is a filter that fits in the existing cup holster. Two of them are on their way to my house from Amazon right now.</p>

<p>Regardless of how it gets there, coffee from the Keurig is (perhaps surprisingly) pleasant. It&#8217;s not the best cup of coffee, but it&#8217;s quick, easy, and clean.</p>

<p>I still use the French press when I need to make a bigger batch of coffee or if I want to relax and enjoy a really great cup. I use the seemingly-ubiquitous Bodum French press and <a href="http://www.amazon.com/gp/product/B0043095WW/ref=as_li_ss_tl?ie=UTF8&amp;tag=thomupto-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0043095WW">burr grinder</a> and keep the coffee warm in my <a href="http://www.amazon.com/gp/product/B00004S56U/ref=as_li_ss_tl?ie=UTF8&amp;tag=thomupto-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00004S56U">Zojirushi carafe</a>. Coffee stays <em>hot</em> for hours on end, so I can make coffee in the morning and still enjoy it later in the afternoon. How I make coffee just depends on how much I need and what kind of mood I&#8217;m in.</p>

<p>One last thing: I also got a small stovetop espresso maker for Christmas, and it is amazing. When I want a treat, I make myself a café Americano: a bit of espresso in a normal-sized coffee cup and filled the rest of the way with hot water. Yum!</p>

<p><em>Full disclosure</em>: I&#8217;ve linked to a number of products on Amazon in this post, and most of them contain my affiliate link. I&#8217;ll get a small kickback if anything is bought via these links. I will only ever post links to products that I use and love, and that is certainly the case with everything here. I&#8217;m passionate about my coffee, and I don&#8217;t want to mislead anyone. I have not included my affiliate link to the Ekobrew refillable K-Cup because I have not received or used it at this time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/01/coffee/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My Essential Tools</title>
		<link>http://www.thomasupton.com/blog/2012/01/my-essential-tools/</link>
		<comments>http://www.thomasupton.com/blog/2012/01/my-essential-tools/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 22:16:30 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=698</guid>
		<description><![CDATA[In light of some recent excellent posts about tools that smart people use, here are my essential tools that I used in 2011. Hardware I use a 15&#8243; MacBook Pro i5 with 8 GB of RAM. It&#8217;s quick and does everything I need it to. It&#8217;s not too bulky, but it&#8217;s certainly bigger than my &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/01/my-essential-tools/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p>In light of some <a href="http://carpeaqua.com/2011/12/19/my-ultimate-developer-and-power-users-tool-list-for-mac-os-x-2011-edition-/">recent</a> <a href="http://collindonnell.com/blog/2012/1/4/essential-tools-2011.html">excellent</a> posts about tools that smart people use, here are my essential tools that I used in 2011.</p>

<h2>Hardware</h2>

<p>I use a 15&#8243; MacBook Pro i5 with 8 GB of RAM. It&#8217;s quick and does everything I need it to. It&#8217;s not <em>too</em> bulky, but it&#8217;s certainly bigger than my older 13&#8243; MacBook. I keep toying with the idea of a MacBook Air, but I can&#8217;t justify the cost and I don&#8217;t want to use two machines.</p>

<p>I connect to an Apple LED Cinema Display when I&#8217;m at my standing desk, and I use a <a href="http://www.amazon.com/gp/product/B002MMY4WY/ref=as_li_ss_tl?ie=UTF8&amp;tag=thomupto-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B002MMY4WY">Logitech wireless keyboard</a> and an Apple Magic Trackpad.</p>

<p>I do <a href="http://www.thomasupton.com/blog/2011/12/local-backups-are-great/">daily, local backups</a> to a smallish volume on a 1 TB hard drive. The rest of the drive holds my music, photos, and other media.</p>

<h2>Software</h2>

<p>I do all of my work (both professionally and on this site) on VMs in &#8220;the cloud&#8221; that I <code>ssh</code> to with <a href="http://www.iterm2.com/#/section/home">iTerm 2</a>. I love that it can copy-on-select and the customizable colors are more robust than in other terminal apps. I used the built in Terminal.app for a long time, but the latest iTerm 2 is stable and excellent.</p>

<p>I also use <a href="http://ditchnet.org/httpclient/">HTTP Client</a> to test our API, as well as both Firefox and Chrome.</p>

<p>When I write code, I usually use <a href="http://www.vim.org/"><code>vim</code></a>, but I&#8217;ve been testing out the recent alpha builds of <a href="http://blog.macromates.com/2011/textmate-2-0-alpha/">TextMate 2</a>.</p>

<p>When I write for this website or for my own personal notes, I&#8217;ve started using <a href="http://bywordapp.com/">Byword</a> to write and preview Markdown. Its fullscreen and &#8220;paragraph focus&#8221; modes are nice touches. I&#8217;ve heard good things about <a href="http://markedapp.com/">Marked</a>, which allows Markdown previews from any app, but I haven&#8217;t used it yet.</p>

<p>I&#8217;m not a huge calendar user, but I do keep track of <a href="http://www.last.fm/user/TUpton/events">shows I attend</a> and personal events on Google Calendar. I interact with my calendars with <a href="http://flexibits.com/fantastical">Fantastical</a>. Its natural language event input is pretty great and lets me add events really quickly.</p>

<p>I work on and use a browser-based email client at work, but I also like to use <a href="http://sparrowmailapp.com/">Sparrow</a>. The minimal interface stays out of the way, but all my mail is available quickly. Shortcuts for reply and reply all make it easy to respond to threads. A nice little touch: Sparrow automatically picked up the fact that I had an IMAP folder called Archive in my work email and started using it when I press Delete to archive messages.</p>

<p>I use <a href="http://www.alfredapp.com/">Alfred</a> all day every day. My usage statistics say I average 13.6 uses per day, but if you didn&#8217;t count weekends, holidays, or days that I don&#8217;t actually use my computer, I bet it&#8217;d be a lot higher. I <em>love</em> the clipboard management.</p>

<p>I occasionally use <a href="http://getcloudapp.com/">Cloud</a> to quickly upload screenshots, but I don&#8217;t use it for much else.</p>

<p>I use <a href="https://www.dropbox.com/">Dropbox</a> to manage files, share some music with friends, and back up certain documents. I also store my (encrypted) <a href="https://agilebits.com/onepassword">1Password</a> data on Dropbox so that I can access my passwords from anywhere.</p>

<p><a href="http://mizage.com/#macdivvy">Divvy</a> and <a href="http://cordlessdog.com/stay/">Stay</a> are two window management tools that I use all the time. When I disconnect from my display, Stay puts my windows back to where I want them. It doesn&#8217;t quite work with Chrome, but everything else works well. Divvy lets me resize windows on a custom-sized grid. You can even define shortcuts – I use &#8220;c&#8221; for a centered window and &#8220;6&#8243; for a window taking up 60% of the right side of the screen.</p>

<p>I recently started using <a href="http://www.evernote.com/">Evernote</a>, but I haven&#8217;t gotten into it just yet. I&#8217;ll have more to write about that when learn how to use it and actually start using it more. I do use <a href="http://www.evernote.com/about/download/clearly.php">Evernote&#8217;s Clearly</a> browser extension to read articles on line.</p>

<p>For my musical pleasure throughout the day, I still use iTunes a lot of the time. However, <a href="http://www.rdio.com/">Rdio</a> (with <a href="http://www.rogueamoeba.com/airfoil/">Airfoil</a>) is usually how I listen to music these days. Airfoil makes it easy to listen to music in my living room via my Apple TV.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/01/my-essential-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uptonian Thoughts on Twitter</title>
		<link>http://www.thomasupton.com/blog/2012/01/uptonian-thoughts-on-twitter/</link>
		<comments>http://www.thomasupton.com/blog/2012/01/uptonian-thoughts-on-twitter/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 04:50:51 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Webapps]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=692</guid>
		<description><![CDATA[You can now follow Uptonian Thoughts on Twitter! I&#8217;m using the Lessn Shortlinks and Simple Twitter Connect WordPress plugins to tweet my posts to @uptonin. I might still occasionally link to my own posts on my @thomasupton account, but all posts and articles, along with information about the site, will be available on @uptonin.]]></description>
			<content:encoded><![CDATA[<p>You can now follow <a href="http://twitter.com/uptonin">Uptonian Thoughts on Twitter</a>! I&#8217;m using the <a href="http://somadesign.ca/2011/lessn-shortlinks-wordpress-plugin/">Lessn Shortlinks</a> and <a href="http://ottopress.com/wordpress-plugins/simple-twitter-connect/">Simple Twitter Connect</a> WordPress plugins to tweet my posts to @uptonin.</p>

<p>I might still occasionally link to my own posts on my @thomasupton account, but all posts and articles, along with information about the site, will be available on @uptonin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/01/uptonian-thoughts-on-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lessn</title>
		<link>http://www.thomasupton.com/blog/2012/01/lessn/</link>
		<comments>http://www.thomasupton.com/blog/2012/01/lessn/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 04:37:07 +0000</pubDate>
		<dc:creator>Thomas Upton</dc:creator>
				<category><![CDATA[Webapps]]></category>

		<guid isPermaLink="false">http://www.thomasupton.com/blog/?p=690</guid>
		<description><![CDATA[I recently installed Lessn and then Lessn More to take control of my own short links. Lessn is a very simple URL shortener that is hosted on my own domain. I registered upton.in to serve my short links. I chose the &#8220;.in&#8221; TLD because it&#8217;s short and common. I do wish there was an &#8220;.on&#8221; &#8230; <span class="read-more"><a href="http://www.thomasupton.com/blog/2012/01/lessn/">(Continue reading &#8594;)</a>]]></description>
			<content:encoded><![CDATA[<p>I recently installed <a href="http://shauninman.com/archive/2009/08/17/less_n">Lessn</a> and then <a href="http://lessnmore.net/">Lessn More</a> to take control of my own short links. Lessn is a very simple URL shortener that is hosted on my own domain.</p>

<p>I registered <a href="http://upton.in/">upton.in</a> to serve my short links. I chose the &#8220;.in&#8221; TLD because it&#8217;s short and common. I do wish there was an &#8220;.on&#8221; TLD so I could register <em>upt.on</em>, but I like the connotation of &#8220;in&#8221;. As <a href="https://twitter.com/thomasupton/status/154218836722335745">I said on Twitter the other day</a>, it can mean &#8220;Internet, inside, come in, infinity, interesting&#8221; among other things.</p>

<p>Lessn also integrates nicely with <a href="http://haveamint.com/">Mint</a>, which I recently started using. I plan to write more on that shortly.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thomasupton.com/blog/2012/01/lessn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

