<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Mat Trudel</title>
 <link href="http://longbeard.org/atom.xml" rel="self"/>
 <link href="http://longbeard.org/"/>
 <updated>2012-04-11T14:40:04-07:00</updated>
 <id>http://longbeard.org/</id>
 <author>
   <name>Mat Trudel</name>
   <email>mat@geeky.net</email>
 </author>

 
 <entry>
   <title>Smart Keywords are Smart</title>
   <link href="http://longbeard.org/2011/08/07/Introducing-Smart-Keywords.html"/>
   <updated>2011-08-07T00:00:00-07:00</updated>
   <id>http://longbeard.org/2011/08/07/Introducing-Smart-Keywords</id>
   <content type="html">&lt;h1&gt;Smart Keywords are Smart&lt;/h1&gt;

&lt;p&gt;Safari is a great browser, but has always had one feature missing that's present in every other modern browser: &lt;a href=&quot;http://support.mozilla.com/en-US/kb/Smart%20keywords&quot;&gt;Smart Keywords&lt;/a&gt;. Previously I've used tools such as &lt;a href=&quot;http://www.kitzkikz.com/Sogudi&quot;&gt;Sogudi&lt;/a&gt; or &lt;a href=&quot;http://alexstaubo.github.com/keywurl/&quot;&gt;Keywurl&lt;/a&gt; to provide that functionality within Safari, but they were both implemented via a fragile (if awesome) &lt;a href=&quot;http://www.culater.net/software/SIMBL/SIMBL.php&quot;&gt;hack&lt;/a&gt;, and as a consequence I always pointed fingers at them whenever Safari started losing its shit in the past. Happily, with the arrival of Safari 5.1, Apple has added the requisite &lt;a href=&quot;http://developer.apple.com/technologies/safari/whats-new.html&quot;&gt;event hooks&lt;/a&gt; to the extension API to enable Smart Keyword functionality as a first class extension citizen.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mtrudel/Smart-Keywords&quot;&gt;Smart Keywords&lt;/a&gt; is my implementation of Smart Keywords for Safari, using these new APIs. It's super simple (28 lines of Javascript, the majority of which is code to read &amp;amp; write configuration data), easily configurable, and &amp;ndash; owing to its simplicity &amp;ndash; should be crashproof.&lt;/p&gt;

&lt;p&gt;To install Smart Keywords, download the &lt;a href=&quot;https://github.com/downloads/mtrudel/Smart-Keywords/SmartKeywords.safariextz&quot;&gt;extension&lt;/a&gt; and double click on it to install. Configuration is straightforward, and is done in the extension tab of Safari's preferences. Due to the way in which extension configurations are defined, you can define a maximum of ten keywords (this is a soft limit. If you want more, either ask me, or else &lt;a href=&quot;https://github.com/mtrudel/Smart-Keywords/&quot;&gt;fork the project&lt;/a&gt; and add them yourself).&lt;/p&gt;

&lt;p&gt;To customize a keyword, enter in the keyword you want to match (say, for example 'wiki' to match searches of the form 'wiki bananarama'). When you enter this keyword in the address bar, it will be replaced with the contents of the matching URL instead, with the remainder of your query being substituted in for &lt;code&gt;%s&lt;/code&gt; in the URL. As an example, if you have the keyword 'foo' defined with a URL of &lt;code&gt;http://example.com/search?query=%s&lt;/code&gt;, then entering 'foo bananarama' will take you to the URL &lt;code&gt;http://example.com/search?query=bananarama&lt;/code&gt;. Note that spaces in your entered URL are automatically URL escaped to &lt;code&gt;%20&lt;/code&gt;, which is usually what you want.&lt;/p&gt;

&lt;p&gt;Comments / feedback are welcome. If you find any bugs or missing features, please &lt;a href=&quot;https://github.com/mtrudel/Smart-Keywords/issues&quot;&gt;let me know&lt;/a&gt;!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>This is how we do it</title>
   <link href="http://longbeard.org/2011/02/05/Montell-Jordan-Has-Nuthin-On-Me.html"/>
   <updated>2011-02-05T00:00:00-08:00</updated>
   <id>http://longbeard.org/2011/02/05/Montell-Jordan-Has-Nuthin-On-Me</id>
   <content type="html">&lt;h1&gt;This is how we do it&lt;/h1&gt;

&lt;p&gt;As &lt;a href=&quot;http://news.ycombinator.com/item?id=2183540&quot;&gt;promised&lt;/a&gt;, a howto on setting up SSH agent forwarding, and the proper use of proxy commands to punch through bastion (aka gateway) hosts.&lt;/p&gt;

&lt;h2&gt;Agent Forwarding&lt;/h2&gt;

