<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://nerderati.com/wp-atom.php">
	<title type="text">Nerderati</title>
	<subtitle type="text">You're probably not nerdy enough.</subtitle>

	<updated>2010-09-07T15:04:35Z</updated>

	<link rel="alternate" type="text/html" href="http://nerderati.com" />
	<id>http://nerderati.com/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.0.1">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/nerderati" /><feedburner:info uri="nerderati" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[Perpetual IRC &#8211; The Multiplexer Edition]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/v8vswgLuF0A/" />
		<id>http://nerderati.com/?p=401</id>
		<updated>2010-09-07T15:04:35Z</updated>
		<published>2010-09-07T15:04:35Z</published>
		<category scheme="http://nerderati.com" term="Programming" />		<summary type="html"><![CDATA[As is the case with most people involved in Open Source, I&#8217;m on IRC all day long. I can help people from around the world use some of the projects I&#8217;ve helped create, as well as some of the software that I use on a daily basis. Additionally, IRC is also the preferred form of [...]]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/09/perpetual-irc-the-multiplexer-edition/">&lt;p&gt;As is the case with most people involved in Open Source, I&amp;#8217;m on &lt;a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat"&gt;IRC&lt;/a&gt; all day long. I can help people from around the world use some of the &lt;a href="http://lithify.me/"&gt;projects&lt;/a&gt; I&amp;#8217;ve helped create, as well as &lt;a href="http://cassandra.apache.org/"&gt;some of the&lt;/a&gt; &lt;a href="http://www.mongodb.org/"&gt;software&lt;/a&gt; that I use on a daily basis.&lt;/p&gt;
&lt;p&gt;Additionally, IRC is also the preferred form of group communication for the &lt;a href="http://individualdigital.com/"&gt;company&lt;/a&gt; I work for. One of the major advantages that IRC has over your ‘traditional’ instant messenger clients is that, with a minimum amount of effort and hardware, you can create a setup that will remain perpetually&lt;sup&gt;*&lt;/sup&gt; connected, even when you&amp;#8217;re not online. That means that you can keep logs of conversations, receive messages, catch up on what the current topic of discussion is when starting your day, and still be able to shut down your computer at night if you so choose.&lt;/p&gt;
&lt;p&gt;There are a few ways of achieving the status of perpetual IRC denizen. Note, however, that almost any method requires that you have access to a remote server in addition to your local machine. It doesn&amp;#8217;t need to be anything special &amp;#8211; a cheap VPS will do just fine, as long as you can install software packages and open the necessary ports in the firewall.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simplest.&lt;/strong&gt; If you want to expend the least amount of effort, at the cost of some flexibility, the easiest method of achieving IRC immortality is with the use of a &lt;em&gt;terminal multiplexer&lt;/em&gt;, such as &lt;a href="http://www.bangmoney.org/presentations/screen.html"&gt;screen&lt;/a&gt; or &lt;a href="http://tmux.sourceforge.net/"&gt;tmux&lt;/a&gt; (my personal favourite), and a console-based IRC client, such as &lt;a href="http://www.irssi.org/"&gt;Irssi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t know what a terminal multiplexer is? Here&amp;#8217;s a description, right from the &lt;strong&gt;screen&lt;/strong&gt; homepage:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Screen is a terminal multiplexer: it takes many different running processes and manages which of them gets displayed to the user. Think of it as a window manager for your console or terminal emulator. With screen, you can have interactive processes running on your home computer and connect to them from anywhere else to check on their progress.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s assume that you&amp;#8217;ve installed &lt;strong&gt;screen&lt;/strong&gt; and &lt;strong&gt;Irssi&lt;/strong&gt; on your remote server. What we want to do is start Irssi &lt;em&gt;inside&lt;/em&gt; a screen session:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ &lt;span style="color: #c20cb9; font-weight: bold;"&gt;screen&lt;/span&gt; &lt;span style="color: #660033;"&gt;-S&lt;/span&gt; irc irssi &lt;span style="color: #666666; font-style: italic;"&gt;# name the session `irc` and start `irssi` in it&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Digression.&lt;/strong&gt; At this point, feel free to browse the &lt;a href="http://www.irssi.org/documentation"&gt;documentation&lt;/a&gt; on how to properly setup your preferred servers, channels and other configuration parameters for the IRC client. For a quick test, you can try the following at the Irssi prompt:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;/set nick YourNickName&lt;br /&gt;
/connect irc.freenode.net&lt;br /&gt;
/join #some-interesting-channel&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You can also automate the process, so that upon startup Irssi will auto-connect to the servers and channels you specify:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;/server add -auto -network Freenode irc.freenode.net 6667&lt;br /&gt;
/network add -nick YourNickName Freenode&lt;br /&gt;
/channel add -auto #some-interesting-channel Freenode&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you have a registered nickname, you can have it auto-identify as well:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;/network add -autosendcmd &amp;quot;/msg nickserv identify your_pasword_here ;wait 2000&amp;quot; Freenode&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And you&amp;#8217;ll probably want to cut down on the noise:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;/ignore #some-interesting-channel ALL -PUBLIC -ACTIONS&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;At this point, you should have a fully functioning IRC client inside of a screen session. You can &lt;em&gt;detach&lt;/em&gt; from the current session by pressing &lt;strong&gt;control-a d&lt;/strong&gt;, and re-attach with:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ &lt;span style="color: #c20cb9; font-weight: bold;"&gt;screen&lt;/span&gt; &lt;span style="color: #660033;"&gt;-r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;See where this is going? With this setup, you can simply maintain your IRC connection within a screen session on your remote server. When you want to &amp;#8220;log on&amp;#8221;, you simply SSH into your remote server, &lt;strong&gt;screen -r&lt;/strong&gt;, and voilà! Perpetual IRC.&lt;/p&gt;
&lt;p&gt;This approach, while simple, has some very obvious drawbacks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You must be on a machine that is able to SSH into your remote server.&lt;/li&gt;
&lt;li&gt;You are confined to using the command-line IRC client running in the remote session.&lt;/li&gt;
&lt;li&gt;Any scripts that attempt to interact with your &amp;#8216;local&amp;#8217; desktop (e.g. Growl notifications), are painful to setup, if not impossible.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Okay, so it&amp;#8217;s not completely ideal. But it does the job &amp;#8211; as long as your remote screen session remains operational, you&amp;#8217;ll be logged in to IRC.&lt;/p&gt;
&lt;p&gt;In my next post, we&amp;#8217;ll look at how you can achieve the same results, but without any of the aforementioned drawbacks, through the use of a specialized IRC proxy daemon.&lt;/p&gt;
&lt;hr /&gt;
&lt;sup&gt;*&lt;/sup&gt;: Of course, if the remote server running the terminal multiplexer session goes down, it&amp;#8217;s not really ‘perpetual’.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/v8vswgLuF0A" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/09/perpetual-irc-the-multiplexer-edition/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/09/perpetual-irc-the-multiplexer-edition/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/09/perpetual-irc-the-multiplexer-edition/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[Making Git Behave]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/vnZAyhv0Xyk/" />
		<id>http://nerderati.com/?p=307</id>
		<updated>2010-08-04T17:08:03Z</updated>
		<published>2010-07-31T19:51:52Z</published>
		<category scheme="http://nerderati.com" term="Programming" /><category scheme="http://nerderati.com" term="git" /><category scheme="http://nerderati.com" term="project management" /><category scheme="http://nerderati.com" term="scm" />		<summary type="html"><![CDATA[It&#8217;s no secret that I&#8217;m a big fan of Git, and of distributed version control in general; they offer a compelling toolset and degree of flexibility that you would be hard pressed to find in a “traditional” centralized version control system. Instead of discussing the merits of a DVCS or performing feature comparisons between particular [...]]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/07/making-git-behave/">&lt;p&gt;It&amp;#8217;s no secret that I&amp;#8217;m a big fan of &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, and of distributed version control in general; they offer a compelling toolset and degree of flexibility that you would be hard pressed to find in a “traditional” centralized version control system. Instead of discussing the merits of a DVCS or performing feature comparisons between particular implementations &amp;#8212; there are enough of those already &amp;#8212; let&amp;#8217;s take a look at how you can bend Git to your will through configuration, and a few useful aliases. If you&amp;#8217;ve not encountered this before, you&amp;#8217;ll be surprised at how much can be accomplished with just a few lines in a configuration file.&lt;/p&gt;
&lt;h3&gt;Your .gitconfig&lt;/h3&gt;
&lt;p&gt;This is where the magic happens. Git, by default, will attempt to find a &lt;strong&gt;.gitconfig&lt;/strong&gt; file in three places: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;$GIT_DIR/config&lt;/strong&gt; for per-repository configurations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;~/.gitconfig&lt;/strong&gt; for user-specific configurations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$(prefix)/etc/gitconfig&lt;/strong&gt; for system-wide configurations&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Read up on the various &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html"&gt;options and overrides&lt;/a&gt; that &lt;strong&gt;git-config&lt;/strong&gt; accepts, as well as alternative methods to interactively add/remove/replace configuration options.&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;For the rest of this article we&amp;#8217;ll be adding configurations to &lt;strong&gt;~/.gitconfig&lt;/strong&gt;, but there&amp;#8217;s nothing stopping you from doing it in a per-repository (or even system-wide) configuration file instead.&lt;/p&gt;
&lt;p&gt;For reference, here is a simplified version of the config I use:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;[color]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; diff = auto&lt;br /&gt;
&amp;nbsp; &amp;nbsp; status = auto&lt;br /&gt;
&amp;nbsp; &amp;nbsp; branch = auto&lt;br /&gt;
[user]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; name = Joël Perras&lt;br /&gt;
&amp;nbsp; &amp;nbsp; email = joel.perras@gmail.com&lt;br /&gt;
[status]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; relativePaths = false&lt;br /&gt;
[core]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; excludesfile = /Users/joel/.gitignore&lt;br /&gt;
[alias]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; d &amp;nbsp;= diff&lt;br /&gt;
&amp;nbsp; &amp;nbsp; dc = diff --cached&lt;br /&gt;
&amp;nbsp; &amp;nbsp; lc = log ORIG_HEAD.. --stat --no-merges&lt;br /&gt;
&amp;nbsp; &amp;nbsp; gl = log --oneline --decorate --stat --graph&lt;br /&gt;
&amp;nbsp; &amp;nbsp; st = status -sb&lt;br /&gt;
&amp;nbsp; &amp;nbsp; prune-all = !git remote | xargs -n 1 git remote prune&lt;br /&gt;
&amp;nbsp; &amp;nbsp; whatis = show -s --pretty='tformat:%h (%s, %ad)' --date=short&lt;br /&gt;
&amp;nbsp; &amp;nbsp; whois = &amp;quot;!sh -c 'git log -i -1 --pretty=\&amp;quot;format:%an &amp;lt;%ae&amp;gt;\n\&amp;quot; --author=\&amp;quot;$1\&amp;quot;' -&amp;quot;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Also available as a &lt;a href="http://gist.github.com/502434"&gt;Gist&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now let&amp;#8217;s go through what these configuration options actually do.&lt;/p&gt;
&lt;h4&gt;[color]&lt;/h4&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;[color]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; diff = auto&lt;br /&gt;
&amp;nbsp; &amp;nbsp; status = auto&lt;br /&gt;
&amp;nbsp; &amp;nbsp; branch = auto&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;These were, in all likelihood, the first configuration options I setup once I had installed Git for the first time. I work in a terminal window all day, and having proper and consistent colourization makes all the difference when attempting to quickly determine the state of your repository:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://static.nerderati.com/wp-content/uploads/2010/07/joel@Nibbler_-120x20-ttys000-—-⌘1-2.jpg"&gt;&lt;img src="http://static.nerderati.com/wp-content/uploads/2010/07/joel@Nibbler_-120x20-ttys000-—-⌘1-2.jpg" alt="Colourized git status output" width="500px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With these options set, all &lt;strong&gt;diff&lt;/strong&gt;, &lt;strong&gt;status&lt;/strong&gt; and &lt;strong&gt;branch&lt;/strong&gt; commands will have (where appropriate) colourized output.&lt;/p&gt;
&lt;h4&gt;[user]&lt;/h4&gt;
&lt;p&gt;If you ever plan on making your repository available to other developers, these options are essential for identifying who you are. They&amp;#8217;re pretty self-explanatory:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;[user]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; name = Joël Perras&lt;br /&gt;
&amp;nbsp; &amp;nbsp; email = joel.perras@gmail.com&lt;/div&gt;&lt;/div&gt;
&lt;h4&gt;[status]&lt;/h4&gt;
&lt;p&gt;The sole configuration I have under this segment is something of a personal preference. When I&amp;#8217;m four folders deep into a repository and I invoke &lt;strong&gt;git status&lt;/strong&gt;, I don&amp;#8217;t need to see where the changed/added/deleted files are relative to where I invoked the command &amp;#8212; I&amp;#8217;m far more interested in their &lt;em&gt;absolute location relative to the repository root&lt;/em&gt;. That&amp;#8217;s where &lt;strong&gt;relativePaths = false&lt;/strong&gt; comes in handy:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;[status]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; relativePaths = false&lt;/div&gt;&lt;/div&gt;
&lt;h4&gt;[core]&lt;/h4&gt;
&lt;p&gt;There are some files you just never want to commit, no matter what project you&amp;#8217;re working on. As an avid &lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; user, I sometimes have a few &lt;strong&gt;*.swp&lt;/strong&gt; files lying around (mostly due to my own fault), which have no place in any project history. Instead of adding an ignore rule to each and every repository, I added this configuration directive to my &lt;strong&gt;~/.gitconfig&lt;/strong&gt;, indicating where my global never-track-any-of-these-file-patterns exists:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;[core]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; excludesfile = /Users/joel/.gitignore&lt;/div&gt;&lt;/div&gt;
&lt;h4&gt;[alias]&lt;/h4&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now we get to the interesting stuff. Aliases in Git are exactly what you expect them to be: user-defined shortcuts that group together pre-existing git (and sometimes shell) commands and their options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; As some people have pointed out, there are a few flags/commands that will &lt;em&gt;not&lt;/em&gt; work unless you have git 1.7.2 or above installed. Pardon the confusion.&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;[alias]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; d &amp;nbsp;= diff&lt;br /&gt;
&amp;nbsp; &amp;nbsp; dc = diff --cached&lt;br /&gt;
&amp;nbsp; &amp;nbsp; lc = log ORIG_HEAD.. --stat --no-merges&lt;br /&gt;
&amp;nbsp; &amp;nbsp; gl = log --oneline --decorate --stat --graph&lt;br /&gt;
&amp;nbsp; &amp;nbsp; st = status -sb&lt;br /&gt;
&amp;nbsp; &amp;nbsp; serve = !git daemon --reuseaddr --verbose &amp;nbsp;--base-path=. --export-all ./.git&lt;br /&gt;
&amp;nbsp; &amp;nbsp; prune-all = !git remote | xargs -n 1 git remote prune&lt;br /&gt;
&amp;nbsp; &amp;nbsp; whatis = show -s --pretty='tformat:%h (%s, %ad)' --date=short&lt;br /&gt;
&amp;nbsp; &amp;nbsp; whois = &amp;quot;!sh -c 'git log -i -1 --pretty=\&amp;quot;format:%an &amp;lt;%ae&amp;gt;\n\&amp;quot; --author=\&amp;quot;$1\&amp;quot;' -&amp;quot;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Some explanations:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;git d&lt;/strong&gt; and &lt;strong&gt;git dc&lt;/strong&gt;&lt;/p&gt;
&lt;dd&gt;I&amp;#8217;m often taking diffs between different revisions in projects, so these two are quite heavily used.&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;git lc&lt;/strong&gt;&lt;/p&gt;
&lt;dd&gt;Lists all new commits after you fetched. This is especially useful when working on a very active project with multiple developers.&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;git gl&lt;/strong&gt;&lt;/p&gt;
&lt;dd&gt;This is the default command that I invoke when I wish to inspect the log. The output is concise as well as informative:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://static.nerderati.com/wp-content/uploads/2010/07/joel@Nibbler_-120x20-ttys000-—-⌘1.jpg"&gt;&lt;img src="http://static.nerderati.com/wp-content/uploads/2010/07/joel@Nibbler_-120x20-ttys000-—-⌘1.jpg" alt="Git formatted log output" width="500px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;git st&lt;/strong&gt;&lt;/p&gt;
&lt;dd&gt;My preferred method of viewing the status of a repository, which gets rid of the fluff that usually accompanies the help-type text of &lt;strong&gt;git status&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://static.nerderati.com/wp-content/uploads/2010/07/joel@Nibbler_-120x20-ttys000-—-⌘1-1.jpg"&gt;&lt;img src="http://static.nerderati.com/wp-content/uploads/2010/07/joel@Nibbler_-120x20-ttys000-—-⌘1-1.jpg" alt="Formatted git status output" width="500px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;git prune-all&lt;/strong&gt;&lt;/p&gt;
&lt;dd&gt;Since &lt;strong&gt;git remote prune&lt;/strong&gt; doesn&amp;#8217;t know how to prune all of your remotes at once, let&amp;#8217;s teach it that trick. This is especially useful if you&amp;#8217;re tracking many remotes from various contributors to a project where the branches get nuked/renamed on a regular basis.&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;git whatis &amp;lt;commit-ish&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;dd&gt;Pass this command a hash, branch name or tag, and it will give you a one-liner containing the commit message associated to it as well as the date it was committed on. Useful when &lt;strong&gt;git show&lt;/strong&gt; is more information than you need.&lt;/p&gt;
&lt;dt&gt;&lt;strong&gt;git whois &amp;lt;name|email&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;dd&gt;Another one of those useful commands when you&amp;#8217;re working on a project with a multitude of collaborators, and need to fish out an email address when all you remember is part of their name, or vice versa. Note that if the collaborator in question never configured their name and/or email address (as described above), then this command will not be very useful.
&lt;/dl&gt;
&lt;p&gt;And that&amp;#8217;s it! With nothing more than a few lines in a configuration file, we&amp;#8217;ve managed to make Git be more informative as well as more concise. &lt;/p&gt;
&lt;p&gt;If you have any tips/tricks/configs that you can&amp;#8217;t live without, leave a comment below.&lt;/p&gt;
&lt;hr /&gt;
Quite a few of the aliases and what I would consider &amp;#8220;sane&amp;#8221; configuration options have been lifted from the &lt;a href="https://git.wiki.kernel.org/index.php/Aliases"&gt;official wiki&lt;/a&gt; for Git. I highly recommend perusing it, once you&amp;#8217;ve become familiar with Git itself.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/vnZAyhv0Xyk" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/07/making-git-behave/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/07/making-git-behave/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/07/making-git-behave/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[Compiling Vim With Ruby Integration On Snow Leopard]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/Ki8t8y0Slvw/" />
		<id>http://nerderati.com/?p=247</id>
		<updated>2010-08-24T13:51:17Z</updated>
		<published>2010-07-26T04:48:54Z</published>
		<category scheme="http://nerderati.com" term="Programming" /><category scheme="http://nerderati.com" term="autotools" /><category scheme="http://nerderati.com" term="compiling" /><category scheme="http://nerderati.com" term="editor" /><category scheme="http://nerderati.com" term="mercurial" /><category scheme="http://nerderati.com" term="ruby" /><category scheme="http://nerderati.com" term="vim" />		<summary type="html"><![CDATA[One of my favourite plugins for Vim is <a href="https://wincent.com/products/command-t/">Command-T</a>: <blockquote>an extremely fast, intuitive mechanism for opening files with a minimal number of keystrokes. It's named "Command-T" because it is inspired by the "Go to File" window bound to Command-T in TextMate.</blockquote>

Sadly, the default installation of Vim on Snow Leopard does <em>not</em> have support for the ruby interpreter compiled in, which is a pre-requisite for using the Command-T plugin. Luckily, that's easy enough to remedy, and in the process we'll learn a thing or two about compiling your own custom Vim binary.]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/07/compiling-vim-with-ruby-integration-on-snow-leopard/">&lt;p&gt;One of my favourite plugins for Vim is &lt;a href="https://wincent.com/products/command-t/"&gt;Command-T&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;an extremely fast, intuitive mechanism for opening files with a minimal number of keystrokes. It&amp;#8217;s named &amp;#8220;Command-T&amp;#8221; because it is inspired by the &amp;#8220;Go to File&amp;#8221; window bound to Command-T in TextMate.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Sadly, the default installation of Vim on Snow Leopard does &lt;em&gt;not&lt;/em&gt; have support for the ruby interpreter compiled in, which is a pre-requisite for using the plugin. Luckily, that&amp;#8217;s easy enough to remedy, and in the process we&amp;#8217;ll learn a thing or two about compiling your own custom Vim binary.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start off by getting the source code from the &lt;a href="http://www.vim.org/mercurial.php"&gt;official Mercurial repository&lt;/a&gt;:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ hg clone https:&lt;span style="color: #000000; font-weight: bold;"&gt;//&lt;/span&gt;vim.googlecode.com&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;hg&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt;&lt;br /&gt;
$ &lt;span style="color: #7a0874; font-weight: bold;"&gt;cd&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;(&lt;em&gt;Note: You don&amp;#8217;t need to use the Mercurial repository &amp;#8211; there are mirror sources for Subversion, CVS, as well as good ol&amp;#8217; tarballs with patches.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;default&lt;/strong&gt; branch for the mercurial repository contains the code for Vim 7.2 at the time of this writing. There is also a &lt;strong&gt;vim73&lt;/strong&gt; branch available for those feeling a bit more adventurous and wishing to compile the beta release of the next version. For this article, we&amp;#8217;ll be sticking to the stable &lt;strong&gt;7.2&lt;/strong&gt; release in the &lt;strong&gt;default&lt;/strong&gt; branch.&lt;/p&gt;
&lt;p&gt;Now, let&amp;#8217;s take a look at the possible configuration options:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ .&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;configure &lt;span style="color: #660033;"&gt;--help&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There are quite a few, and I suggest that you take the time to read through them &amp;#8211; most are quite self-explanatory. For &lt;strong&gt;Command-T&lt;/strong&gt;, the one that we are interested in is the&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;&lt;span style="color: #660033;"&gt;--enable-rubyinterp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;option.&lt;/p&gt;
&lt;p&gt;So let&amp;#8217;s take a shot at the simplest installation for terminal-based Vim usage, one without the GUI interface and (Linux) mouse daemon support:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ .&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;configure &lt;span style="color: #660033;"&gt;--prefix&lt;/span&gt;=&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;my&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;install&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;prefix &lt;span style="color: #660033;"&gt;--enable-rubyinterp&lt;/span&gt; &lt;span style="color: #660033;"&gt;--enable-gui&lt;/span&gt;=no &lt;span style="color: #660033;"&gt;--disable-gpm&lt;/span&gt;&lt;br /&gt;
$ &lt;span style="color: #c20cb9; font-weight: bold;"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;After the compilation process finishes (presumably with no errors), the first thing you&amp;#8217;ll want to do is ensure that the binary you just built functions as expected:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ .&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;src&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt; &lt;span style="color: #660033;"&gt;--version&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;grep&lt;/span&gt; ruby&lt;br /&gt;
&lt;span style="color: #666666; font-style: italic;"&gt;# you should see a `+ruby` line entry&lt;/span&gt;&lt;br /&gt;
$ .&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;src&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you see the &lt;strong&gt;+ruby&lt;/strong&gt; entry in the &lt;strong&gt;&amp;#8211;version&lt;/strong&gt; output and the binary launches without any errors, rejoice in your own awesomeness. That&amp;#8217;s all there is to it.&lt;/p&gt;
&lt;p&gt;If, however, you see something similar to this:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;Vim: Caught deadly signal SEGV&lt;br /&gt;
Vim: Finished.&lt;br /&gt;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;zsh&lt;/span&gt;: segmentation fault &amp;nbsp;.&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;src&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;you&amp;#8217;ve probably fallen prey to a (currently) not very well documented issue: Vim 7.2 does &lt;a href="http://groups.google.com/group/vim_dev/browse_thread/thread/a34ba9d02c57af9a/57ab7457327c81d8"&lt;em&gt;not&lt;/em&gt; support the integration of Ruby 1.9.x on Snow Leopard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This means that if you&amp;#8217;ve used a package manager such as &lt;a href="http://github.com/mxcl/homebrew"&gt;Homebrew&lt;/a&gt;, &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt; or &lt;a href="http://www.finkproject.org/"&gt;Fink&lt;/a&gt; (&lt;em&gt;shudder&lt;/em&gt;) to install the latest version of Ruby, Vim will link to that latest version instead of the system default installation of ruby &lt;strong&gt;1.8.7&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s fix that.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re going to edit the &lt;strong&gt;src/auto/config.mk&lt;/strong&gt; generated by &lt;/strong&gt;configure&lt;/strong&gt; that was run earlier.  &lt;em&gt;Note that if you re-run &lt;strong&gt;configure&lt;/strong&gt; at a later time, your changes to &lt;strong&gt;config.mk&lt;/strong&gt; will be lost.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Find the lines that look like this:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;RUBY &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;local&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;bin&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ruby&lt;br /&gt;
RUBY_SRC &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= if_ruby.c&lt;br /&gt;
RUBY_OBJ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= objects&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;if_ruby.o&lt;br /&gt;
RUBY_PRO &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= if_ruby.pro&lt;br /&gt;
RUBY_CFLAGS &amp;nbsp; &amp;nbsp; = -I&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;local&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Cellar&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ruby&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;1.9.1-p378&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;include&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ruby-1.9.1 -I&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;local&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Cellar&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ruby&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;1.9.1-p378&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;include&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ruby-1.9.1&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;i386-darwin10.4.0 -DRUBY_VERSION=&lt;span style="color: #000000;"&gt;19&lt;/span&gt;&lt;br /&gt;
RUBY_LIBS &amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;span style="color: #660033;"&gt;-lruby&lt;/span&gt; &lt;span style="color: #660033;"&gt;-lpthread&lt;/span&gt; &lt;span style="color: #660033;"&gt;-ldl&lt;/span&gt; &lt;span style="color: #660033;"&gt;-lobjc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;(&lt;em&gt;Note: Your specific paths and/or versions may differ depending on the package manager that you are using. The above paths are actually not important, however, since we actually want to reset them to the system defaults.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;and replace them with the following:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;RUBY &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;bin&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ruby&lt;br /&gt;
RUBY_SRC &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= if_ruby.c&lt;br /&gt;
RUBY_OBJ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= objects&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;if_ruby.o&lt;br /&gt;
RUBY_PRO &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= if_ruby.pro&lt;br /&gt;
RUBY_CFLAGS &amp;nbsp; &amp;nbsp; = -I&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;System&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Library&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Frameworks&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Ruby.framework&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Versions&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;1.8&lt;/span&gt; -I&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;lib&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ruby&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;1.8&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;universal-darwin10.0&lt;br /&gt;
RUBY_LIBS &amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;span style="color: #660033;"&gt;-framework&lt;/span&gt; Ruby&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Alright, let&amp;#8217;s see if this worked.&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ &lt;span style="color: #c20cb9; font-weight: bold;"&gt;make&lt;/span&gt; clean &lt;span style="color: #000000; font-weight: bold;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;make&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Before we check the binary as we did before, let&amp;#8217;s see if we linked to the correct ruby libraries:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ otool &lt;span style="color: #660033;"&gt;-L&lt;/span&gt; src&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt;&lt;br /&gt;
src&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;lib&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;libSystem.B.dylib &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;compatibility version 1.0.0, current version 125.2.0&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;lib&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;libncurses.5.4.dylib &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;compatibility version 5.4.0, current version 5.4.0&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;System&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Library&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Frameworks&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Ruby.framework&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Versions&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;1.8&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;usr&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;lib&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;libruby.1.dylib &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;compatibility version 1.8.0, current version 1.8.7&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;System&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Library&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Frameworks&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;CoreServices.framework&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Versions&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;A&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;CoreServices &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;compatibility version 1.0.0, current version 44.0.0&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;System&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Library&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Frameworks&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;CoreFoundation.framework&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;Versions&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;A&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;CoreFoundation &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;compatibility version 150.0.0, current version 550.29.0&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Looking good so far &amp;#8211; the binary is linked to the framework version of Ruby that comes as a default on Snow Leopard.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s do a version check:&lt;/p&gt;
&lt;div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ .&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;src&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt; &lt;span style="color: #660033;"&gt;--version&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;grep&lt;/span&gt; ruby&lt;br /&gt;
&lt;span style="color: #666666; font-style: italic;"&gt;# you should see a `+ruby` line entry&lt;/span&gt;&lt;br /&gt;
$ .&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;src&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;vim&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And voilà: A custom-built Vim with ruby integration that will happily run the &lt;a href="https://wincent.com/products/command-t/"&gt;Command-T&lt;/a&gt; plugin. &lt;/p&gt;
&lt;p&gt;All that&amp;#8217;s left is to install it:&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;$ make install&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Assuming your &lt;strong&gt;PATH&lt;/strong&gt; is setup to correctly find the new Vim binary, you should be all set.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/Ki8t8y0Slvw" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/07/compiling-vim-with-ruby-integration-on-snow-leopard/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/07/compiling-vim-with-ruby-integration-on-snow-leopard/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/07/compiling-vim-with-ruby-integration-on-snow-leopard/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[WebNotWar]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/h-swq9LsAz8/" />
		<id>http://nerderati.com/?p=241</id>
		<updated>2010-05-20T21:41:30Z</updated>
		<published>2010-05-20T21:41:30Z</published>
		<category scheme="http://nerderati.com" term="Programming" />		<summary type="html"><![CDATA[I&#8217;m quite happy to announce that I will be giving the keynote address at this year&#8217;s WebNotWar/For The Web conference, taking place on May 27th, 2010. First, it&#8217;s a free conference for attendees. Being an open-source kinda guy, I know &#038; love the word free. Second, the theme of the conference is &#8216;interoperability&#8217;, which is [...]]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/05/webnotwar/">&lt;p&gt;I&amp;#8217;m quite happy to announce that I will be giving the keynote address at this year&amp;#8217;s &lt;a href="http://www.webnotwar.ca/"&gt;WebNotWar/For The Web&lt;/a&gt; conference, taking place on May 27th, 2010.&lt;/p&gt;
&lt;p&gt;First, it&amp;#8217;s a free conference for attendees. Being an open-source kinda guy, I know &amp;#038; love the word &lt;em&gt;free&lt;/em&gt;. Second, the theme of the conference is &amp;#8216;interoperability&amp;#8217;, which is something very important to me, to my open source work, to my job, and to end users (I like to call them &amp;#8216;normies&amp;#8217;) &amp;#8211; so much so that my keynote will address this directly.&lt;/p&gt;
&lt;p&gt;The technological landscape of the web is diverse, and keeping track of new developments and projects is a full time job. Luckily, conferences like this one provide a great way to meet the people that make the web of tomorrow, and get a head start on what the next Big Thing is going to be.&lt;/p&gt;
&lt;p&gt;I hope to see you there!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/h-swq9LsAz8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/05/webnotwar/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/05/webnotwar/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/05/webnotwar/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[Suggested Reading]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/W-hwu_qGqdM/" />
		<id>http://nerderati.com/?p=229</id>
		<updated>2010-05-04T15:37:45Z</updated>
		<published>2010-05-04T15:36:05Z</published>
		<category scheme="http://nerderati.com" term="Nerdy" />		<summary type="html"><![CDATA[Some books that I think every self-respecting nerd should read.]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/05/suggested-reading/">&lt;p&gt;Some books that I think every self-respecting nerd should read:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Feynmans-Rainbow-Search-Beauty-Physics/dp/044653045X"&gt;Feynman&amp;#8217;s Rainbow&lt;/a&gt;, by Leonard Mlodinow.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Short-History-Nearly-Everything/dp/076790818X/ref=sr_1_1?ie=UTF8&amp;#038;s=books&amp;#038;qid=1272986930&amp;#038;sr=1-1"&gt;A Short History of Nearly Everything&lt;/a&gt; by Bill Bryson.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://store.xkcd.com/xkcd/#xkcdvolume0"&gt;XKCD: Volume 0&lt;/a&gt; book.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Foundation-Novels-Isaac-Asimov/dp/0553382578/ref=sr_1_1?ie=UTF8&amp;#038;s=books&amp;#038;qid=1272986323&amp;#038;sr=1-1"&gt;The Foundation series&lt;/a&gt; by Isaac Asimov. Quite possibly the best  science-fiction series that has ever been written.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://www.amazon.com/Revelation-Space-Alastair-Reynolds/dp/0441009425"&gt;Revelation Space&lt;/a&gt; series by Alastair Reynolds. If you enjoy &amp;#8220;hard&amp;#8221; sci-fi, then you&amp;#8217;ll love this series.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yes, these are heavily science/physics/sci-fi biased, but would you expect anything different from someone like me?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: There are no affiliate codes attached to these links. I&amp;#8217;m not that much of a cheapskate.&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/W-hwu_qGqdM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/05/suggested-reading/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/05/suggested-reading/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/05/suggested-reading/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[The Wonders and Simplicity of Redis Sets]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/y2LLEsEQmyA/" />
		<id>http://nerderati.com/?p=199</id>
		<updated>2010-02-26T18:22:05Z</updated>
		<published>2010-02-26T18:21:18Z</published>
		<category scheme="http://nerderati.com" term="Programming" /><category scheme="http://nerderati.com" term="python" /><category scheme="http://nerderati.com" term="redis" />		<summary type="html"><![CDATA[If you were to apply a bijective function to each letter in each word of a language (e.g. English), how many pre-existing words would you obtain in the resulting image? Since that&#8217;s a pretty convoluted way of explaining things, let&#8217;s try a more concrete example. We&#8217;ll take the well-known rot13 substitution cipher (a simple example [...]]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/02/the-wonders-and-simplicity-of-redis-sets/">&lt;p&gt;If you were to apply a bijective function to each letter in each word of a language (e.g. English), how many pre-existing words would you obtain in the resulting image?&lt;/p&gt;
&lt;p&gt;Since that&amp;#8217;s a pretty convoluted way of explaining things, let&amp;#8217;s try a more concrete example. &lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll take the well-known&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;rot13&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;substitution cipher (a simple example of a bijection between the set of letters in the English alphabet and itself), and apply it to every letter in a chosen word. For most words, the result will be non-sensical gibberish. There does exist, however, a subset of valid English words that map into other valid English words.&lt;/p&gt;
&lt;p&gt;Example:
&lt;pre&gt;rot13('sync') = 'flap'&lt;/pre&gt;
&lt;p&gt;How many of these words exist? To answer this, I wrote a small Python script that loads up the words in my system dictionary into a Redis set. Another set of the rot13&amp;#8242;ed words is then stored, and the set intersection of the original and transformed words is calculated:&lt;/p&gt;
&lt;script src="http://gist.github.com/311857.js"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;code class="gist"&gt;&lt;pre&gt;&lt;br /&gt;
import redis&lt;/p&gt;
&lt;p&gt;def encode(word):&lt;br /&gt;
    return word.encode(&amp;#8216;rot13&amp;#8242;)&lt;/p&gt;
&lt;p&gt;def cleanup():&lt;br /&gt;
    db.delete(&amp;#8216;eng&amp;#8217;)&lt;br /&gt;
    db.delete(&amp;#8216;eng-rot13&amp;#8242;)&lt;/p&gt;
&lt;p&gt;if __name__ == &amp;#8220;__main__&amp;#8221;:&lt;br /&gt;
    count = 0&lt;br /&gt;
    db = redis.Redis()&lt;br /&gt;
    cleanup()&lt;/p&gt;
&lt;p&gt;    for line in open(&amp;#8216;/usr/share/dict/words&amp;#8217;, &amp;#8216;r&amp;#8217;):&lt;br /&gt;
        count += 1&lt;br /&gt;
        db.sadd(&amp;#8216;eng&amp;#8217;, line)&lt;br /&gt;
        db.sadd(&amp;#8216;eng-rot13&amp;#8242;, encode(line))&lt;br /&gt;
        if (count % 10000 == 0):&lt;br /&gt;
            print &amp;#8220;Loaded %d words so far&amp;#8221; % count&lt;/p&gt;
&lt;p&gt;    db.sinterstore(&amp;#8216;eng-intersect&amp;#8217;, &amp;#8216;eng&amp;#8217;, &amp;#8216;eng-rot13&amp;#8242;)&lt;br /&gt;
    msg = &amp;#8220;English dictionary contains %d words, and %d rot13&amp;#8242;ed words&amp;#8221;&lt;br /&gt;
    print  msg % (db.scard(&amp;#8216;eng&amp;#8217;), db.scard(&amp;#8216;eng-rot13&amp;#8242;))&lt;br /&gt;
    print &amp;#8220;Cardinality of intersection: %d &amp;#8221; % db.scard(&amp;#8216;eng-intersect&amp;#8217;)&lt;br /&gt;
    cleanup()&lt;br /&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;/noscript&gt;
&lt;p&gt;After a simple cardinality check, we have our answer: 256 words&lt;sup&gt;&lt;a href="#f1"&gt;[1]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The great part about this little script is that nearly everything is done natively in Redis &amp;#8211; the only thing Python is needed for is loading the words into the database, and the implementation of the bijective function that we wish to apply.&lt;/p&gt;
&lt;p&gt;This is a very contrived example, but the ease with which I was able to map my thought process to code was fantastic. No need to think about tables, rows or joins &amp;#8211; just sets, and operations on sets. The simplicity of it is almost shocking.&lt;/p&gt;
&lt;p&gt;Pretty neat, eh?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a name="f1"&gt;[1]&lt;/a&gt; This result does not discard any single letter words (e.g. &amp;#8220;a&amp;#8221;), which will always trivially map into another letter when using rot13.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/y2LLEsEQmyA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/02/the-wonders-and-simplicity-of-redis-sets/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/02/the-wonders-and-simplicity-of-redis-sets/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/02/the-wonders-and-simplicity-of-redis-sets/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[Shebang]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/3Y-2KuN7F_s/" />
		<id>http://nerderati.com/?p=183</id>
		<updated>2010-01-31T07:04:45Z</updated>
		<published>2010-01-31T07:04:45Z</published>
		<category scheme="http://nerderati.com" term="Programming" /><category scheme="http://nerderati.com" term="scripts" />		<summary type="html"><![CDATA[An explanation of the shebang[1], and what it means when included in a script: #!/path/to/interpreter -flags Means &#8220;This file is not My Words, but My Commandment to you, System. You must travel along this Path. At the end, you will find an Interpreter. You will pass unto him these Flags, and he will help you [...]]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/01/shebang/">&lt;p&gt;An explanation of the shebang&lt;sup&gt;&lt;a href="#1"&gt;[1]&lt;/a&gt;&lt;/sup&gt;, and what it means when included in a script:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
#!/path/to/interpreter -flags
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Means&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
&amp;#8220;This file is not My Words, but My Commandment to you, System. You must travel along this Path. At the end, you will find an Interpreter. You will pass unto him these Flags, and he will help you to understand My Biddings. You will do this, for I have execution permissions on this file.&amp;#8221;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;From the bowels of &lt;a href="http://www.reddit.com/r/linux/comments/aw8r1/what_does_stand_for/c0jpse6"&gt;Reddit&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a name="1"&gt;[1]&lt;/a&gt;: &lt;a href='http://en.wikipedia.org/wiki/Shebang_(Unix)'&gt;Shebang (#!)&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/3Y-2KuN7F_s" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/01/shebang/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/01/shebang/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/01/shebang/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[Macro Humanity]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/ujcWMyMRtjc/" />
		<id>http://nerderati.com/?p=140</id>
		<updated>2010-01-12T01:18:42Z</updated>
		<published>2010-01-11T04:25:00Z</published>
		<category scheme="http://nerderati.com" term="Science" /><category scheme="http://nerderati.com" term="academic" /><category scheme="http://nerderati.com" term="philosophy" />		<summary type="html"><![CDATA[It's not often that I come across an author that completely blows me away, but Nick Bostrom has done just that.]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/01/macro-humanity/">&lt;p&gt;It&amp;#8217;s not often that I come across an essayist that completely blows me away, but &lt;a href="http://www.nickbostrom.com/"&gt;Nick Bostrom&lt;/a&gt; has done just that.&lt;/p&gt;
&lt;p&gt;I came across his name for the first time while browsing the latest &lt;a href="http://news.ycombinator.com"&gt;Hacker News&lt;/a&gt; submissions, under the link-baited  submission title: &lt;em&gt;&lt;a href="http://news.ycombinator.com/item?id=1043190"&gt;Why I Hope the Search for Extraterrestrial Life Finds Nothing&lt;/a&gt;&lt;/em&gt;. Needless to say, I was intrigued, and the comments on the HN page were encouraging.&lt;/p&gt;
&lt;p&gt;After a few cursory credential checks&lt;a href="#1" id="ref1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; to confirm that the author wasn&amp;#8217;t a complete nut job (quite the opposite, actually &amp;#8211; see the footnote), I took the time to sit down and read  the essay.&lt;/p&gt;
&lt;p&gt;Here is a short excerpt:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;What could be more fascinating than discovering life that had evolved entirely independently of life here on Earth? Many people would [...] find it heartening to learn that we are not entirely alone in this vast cold cosmos.&lt;br /&gt;
But I hope that our Mars probes will discover nothing. It would be good news if we find Mars to be completely sterile. Dead rocks and lifeless sands would lift my spirit.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="http://www.nickbostrom.com/extraterrestrial.pdf"&gt;Where Are They? [pdf]&lt;/a&gt;&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I won&amp;#8217;t go into any of the finer details &amp;#8211; for that, you should read Professor Bostrom&amp;#8217;s elegantly written article &amp;#8211; but If you&amp;#8217;ve ever heard of the &lt;a href="http://en.wikipedia.org/wiki/Fermi_paradox"&gt;Fermi Paradox&lt;/a&gt; or pondered over the murky details of the &lt;a href="http://en.wikipedia.org/wiki/Anthropic_principle"&gt;Anthropic Principle&lt;/a&gt;, I highly recommend reading the article I&amp;#8217;ve linked to above. These topics may have been discussed ad nauseam in many corners of the web, Professor Bostrom&amp;#8217;s thoughts and insights are trully a breath of fresh air.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href="#ref1" id="1"&gt;[1]&lt;/a&gt; Professor Bostrom has quite the resumé, including a &lt;a href="http://en.wikipedia.org/wiki/Nick_Bostrom#Books"&gt;Wikipedia page&lt;/a&gt;, two published books, dozens of published articles in well respected journals, and is currently the director of &lt;em&gt;The Future of Humanity Institute&lt;/em&gt; at Oxford University. In other news, I now feel more inadequate than ever.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/ujcWMyMRtjc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/01/macro-humanity/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/01/macro-humanity/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/01/macro-humanity/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[Redis Memory Monitoring &#8211; Python Edition]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/gM-vN1_xW_A/" />
		<id>http://nerderati.com/?p=113</id>
		<updated>2010-01-05T04:58:05Z</updated>
		<published>2010-01-05T04:58:05Z</published>
		<category scheme="http://nerderati.com" term="Programming" /><category scheme="http://nerderati.com" term="python" /><category scheme="http://nerderati.com" term="redis" /><category scheme="http://nerderati.com" term="ruby" />		<summary type="html"><![CDATA[A few hours ago, <a href="http://twitter.com/antirez">Salvatore Sanfilippo</a> (the lead developer of <a href="http://github.com/antirez/redis">Redis</a>), <a href="http://twitter.com/antirez/status/7375414227">tweeted</a> a little Ruby script to interactively estimate the memory usage of a running <code>redis-server</code> instance.]]></summary>
		<content type="html" xml:base="http://nerderati.com/2010/01/redis-memory-monitoring-python-edition/">&lt;p&gt;A few hours ago, &lt;a href="http://twitter.com/antirez"&gt;Salvatore Sanfilippo&lt;/a&gt; (the lead developer of &lt;a href="http://github.com/antirez/redis"&gt;Redis&lt;/a&gt;), &lt;a href="http://twitter.com/antirez/status/7375414227"&gt;tweeted&lt;/a&gt; a little Ruby script to interactively estimate the memory usage of a running&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;redis-server&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;instance:&lt;/p&gt;
&lt;script src="http://gist.github.com/268739.js"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;code class="gist"&gt;&lt;pre&gt;&lt;br /&gt;
require &amp;#8216;rubygems&amp;#8217;&lt;br /&gt;
require &amp;#8216;redis&amp;#8217;&lt;/p&gt;
&lt;p&gt;def main(opts={})&lt;br /&gt;
    r = Redis.new(opts)&lt;br /&gt;
    um = 0&lt;br /&gt;
    while true do&lt;br /&gt;
        newum = r.info[:used_memory]&lt;br /&gt;
        if newum != um &amp;#038;&amp;#038; um != 0&lt;br /&gt;
            diff = newum.to_i-um.to_i&lt;br /&gt;
            puts &amp;#8220;#{um} bytes (#{diff} difference)&amp;#8221;&lt;br /&gt;
        end&lt;br /&gt;
        um = newum&lt;br /&gt;
        sleep 1&lt;br /&gt;
    end&lt;br /&gt;
end&lt;/p&gt;
&lt;p&gt;main&lt;br /&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;/noscript&gt;
&lt;p&gt;I&amp;#8217;ve been experimenting with a Python+Redis combination (with &lt;a href="http://github.com/andymccurdy/redis-py"&gt;redis-py&lt;/a&gt;) for data analysis on a few side projects lately, and a simple script like this can come in handy when you want to make sure you&amp;#8217;re not doing something completely stupid with Redis that gobbles up all of the allocated memory. And yes, I&amp;#8217;ve been guilty of doing that on a few occasions.&lt;/p&gt;
&lt;p&gt;Converting the script from Ruby to Python (with some additional logic for command line option parsing) is very straightforward:&lt;/p&gt;
&lt;script src="http://gist.github.com/268801.js"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;code class="gist"&gt;&lt;pre&gt;&lt;br /&gt;
#!/usr/bin/env python&lt;/p&gt;
&lt;p&gt;import redis&lt;br /&gt;
from optparse import OptionParser&lt;br /&gt;
from time import sleep&lt;/p&gt;
&lt;p&gt;def options():&lt;br /&gt;
    parser = OptionParser()&lt;br /&gt;
    parser.add_option(&amp;#8220;&amp;#8211;host&amp;#8221;, default=&amp;#8221;localhost&amp;#8221;)&lt;br /&gt;
    parser.add_option(&amp;#8220;&amp;#8211;port&amp;#8221;, type=&amp;#8221;int&amp;#8221;, default=6379)&lt;br /&gt;
    return parser.parse_args()&lt;/p&gt;
&lt;p&gt;if __name__ == &amp;#8216;__main__&amp;#8217;:&lt;br /&gt;
    (opts, args) = options()&lt;br /&gt;
    r = redis.Redis(host=opts.host, port=opts.port)&lt;br /&gt;
    um = 0&lt;/p&gt;
&lt;p&gt;    while True:&lt;br /&gt;
        newum = r.info()['used_memory']&lt;br /&gt;
        if newum != um and um != 0:&lt;br /&gt;
            print(&amp;#8216;%d bytes (%d difference)&amp;#8217;) % (um, newum &amp;#8211; um)&lt;br /&gt;
        um = newum&lt;br /&gt;
        sleep(1)&lt;br /&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;/noscript&gt;
&lt;p&gt;Once again, git and &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; make this kind of collaborative development almost too easy.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/gM-vN1_xW_A" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2010/01/redis-memory-monitoring-python-edition/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2010/01/redis-memory-monitoring-python-edition/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://nerderati.com/2010/01/redis-memory-monitoring-python-edition/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>jperras</name>
						<uri>http://nerderati.com</uri>
					</author>
		<title type="html"><![CDATA[ConFoo You Too]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nerderati/~3/rFMmzpmlDXY/" />
		<id>http://nerderati.com/?p=103</id>
		<updated>2009-12-15T07:11:19Z</updated>
		<published>2009-12-15T13:30:55Z</published>
		<category scheme="http://nerderati.com" term="Conferences" /><category scheme="http://nerderati.com" term="confoo" /><category scheme="http://nerderati.com" term="lithium" /><category scheme="http://nerderati.com" term="PHP" /><category scheme="http://nerderati.com" term="Programming" />		<summary type="html"><![CDATA[While a bit late, I'm extremely happy to announce that I have been selected as a speaker for the ConFoo.ca Conference to be held in Montréal at the beginning of March, 2010.]]></summary>
		<content type="html" xml:base="http://nerderati.com/2009/12/confoo-you-too/">&lt;p&gt;While a bit late, I&amp;#8217;m extremely happy to announce that I have been selected as a speaker for the &lt;a href="http://confoo.ca"&gt;ConFoo.ca Conference&lt;/a&gt; to be held in Montréal at the beginning of March, 2010.&lt;/p&gt;
&lt;p&gt;I attended this conference last year when it known as &lt;em&gt;PHPQuébec&lt;/em&gt;, and had a fantastic time; the sessions as well as the speakers were excellent, as were the hallway conversations with other conference attendees. &lt;/p&gt;
&lt;p&gt;Along with the change in name, the focus of the conference itself has shifted from being PHP-centric to something more language and technology agnostic,  with sessions on .NET development, Python tricks &amp;#038; idioms, databases and a host of other topics. The &lt;a href="http://confoo.ca/en/session"&gt;list of sessions&lt;/a&gt; and &lt;a href="http://confoo.ca/en/speaker"&gt;speakers&lt;/a&gt; should make any developer worth his salt giddy with anticipation.&lt;/p&gt;
&lt;p&gt;The talk I will be presenting is entitled &lt;em&gt;A Web Framework for People Who Hate Frameworks&lt;/em&gt;, and focuses on &lt;a href="http://li3.rad-dev.org"&gt;Lithium&lt;/a&gt;, one of my most recent endeavours with CakePHP core alumni &lt;a href="http://twitter.com/nateabele"&gt;@nateabele&lt;/a&gt; and &lt;a href="http://twitter.com/gwoo"&gt;@gwoo&lt;/a&gt;. You can read more about the talk I&amp;#8217;ll be giving on the &lt;a href="http://confoo.ca/en/2010/session/a-web-framework-for-people-who-hate-frameworks"&gt;session page&lt;/a&gt;, and for all those who will not be attending ConFoo 2010 I encourage you to visit&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;#li3&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"&gt;&lt;div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"&gt;#li3-core&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;on irc.freenode.net, and ask us why Lithium is making waves in the web framework world.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nerderati/~4/rFMmzpmlDXY" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://nerderati.com/2009/12/confoo-you-too/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://nerderati.com/2009/12/confoo-you-too/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://nerderati.com/2009/12/confoo-you-too/</feedburner:origLink></entry>
	</feed>