&lt;p&gt;The theory is described &lt;a href=&quot;http://unixwiz.net/techtips/ssh-agent-forwarding.html&quot;&gt;here&lt;/a&gt;, but here's a distilled version of how to get SSH Agent forwarding working:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If you don't already have one, create your SSH key pair via:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ssh-keygen -t rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt; Ensure that you put a passphrase on this (it can be as strong as you want, since you'll only ever have to type it in once).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push the public key component to the remote server you want to connect to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; cat ~/.ssh/id_rsa.pub | ssh user@remote &quot;cat &amp;gt;&amp;gt; .ssh/authorized_keys&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt; Many OS's (not OS X, sadly) include an &lt;code&gt;ssh-copy-id user@remote&lt;/code&gt; command that automates this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect to the remote machine using your new key:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ssh user@remote
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt; If you're on OS X or a reasonably friendly Linux box, you should get a native OS dialog asking you for the passphrase you just put on your private key. Enter it, and you should be golden. If you're on another OS that doesn't provide an automated agent, you probably want to look at &lt;a href=&quot;http://help.github.com/working-with-key-passphrases/&quot;&gt;this&lt;/a&gt; for more info.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note that you can now make onward connections from the remote machine without being prompted to authenticate again. Magic!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Proxying connections through a bastion host&lt;/h2&gt;

&lt;p&gt;This is crazy useful for maintaining a cluster of machines without having to expose their SSH servers to the internet. All you need to keep open is ssh on your bastion host and you have access to anything on the internal machines nearly automatically. Here goes:&lt;/p&gt;

&lt;p&gt;Let's say you have an internal network of machines in a &lt;code&gt;.internal&lt;/code&gt; domain (&lt;code&gt;maebe.internal&lt;/code&gt;, &lt;code&gt;gob.internal&lt;/code&gt;, etc). Assuming you already have SSH access to these machines as detailed in the previous section, you can simply add something like this to your &lt;code&gt;~/.ssh/config&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Host *.internal
ProxyCommand ssh &amp;lt;bastion_host&amp;gt; nc %h %p
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and you'll magically be able to run ssh commands like the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ssh maebe.internal
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What??? How does my machine know to resolve maebe.internal from anywhere on the internet, you ask? What's happening here is that SSH is applying the config for *.internal to your connection request, and running the request through &lt;code&gt;ProxyCommand&lt;/code&gt;. As such, your destination hostname actually gets looked up in the DNS context of the bastion host, which (presumably) knows how to resolve maebe.internal. Once again, Magic!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>One of these things is not like the other</title>
   <link href="http://longbeard.org/2011/01/07/One-of-these-things-is-not-like-the-other.html"/>
   <updated>2011-01-07T00:00:00-08:00</updated>
   <id>http://longbeard.org/2011/01/07/One-of-these-things-is-not-like-the-other</id>
   <content type="html">&lt;h1&gt;One of these things is not like the other&lt;/h1&gt;

&lt;p&gt;As a follow-on to Gruber &lt;a href=&quot;http://daringfireball.net/linked/2011/01/07/pixelmator&quot;&gt;today&lt;/a&gt;, there's &lt;a href=&quot;http://most-advantageous.com/optimal-layout/&quot;&gt;at least one program out there&lt;/a&gt; whose outside-the-walled-garden version has features which the App Store version does not. Quoted from Optimal Layout's product page:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Optimal Layout fully supports Spaces: you can easily see which Space a windows is in. In the version purchased from this site you can also move groups of windows between Spaces with a keyboard command, note that this feature is not available in the version of Optimal Layout available on Apple's Mac App Store.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;As an &lt;a href=&quot;http://bantapp.com&quot;&gt;iOS App Store developer&lt;/a&gt; I wish I could say I was more excited about the Mac App Store, but balkanization such as this can't possibly bode well for the platform's health outside the walled garden.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>TIL</title>
   <link href="http://longbeard.org/2010/12/13/TIL.html"/>
   <updated>2010-12-13T00:00:00-08:00</updated>
   <id>http://longbeard.org/2010/12/13/TIL</id>
   <content type="html">&lt;h1&gt;TIL&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;http://www.newyorker.com/reporting/2010/12/20/101220fa_fact_paumgarten&quot;&gt;Until this moment&lt;/a&gt;, it had never occurred to me that Donkey Kong was indeed &lt;strong&gt;Donkey&lt;/strong&gt; Kong. I'd honestly never actually seen the word donkey there, instead always assuming it was just a random jibberish name given to the bad guy.&lt;/p&gt;

&lt;p&gt;Oops.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>You may find yourself in another part of the world</title>
   <link href="http://longbeard.org/2010/11/22/You-may-find-yourself-in-another-part-of-the-world.html"/>
   <updated>2010-11-22T00:00:00-08:00</updated>
   <id>http://longbeard.org/2010/11/22/You-may-find-yourself-in-another-part-of-the-world</id>
   <content type="html">&lt;h1&gt;You may find yourself in another part of the world&lt;/h1&gt;

&lt;p&gt;On a dare from &lt;a href=&quot;http://www.nmr.mgh.harvard.edu/~tisdall/&quot;&gt;Dylan&lt;/a&gt;, I wrote this up last night as a quick and dirty way of keeping track of where I left off in a given terminal window. When you're walking away from a task, simply run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;whereami &amp;lt;note to self&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and it will start being reflected in your terminal prompt. When you sit down to work again, run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;whereami
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;with no arguments to clean out the note to yourself. Because it works using environment variables, you can use this on any number of terminal windows without interference.&lt;/p&gt;

&lt;p&gt;Code here:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/712063.js?file=gistfile1.sh&quot;&gt;&lt;/script&gt;


&lt;p&gt;This has also been added to my &lt;a href=&quot;https://github.com/mtrudel/dotfiles/commit/fe507ea7&quot;&gt;dotfile project&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hello filewall</title>
   <link href="http://longbeard.org/2010/07/13/hello-filewall.html"/>
   <updated>2010-07-13T00:00:00-07:00</updated>
   <id>http://longbeard.org/2010/07/13/hello-filewall</id>
   <content type="html">&lt;h1&gt;Hello filewall&lt;/h1&gt;

&lt;p&gt;I'm sick of firewalls. I'm sick of how arcane and arbitrary their config systems are. I'm sick of the fact that they're never really reproducible, and that only one guy in most organizations understands their network (mostly because that guy was usually me).&lt;/p&gt;

&lt;p&gt;On the other hand, I've always liked &lt;a href=&quot;http://shorewall.net&quot;&gt;shorewall&lt;/a&gt;. Its config language has always seemed very flexible and easy to grok, it has great documentation, and since it's just iptables under the covers, there's no magic to it. Thinking about things further, I realized that most of my pain points were really more about how people go about setting up firewalls than about firewalls themselves. Such a central and yet seldom-touched piece of infrastructure is exactly the kind of place you want repeatability and process, and exactly the wrong place for ad-hoc hacks. Hence, &lt;a href=&quot;http://github.com/well/filewall/&quot;&gt;filewall&lt;/a&gt; was born.&lt;/p&gt;

&lt;p&gt;In one line, &lt;strong&gt;git + capistrano + shorewall = filewall&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Filewall is a mix of capistrano and shorewall that lets you keep your firewall configuration in SCM, and lets you deploy it to your routers in a simple, sane and structured way. It takes a great firewall and marries it to a great deployment system to make a great deployable firewall. Wicked.&lt;/p&gt;

&lt;p&gt;Changes made with filewall are safely deployable; deployments incorporate a dead-man switch, wherein the rule changes are temporarily turned up for a timeout duration, and actually made permanent only if you subsequently affirm that they do what you intended them to. If you accidentally fry your config, filewall will restore your old configuration as soon as the timeout expires. You'll never be locked out again.&lt;/p&gt;

&lt;p&gt;Committed configurations are immediately wired into the filesystem, so your firewall works predictably across reboots. And since it's &lt;a href=&quot;http://capify.org&quot;&gt;capistrano&lt;/a&gt; based, you have access to all the rollback awesomeness that capistrano provides.&lt;/p&gt;

&lt;p&gt;If you're responsible for a more complex network, you can easily store all of your configurations as branches and keep all of your sensitive network config in one place, keeping all of your routers locked up with one public key. And don't forget that software routers are &lt;a href=&quot;http://freedomhec.pbworks.com/f/linux_ip_routers.pdf&quot;&gt;fast&lt;/a&gt;, so you probably won't be outgrowing filewall anytime soon (and even if you do, filewall is hardware agnostic. As long as it runs Debian, it runs filewall).&lt;/p&gt;

&lt;p&gt;So say hi to &lt;a href=&quot;http://github.com/well/filewall/&quot;&gt;filewall&lt;/a&gt;. It's what you want.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>75Ω</title>
   <link href="http://longbeard.org/2010/06/04/75%CE%A9.html"/>
   <updated>2010-06-04T00:00:00-07:00</updated>
   <id>http://longbeard.org/2010/06/04/75Ω</id>
   <content type="html">&lt;h1&gt;75Ω&lt;/h1&gt;

&lt;p&gt;Ryan Tomayko's &lt;a href=&quot;http://tomayko.com/writings/unicorn-is-unix&quot;&gt;post about Unicorn&lt;/a&gt; is one of my favourite pieces of the past year. He's spot on the money that despite all of the change in the past several decades of systems development, idiomatic use of the Posix APIs will still carry the day. And it got me to thinking about the differences between the (majority of) the Ruby / Python community and how it contrasts to the PHP / Java community in terms of embracing idioms and striking a balance between tools doing too much and too little. I'm christening this concept &lt;em&gt;tooling impedance&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;What we do as developers today isn't any different than how developers worked twenty years ago. We still create text files that get parsed and transmogrified by a compiler (or an interpreter, but that's immaterial to my point). We still write code and work with relation to a filesystem. While we've graduated from linear style to a nearly universal embrace of objects, the way we actualize these concepts is still file-and-compilation-unit-centric.&lt;/p&gt;

&lt;p&gt;Despite the seemingly immutable nature of our code, there has been an explosion of IDEs over the past decade or so. As a consequence, the complexity of tooling relative to code has risen far above what it once was. I'm not suggesting that we all need to go back to using &lt;code&gt;ed&lt;/code&gt; to get things done, but I think it's certainly worth taking a step back from the tooling landscape before we suffocate underneath IDEs.&lt;/p&gt;

&lt;p&gt;I remember Reg Braithwaite's &lt;a href=&quot;http://weblog.raganwald.com/2008/07/l-is-not-code-smell.html&quot;&gt;excellent talk&lt;/a&gt; at RubyFringe a number of years ago, and one of the quotes he offered up therein:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&quot;All problems can be solved by adding another layer of abstraction, except the problem of having too many layers of abstraction.&quot;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I defy anyone out here to try and extend Eclipse without writing any code. As an IDE, it presents so much abstraction between the screen and the filesystem that it's often not always even clear &lt;em&gt;which&lt;/em&gt; file you're operating on. An IDE that 'helps you' by abstracting away the &lt;em&gt;fundamental metaphor of development&lt;/em&gt; is doing you a tremendous disservice, all the more so if it's coddling you into believing that those metaphors are dead. Introducing this kind of impedance mismatch into the development cycle may help you as long as you're inside the walls of the IDE, but find yourself outside those walls, and you end up having to recreate those abstractions on your own.&lt;/p&gt;

&lt;p&gt;Fuck that noise.&lt;/p&gt;

&lt;p&gt;Whether or not vi / emacs / TextMate is forever isn't at all important. What &lt;em&gt;is&lt;/em&gt; important is that they all treat code as text, and not some heavyweight abstraction. Whichever one you choose (and just to be clear, it doesn't matter), they're all superior to IDE's because they don't try to punch above their weight. There's zero impedance mismatch between your editor as a tool, and your code as text. Understanding comes from clarity, and you can't have that if you can't see what it is you're doing.&lt;/p&gt;

&lt;p&gt;I'm sure people will point out that this is regressive, that this is the ranting of a crotchety old man averse to change. Horseshit -- I've delivered &lt;a href=&quot;http://www.ehealthinnovation.org/?q=dh&quot;&gt;actual&lt;/a&gt;, &lt;a href=&quot;http://bantapp.com&quot;&gt;real&lt;/a&gt; products in both Eclipse and XCode bigger than anything you've done this year, and I've spent enough time with both of them to know that they're both trying to do too much. They're both trying to &lt;em&gt;keep coders away from code&lt;/em&gt;, which is so patently wrong I don't know where to begin (in fairness, Eclipse is &lt;em&gt;much&lt;/em&gt; more guilty of this than XCode).&lt;/p&gt;

&lt;p&gt;In the end, I think Ryan's original post is dead on. In 30 years, smart people &lt;em&gt;will&lt;/em&gt; still be solving hard problems using &lt;code&gt;fork(2)&lt;/code&gt; and &lt;code&gt;exec(2)&lt;/code&gt;. I'm just pushing that statement out further, and saying that if Posix calls are still around, then text will still be king. And if text is still king, then the humble editor will still be around, long after your vaunted IDEs and code fashions de jour have passed into antiquity.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>my brain hurts</title>
   <link href="http://longbeard.org/2010/05/13/my-brain-hurts.html"/>
   <updated>2010-05-13T00:00:00-07:00</updated>
   <id>http://longbeard.org/2010/05/13/my-brain-hurts</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://etudeapp.com/ipad/&quot;&gt;Brilliant&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lessons</title>
   <link href="http://longbeard.org/2010/04/19/Lessons.html"/>
   <updated>2010-04-19T00:00:00-07:00</updated>
   <id>http://longbeard.org/2010/04/19/Lessons</id>
   <content type="html">&lt;h1&gt;Lessons&lt;/h1&gt;

&lt;p&gt;For those of us who may like to pretend that the buildings of the past are best buried in the name of progress, may I present a memory burned into my brain forever:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm1.static.flickr.com/86/255646765_1c72e637af.jpg&quot; alt=&quot;Set the controls for the heart of the sun&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I never realized that the building housing the &lt;a href=&quot;http://en.wikipedia.org/wiki/Bankside_Power_Station&quot;&gt;Tate Modern&lt;/a&gt; came as close as it did to being lost. I think I speak for everyone who has ever stood in awed and humble reverence of the Turbine Hall when I say that I'm glad the axe never fell.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm1.static.flickr.com/96/235161500_737805e915.jpg&quot; alt=&quot;wasn't this a kraftwerk album cover?&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>stencilrific</title>
   <link href="http://longbeard.org/2010/04/07/stencilrific.html"/>
   <updated>2010-04-07T00:00:00-07:00</updated>
   <id>http://longbeard.org/2010/04/07/stencilrific</id>
   <content type="html">&lt;h1&gt;stencilrific&lt;/h1&gt;

&lt;p&gt;Short and sweet: I just made and published a quick little &lt;a href=&quot;http://www.omnigroup.com/products/omnigraffle/&quot;&gt;OmniGraffle&lt;/a&gt; stencil for use in drawing git branching models. It's based on the figure styles in Scott Chacon's excellent &lt;a href=&quot;http://www.progit.org&quot;&gt;Pro Git&lt;/a&gt; book, and published on Graffletopia.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://graffletopia.com/stencils/581&quot;&gt;Get It&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Today's terminal timesaver</title>
   <link href="http://longbeard.org/2010/03/28/today%27s-terminal-timesaver.html"/>
   <updated>2010-03-28T00:00:00-07:00</updated>
   <id>http://longbeard.org/2010/03/28/today's-terminal-timesaver</id>
   <content type="html">&lt;h1&gt;Today's terminal timesaver&lt;/h1&gt;

&lt;p&gt;Via &lt;a href=&quot;http://sigpipe.macromates.com/2010/03/28/search-path-for-cd/&quot;&gt;Allan Odgaard&lt;/a&gt;, a simple and super useful terminal tweak. The &lt;code&gt;cd&lt;/code&gt; command looks for a &lt;code&gt;CDPATH&lt;/code&gt; environment variable, which specifies directories &lt;code&gt;cd&lt;/code&gt; will always look at when trying to change directories. Essentially, what &lt;code&gt;PATH&lt;/code&gt; is to executing programs, &lt;code&gt;CDPATH&lt;/code&gt; is to changing directories.&lt;/p&gt;

&lt;p&gt;The upshot of this is you can always change to commonly used directories no matter where you are in the filesystem. For example, I use the following setting:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export CDPATH=::~:~/Work:~/Desktop:~/Code
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and now no matter where I am in the filesystem, I can always change to any subdirectory of my home directory (or &lt;code&gt;~/Work&lt;/code&gt;, &lt;code&gt;~/Desktop&lt;/code&gt; or &lt;code&gt;~/Code&lt;/code&gt;). So, entering &lt;code&gt;cd Downloads&lt;/code&gt; will bring me to &lt;code&gt;~/Downloads&lt;/code&gt; no matter where I am.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>cue the Dylan</title>
   <link href="http://longbeard.org/2010/03/15/cue-the-Dylan.html"/>
   <updated>2010-03-15T00:00:00-07:00</updated>
   <id>http://longbeard.org/2010/03/15/cue-the-Dylan</id>
   <content type="html">&lt;p&gt;Once in a blue moon, something will come along that just screams out to you a truth you've long known, the tangible metaphor making it all the more real.&lt;/p&gt;

&lt;p&gt;I've just spent the past six months working on &lt;a href=&quot;http://bantapp.com&quot;&gt;bant&lt;/a&gt; (thank you, I'm quite proud of it). Now that we're in the process of adding in our secondary localizations for 1.0.1, our designer just sent us this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bantSharingHeader.png&quot; alt=&quot;an inline image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and it hit me; I'm writing software for the entire world. Barely fifty years ago, 'no ticky, no laundry' was considered to be a benign and appropriate form of humour (though &lt;a href=&quot;http://answers.yahoo.com/question/index?qid=20080128145737AAi4Lsy&quot;&gt;some people&lt;/a&gt;  apparently have yet to get the memo). Today my work isn't complete unless I take into account a country I've never even been to.&lt;/p&gt;

&lt;p&gt;The times really are a changin'. What a wonderful time to be alive.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>on backwards dinosaurs</title>
   <link href="http://longbeard.org/2010/03/09/on-backwards-dinosaurs.html"/>
   <updated>2010-03-09T00:00:00-08:00</updated>
   <id>http://longbeard.org/2010/03/09/on-backwards-dinosaurs</id>
   <content type="html">&lt;p&gt;I've said it before, but github's &lt;a href=&quot;http://pages.github.com&quot;&gt;pages&lt;/a&gt; feature is a great application of one of git's most unsung features. to wit:&lt;/p&gt;

&lt;p&gt;git repos are cheap. at their minimum, they're just a single top-level subdirectory with some easily parseable files tied to a real, working copy of your repo's contents. One command away, in place on top of an existing working copy. they're so cheap, in fact, that some of the &lt;a href=&quot;http://gist.github.com&quot;&gt;lightest sharing systems&lt;/a&gt; out there are based on git.&lt;/p&gt;

&lt;p&gt;Those of us unfortunate enough to remember a life under subversion may or may not remember the steps involved in setting up a repository (as the tooling guy for a team of five developers, I had to go back to the manual every time I had to set one up). That was bad enough. Those of us who also remember having to clean up after someone checked a subversion repo into your subversion repo probably realized it a bit more acutely; a feeling someone, somewhere, was laughing their ass off at your expense.&lt;/p&gt;

&lt;p&gt;In a world where repos are cheap &amp;amp; easy to create, they start making sense as a generic representation of 'chunks of data' being moved around. Why bother using a &lt;a href=&quot;http://www.tumblr.com&quot;&gt;blog service&lt;/a&gt; with some clunky web-based posting interface? Why risk using a flavour of the month &lt;a href=&quot;http://www.dropbox.com&quot;&gt;silo of a cloud store&lt;/a&gt;? Why bother trusting &lt;a href=&quot;http://www.google.com&quot;&gt;just anyone&lt;/a&gt; to be the sole steward of your digital life?&lt;/p&gt;

&lt;p&gt;A way forward here seems really easy and obvious given the fact that owning, copying, and generally marshalling sets of data around in the most efficient way possible is exactly what git does. In this far-off futureland, you publish to your blog by pushing to a remote git repo, you copy files between computers by syncing repos, and you share  your address book with your email provider as a bunch of open format files inside a repository. In all these cases, you yourself own a first-class version of the data in question, locally and under your control. Where's the data? It's everywhere it needs to be, including in your safe hands for as long as your care to care for it.&lt;/p&gt;

&lt;p&gt;Imagine that. Cloud computing where 'my own personal cloud, please stay the hell out unless I invite you in' is a subset. Cool.&lt;/p&gt;

&lt;p&gt;I know people ride my ass about being so hot and bothered about a piece of fucking software. And I am. But I'm excited because I feel like git is the first tool to really &lt;em&gt;nail&lt;/em&gt; this sort of interaction, and I see it being the jumping off point for a million great tools. It feels like the future, but one that's untamed and wild enough to help shape. It feels like &lt;em&gt;new&lt;/em&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>this post ought to have begun with a link</title>
   <link href="http://longbeard.org/2010/02/15/this-post-ought-to-have-begun-with-a-link.html"/>
   <updated>2010-02-15T00:00:00-08:00</updated>
   <id>http://longbeard.org/2010/02/15/this-post-ought-to-have-begun-with-a-link</id>
   <content type="html">&lt;p&gt;This post ought to have begun with a link, and it obviously doesn't.&lt;/p&gt;

&lt;p&gt;It doesn't because the thing I want to reply to, the opinion I want to tender for discussion, is on Facebook. Thus there's no universal way to refer to anything ever said there.&lt;/p&gt;

&lt;p&gt;That fucking sucks, and it's exactly what's wrong with social networking sites today.&lt;/p&gt;

&lt;p&gt;I want to begin a discussion on something my buddy Bryan said that will stand the test of time. I want to nurture a dialogue in a way that will (in my own little narcissistic way) give my and Bryan's ideas the memory of the ages. I want this to become a discussion that lives on beyond today; to possibly become an anecdote that one of us may recount in thirty years when recalling how we got to know each other, maybe the material of a footnote to one of our biographies. Or maybe it will come to nothing, forgotten away in in the internet's basement.&lt;/p&gt;

&lt;p&gt;Either way, if it's worth talking about, it's probably also worth archiving, and I can't do that if you're talking to me from inside the social networking silo of the day.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>is this valid academia?</title>
   <link href="http://longbeard.org/2010/02/15/is-this-valid-academia.html"/>
   <updated>2010-02-15T00:00:00-08:00</updated>
   <id>http://longbeard.org/2010/02/15/is-this-valid-academia</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://lpresearch.org/cms/?q=node/8&quot;&gt;Is it?&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>neato</title>
   <link href="http://longbeard.org/2010/01/27/neato.html"/>
   <updated>2010-01-27T00:00:00-08:00</updated>
   <id>http://longbeard.org/2010/01/27/neato</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.faludi.com/teaching/crafting-with-data/syllabus-crafting-with-data/&quot;&gt;Check this out&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This sounds like a wonderful example of art meets learning. Not sure about its appropriateness in a university setting, but this is exactly what high school should be like in my mind.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>What the Hell is in the water in Redmond? Bleach?</title>
   <link href="http://longbeard.org/2009/10/25/what-the-hell-is-in-the-water-in-Redmond%3F-Bleach%3F.html"/>
   <updated>2009-10-25T00:00:00-07:00</updated>
   <id>http://longbeard.org/2009/10/25/what-the-hell-is-in-the-water-in-Redmond?-Bleach?</id>
   <content type="html">&lt;p&gt;From &lt;a href=&quot;http://db.tidbits.com/article/10676&quot;&gt;here&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;'All computers in the store come with support and Microsoft Signature; a free service that removes all the &quot;free&quot; antivirus and other PC manufacturer software that crufts up a new PC, and gives customers a pristine installation of Windows 7.'&lt;/p&gt;

&lt;p&gt;I'm sorry but, uh, &lt;em&gt;are you fucking kidding me???&lt;/em&gt; Who approves product briefs up there? Bozos.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Today's dterm trick</title>
   <link href="http://longbeard.org/2009/10/14/today%27s-dterm-trick.html"/>
   <updated>2009-10-14T00:00:00-07:00</updated>
   <id>http://longbeard.org/2009/10/14/today's-dterm-trick</id>
   <content type="html">&lt;p&gt;From any application with context tied to the filesystem, open &lt;a href=&quot;http://www.decimus.net/dterm.php&quot;&gt;DTerm&lt;/a&gt; and run &lt;code&gt;open .&lt;/code&gt; to get a Finder window focused on that content. Easy peasy 50/50 shell / GUI magic.  Who needs quicksilver with a context aware terminal lying around?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sammy Davis Junior Jr.</title>
   <link href="http://longbeard.org/2009/01/15/Sammy-Davis-Junior-Jr.html"/>
   <updated>2009-01-15T00:00:00-08:00</updated>
   <id>http://longbeard.org/2009/01/15/Sammy-Davis-Junior-Jr</id>
   <content type="html">&lt;p&gt;Short and sweet; &lt;a href=&quot;http://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/server/RequestProcessorFactoryFactory.html?rel=html&quot;&gt;Architeeeeecccttttts iiiiinnn sppppppaaaaacccee&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>RSI's Analog Hole</title>
   <link href="http://longbeard.org/2008/10/28/RSIs-Analog-Hole.html"/>
   <updated>2008-10-28T00:00:00-07:00</updated>
   <id>http://longbeard.org/2008/10/28/RSIs-Analog-Hole</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;A thought:&lt;/strong&gt; Conventional wisdom (somewhat incorrectly, according to the literature) dictates that RSI and carpal tunnel syndrome can be prevented by, among other things, frequent breaks while typing. Most guides suggest breaks of at least 1 minute every 20-60 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An observation:&lt;/strong&gt; LP records are - on average - about 25 minutes per side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A conclusion:&lt;/strong&gt; Developers should have turntables at their desks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A footnote:&lt;/strong&gt; Other benefits include listening to better music, an opportunity to socialize, swap tunes, analog gear to tinker with, etc.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Oops</title>
   <link href="http://longbeard.org/2008/08/29/Oops.html"/>
   <updated>2008-08-29T00:00:00-07:00</updated>
   <id>http://longbeard.org/2008/08/29/Oops</id>
   <content type="html">&lt;p&gt;Via &lt;a href=&quot;http://daringfireball.net/linked/2008/08/29/gratitude&quot;&gt;John Gruber&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;27 year old Frisian developer Eric Wijngaard won $275,000 in Google’s Android Developer Challenge for his ‘PicSay’ application.&lt;/p&gt;

&lt;p&gt;In an interview with a Dutch website he says he likes Google’s SDK but “What I really wanted to do was develop an iPhone app. The iPhone SDK wasn’t out yet, though.”&lt;/p&gt;

&lt;p&gt;Asked what he would do with the cash, his response was “I guess I could invest it in my software company, but first I want to port PicSay to the iPhone.”&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;You mean it's a &lt;em&gt;bad&lt;/em&gt; idea to inject ten million no-strings-attached dollars into the independent mobile development scene just as your main competitor's absolute money-factory, game-changing platform is enticing developers all over the map to quit their day jobs and cash in, if only they could afford to eat for the intervening 4 months? Whodathunkit?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hemming The Fringe</title>
   <link href="http://longbeard.org/2008/07/23/Hemming-The-Fringe.html"/>
   <updated>2008-07-23T00:00:00-07:00</updated>
   <id>http://longbeard.org/2008/07/23/Hemming-The-Fringe</id>
   <content type="html">&lt;p&gt;Spent this past weekend at &lt;a href=&quot;http://www.rubyfringe.com&quot;&gt;RubyFringe&lt;/a&gt;, and got my head blown in a few ways. Specifically, there's some stuff that the guys are doing at the &lt;a href=&quot;http://sinatrarb.com/Home&quot;&gt;low end&lt;/a&gt;, some stuff guys are doing at the &lt;a href=&quot;http://www.couchdb.com&quot;&gt;high end&lt;/a&gt;, and some just plain &lt;a href=&quot;http://gilesbowkett.blogspot.com/2008/02/archaeopteryx-ruby-midi-generator.html&quot;&gt;awesome shit&lt;/a&gt; (giles' presentation was especially awesome. 300+ slides in 30 minutes. Any punk album would be proud). What they all had in common, though, was a driving freight train of a developer who was possessed of a few common qualities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;all misfits, at least from an employment point of view&lt;/li&gt;
&lt;li&gt;all smart as shit&lt;/li&gt;
&lt;li&gt;all had a great understanding of context, as well as content&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Now, it may well be that those points are inter-related, but my focus today is on the last of them. I've met far too many people that are wonderfully talented at content, but not context (in other words, they may have horrendous communication skills or have no understanding the world 'out there', but can code like Barbarella can..., uh, you know.... hey! look! &lt;a href=&quot;http://www.youtube.com/watch?v=1uwNEnh9uaM&quot;&gt;movies!&lt;/a&gt;). Those people are dangerous because they'll go down the rabbit hole every time with no hesitation. On the other hand, I've also had too many run-ins with people that have context but no content (in a previous world, they were known as &lt;a href=&quot;http://video.google.com/videoplay?docid=-153229771370574947&quot;&gt;used car salesmen&lt;/a&gt;. Now I think we know them as consultants). &lt;em&gt;They're&lt;/em&gt; dangerous because they have a disturbing tendency of selling you up the river. Both should be considered dangerous, and are to be avoided.&lt;/p&gt;

&lt;p&gt;The real all-stars are those that live on the edges in most other ways (skill, dedication, smarts, etc), but who live in the middle of this particular dichotomy. It's strange sometimes, how the edge rewards people in some cases, yet punishes in others.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ezra's Law</title>
   <link href="http://longbeard.org/2008/07/13/Ezras-Law.html"/>
   <updated>2008-07-13T00:00:00-07:00</updated>
   <id>http://longbeard.org/2008/07/13/Ezras-Law</id>
   <content type="html">&lt;p&gt;&lt;img src='http://farm2.static.flickr.com/1086/1353511352_6eec3d8de5_m.jpg' alt='' class='alignright' /&gt;&lt;/p&gt;

&lt;p&gt;Up on the plate today: the importance of thinking, problem reduction, and generalisation, as illustrated through tactical examples. Case in point: it really bugs me when people that oughta know better write stuff that looks like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (a == true)
  if (b == true)
    return false
  else if (b == false)
    return true
  end
else if (a == false)
  if (b == true)
    return true
  else if (b == false)
    return false
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Up front, don't laugh. I see crap like this all the time.&lt;/p&gt;

&lt;p&gt;For those that may not see it, this is exactly equivalent to &quot;a XOR b&quot;, and so could be equally expressed as&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;return a ^ b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or, if your language of choice doesn't have XOR:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;return a != b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I'm gonna go out on a limb and suggest that that code should never have been written. Any developer worth their salt should have seen that reduction right off the bat.&lt;/p&gt;

&lt;p&gt;To paraphrase the always insightful &lt;a href=&quot;http://brainspl.at/&quot;&gt;Ezra Zygmuntowicz&lt;/a&gt;, &quot;&lt;strong&gt;No code is better than no code&lt;/strong&gt;&quot;. I'm hereby christening this phrase as &quot;&lt;em&gt;Ezra's Law&lt;/em&gt;&quot;, and will publicly state that anyone I find not following it in our committed code will be flogged, or at least made to buy me a beer.&lt;/p&gt;

&lt;p&gt;(Note: feel free to substitute [ 'faster' | 'more correct' | 'more maintainable' | 'clearer' ] for 'better' )&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>proacively value adding bullshit remover</title>
   <link href="http://longbeard.org/2008/07/09/proactively-value-adding-bullshit-remover.html"/>
   <updated>2008-07-09T00:00:00-07:00</updated>
   <id>http://longbeard.org/2008/07/09/proactively-value-adding-bullshit-remover</id>
   <content type="html">&lt;p&gt;Wherein I lay out a manifesto I've been working on for a few months.&lt;/p&gt;

&lt;h1&gt;A Developer's Articles of Faith&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;The computer is never wrong. If something is amiss, it's because you caused it to be so. Seek understanding through iterative simplification, and rigorous delineation of scope. &lt;strong&gt;DO ONLY WHAT YOU CAN UNDERSTAND IN ONE SITTING, IN ONE SITTING&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;When in doubt, your computer is better at a given, well defined, repeatable task than you are. Embrace repeatability, consistency, and automation in your tooling and testing. &lt;strong&gt;CLEANLINESS IS NEXT TO GODLINESS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The marginal cost of CPU cycles is zero. The marginal cost of a developer's time and sanity is quite a bit more. Err on the side of making your life easier at the expense of the computer's. &lt;strong&gt;UNDERSTAND COMPUTERS, BUT DESIGN FOR PEOPLE&lt;/strong&gt; (corollary: &lt;strong&gt;PREMATURE OPTIMIZATION IS THE ROOT OF ALL EVIL&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;If you know what you're doing&lt;/em&gt;, you will probably never understand what you're doing right now better than you do right now. The cognitive context lost when you come back to a task at a later date is large, and can easily turn into your deepest effort drain. Where possible, leave your work at a natural conclusion, with as many low level ends tied up as possible. Where loose ends exist, track them mercilessly. &lt;strong&gt;LOOSE ENDS, LEFT UNADDRESSED, WILL SINK YOU&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The counter-case: if you don't know what you're doing right now, give yourself time (or seek out help) to let the context sink in; nobody fires on all cylinders all the time. An important decision made early and wrongly is usually &lt;em&gt;vastly&lt;/em&gt; more expensive than one made late but correctly (within reason, of course). &lt;strong&gt;IT'S OK (HEALTHY, EVEN) TO BE BEATEN, BUT ONLY IF YOU ADMIT IT&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Organizational Maxims (an addendum)&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Give developers the tools and environment they need. If anything; IT, HR, your office layout etc, aren't helping, then they're a liability. Full stop.
&lt;strong&gt;A GREAT WORK ENVIRONMENT MAY NOT LEAD TO TEH AWESOME, BUT A SHITTY ONE WILL CERTAINLY LEAD TO FAILURE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Accept that you'll be wrong a good portion of the time, and build your processes around that. Shamelessly solicit feedback from the bottom to the top; make nobody too ashamed or scared to say anything to anyone (aside: if your people aren't willing to step up to that, you've got the wrong people).
&lt;strong&gt;DO NOT STRATEGIZE / LEAD / DECIDE IN A BUBBLE&lt;/strong&gt; (secondary lesson: &lt;strong&gt;EXPECT HINDSIGHT TO KICK YOUR ASS&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Do not tolerate the thin end of the wedge. Good developers are fickle beasts, and have an exceedingly low tolerance for anything that isn't on their terms (aside: if your people roll over and take obvious crap, then &amp;ndash; again &amp;ndash; you've got the wrong people). &lt;strong&gt;BULLSHIT IS THE KRYPTONITE OF GETTING COOL THINGS DONE&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 
</feed>

