<?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">
 
 <title>ones zeros majors and minors</title>
 
 <link href="http://ozmm.org/" />
 <updated>2009-07-10T10:36:24-07:00</updated>
 <id>http://ozmm.org/</id>
 <author>
   <name>Chris Wanstrath</name>
   <email>chris@ozmm.org</email>
 </author>

 
 <link rel="self" href="http://feeds.feedburner.com/ozmmorg" type="application/atom+xml" /><entry>
   <title>Leafy Chat</title>
   <link href="http://ozmm.org/posts/leafychat.html" />
   <updated>2009-07-10T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/leafychat</id>
   <content type="html">&lt;p&gt;A few weeks ago I competed in the &lt;a href="http://www.djangodash.com/"&gt;Django Dash&lt;/a&gt; along with &lt;a href="http://twitter.com/alex_gaynor"&gt;Alex Gaynor&lt;/a&gt; and &lt;a href="http://twitter.com/leahculver"&gt;Leah Culver&lt;/a&gt;. Our team ended up placing second.&lt;/p&gt;
&lt;div align="center"&gt;&lt;a href="http://leafychat.com/"&gt;&lt;img src="http://img.skitch.com/20090710-9yyxf33faegu2w3m7actpmqhi.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We made a comet powered, web based &lt;span class="caps"&gt;IRC&lt;/span&gt; client called &lt;a href="http://leafychat.com/"&gt;Leafy Chat&lt;/a&gt;. In fact, we just launched a redesign.&lt;/p&gt;
&lt;p&gt;Check it out.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Forking, Continued</title>
   <link href="http://ozmm.org/posts/forking_continued.html" />
   <updated>2009-01-21T00:00:00-08:00</updated>
   <id>http://ozmm.org//posts/forking_continued</id>
   <content type="html">&lt;p&gt;David Welton has posted &lt;a href="http://journal.dedasys.com/2009/01/21/more-github"&gt;a thoughtful reply&lt;/a&gt; to &lt;a href="http://ozmm.org/posts/linux_vs_classic_dev_style.html"&gt;my comment&lt;/a&gt;. Unfortunately, he missed my point. I can only assume this is due to a lack of clarity on my part. (My comment was very brief.)&lt;/p&gt;
&lt;p&gt;I mentioned the Network Graph and Fork Queue but David mentioned neither. I think he doesn&amp;#8217;t know what they are, probably because I didn&amp;#8217;t explain what they are :)&lt;/p&gt;
&lt;p&gt;So, in an effort to be more clear, let me propose an alternate workflow to David&amp;#8217;s. He says, &amp;#8220;Here&amp;#8217;s a concrete example of how things might go wrong.&amp;#8221; I see his example and think, &amp;#8220;That&amp;#8217;s a concrete example of how things have gone right.&amp;#8221;&lt;/p&gt;
&lt;p&gt;(I&amp;#8217;m going to make this visual so you don&amp;#8217;t have to take my word for it or keep jumping between here and GitHub to try it out.)&lt;/p&gt;
&lt;h3&gt;The Network Graph&lt;/h3&gt;
&lt;pre&gt;
root@fortrock:~# gem1.8 search -r actionwebservice

*** REMOTE GEMS ***

actionwebservice (1.2.6)
datanoise-actionwebservice (2.2.2)
dougbarth-actionwebservice (2.1.1)
nmeans-actionwebservice (2.1.1)
&lt;/pre&gt;
&lt;p&gt;The problem is obvious: which &lt;code&gt;actionwebservice&lt;/code&gt; should we use?&lt;/p&gt;
&lt;p&gt;Well, we know three of those gems are on GitHub. And all three of the GitHub gems have higher versions than the Rubyforge gem. So let&amp;#8217;s check GitHub first.&lt;/p&gt;
&lt;p&gt;I go to &lt;a href="http://github.com/search"&gt;http://github.com/search&lt;/a&gt; and search for &lt;code&gt;actionwebservice&lt;/code&gt;. (Actually I do this from my &lt;a href="http://www.obdev.at/launchbar/"&gt;LaunchBar&lt;/a&gt; template, but you get the idea.)&lt;/p&gt;
&lt;p&gt;In the &lt;a href="http://github.com/search?type=Everything&amp;amp;language=&amp;amp;q=actionwebservice&amp;amp;repo=&amp;amp;langOverride=&amp;amp;x=0&amp;amp;y=0&amp;amp;start_value=1"&gt;results&lt;/a&gt;, I see that the first &lt;code&gt;actionwebservice&lt;/code&gt; appearing has the most forks and watchers, and was the most recently active.&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;a href="http://github.com/search?type=Everything&amp;language=&amp;q=actionwebservice&amp;repo=&amp;langOverride=&amp;x=0&amp;y=0&amp;start_value=1"&gt;
&lt;img src="http://img.skitch.com/20090121-k9e1webim3i7ejyuhgmkq8tws6.png" alt="" /&gt;
&lt;p&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;We could stop right here and choose @datanoise@&amp;#8217;s fork. But let&amp;#8217;s be sure.&lt;/p&gt;
&lt;p&gt;I click on the repo and arrive at &lt;a href="http://github.com/datanoise/actionwebservice"&gt;http://github.com/datanoise/actionwebservice&lt;/a&gt;. I click on the &lt;code&gt;Network&lt;/code&gt; tab.&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;p&gt;&lt;a href="http://github.com/datanoise/actionwebservice/network"&gt;&lt;br /&gt;
  &lt;img src="http://img.skitch.com/20090121-rhe2ygfkeu9msf5ew45q3h5u9y.png" alt="" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I arrive at &lt;a href="http://github.com/datanoise/actionwebservice/network"&gt;http://github.com/datanoise/actionwebservice/network&lt;/a&gt; and glance at the graph.&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;a href="http://github.com/datanoise/actionwebservice/network"&gt;
&lt;img src="http://img.skitch.com/20090121-tg4xmqdm1ut8s78gxrd2t3dahr.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;There are commits unique to certain forks, but &lt;code&gt;datanoise&lt;/code&gt; has the most activity and the most recent commits.&lt;/p&gt;
&lt;p&gt;At this point, there&amp;#8217;s no doubt: &lt;code&gt;datanoise&lt;/code&gt; is the most recent, most active version of &lt;code&gt;actionwebservice&lt;/code&gt;. Will it always be? Who knows. But for now, this is the best choice.&lt;/p&gt;
&lt;h3&gt;The Fork Queue&lt;/h3&gt;
&lt;p&gt;We can take it a step further, too. We see there are unmerged commits &amp;#8211; changes people have made which have not been pulled into &lt;code&gt;datanoise&lt;/code&gt;. We can examine them straight from the Network Graph, or we can attempt to merge them into &lt;code&gt;actionwebservice&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I fork @datanoise@&amp;#8217;s &lt;code&gt;actionwebservice&lt;/code&gt; using the &amp;#8216;fork&amp;#8217; button, still on the Network Graph&amp;#8217;s page:&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;a href="http://github.com/datanoise/actionwebservice/network"&gt;
&lt;img src="http://img.skitch.com/20090121-pqgx4www5irpyr6jp762723729.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Now I have my own version of &lt;code&gt;actionwebservice&lt;/code&gt;.&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;a href="http://github.com/defunkt/actionwebservice"&gt;
&lt;img src="http://img.skitch.com/20090121-fhupjq4bikpix8ft6ftdugiht4.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Time to visit the Fork Queue. (Only people with write access to the repository see this tab.)&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;img src="http://img.skitch.com/20090121-dxkih4t9xqnthj8wqiexn19hhm.png" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Okay, so it looks like a lot of the changes made will not apply cleanly.&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;img src="http://img.skitch.com/20090121-empcj2mfx91w1by7irinwg1s7w.png" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;If any of these commits had a green background, we&amp;#8217;d be able to apply them right there on the site (as explained by the legend). But we can&amp;#8217;t.&lt;/p&gt;
&lt;h3&gt;Pull Requests&lt;/h3&gt;
&lt;p&gt;Since we can&amp;#8217;t apply the commits, we could send &lt;code&gt;datanoise&lt;/code&gt; a message asking him to check over his Fork Queue and merge in the changes that look promising. We could do it ourselves, too, by resolving the conflicts. All we&amp;#8217;d need is to clone our repository, add one of the others as a remote, then merge and fix the conflicts before pushing back to our version. After that we could even send &lt;code&gt;datanoise&lt;/code&gt; a pull request, since we&amp;#8217;ve done the work for him. Or just wait for him to check his Fork Queue and see that our changes are green.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m just going to delete my fork, though.&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;img src="http://img.skitch.com/20090121-q8m79g686d6q7fwbc7eiarwss1.png" alt="" /&gt;
&lt;/div&gt;
&lt;h3&gt;Keeping Current&lt;/h3&gt;
&lt;p&gt;Even ignoring the forking and the Fork Queue, the point is this: it&amp;#8217;s not hard to see which project is the most active. Yes, we (GitHub) need to make it more clear. We want to say &amp;#8220;this is the fork you&amp;#8217;re looking for&amp;#8221; on the first page you see. And we want that to change as the most active, latest fork changes. But, for the time being, you can figure that all out with a single click.&lt;/p&gt;
&lt;p&gt;What happens when it does change, though? Perhaps &lt;code&gt;datanoise&lt;/code&gt; will lose interest and someone else will take up development. That&amp;#8217;s the beautiful part, and that&amp;#8217;s why you just can&amp;#8217;t do GitHub without Git (or any equally powerful &lt;span class="caps"&gt;DVCS&lt;/span&gt;): switching the remote and pulling in changes from the new repository is trivial. Git doesn&amp;#8217;t care where you pull from. It is not married to a remote &lt;span class="caps"&gt;URL&lt;/span&gt; in the same way a centralized &lt;span class="caps"&gt;VCS&lt;/span&gt; like Subversion is.&lt;/p&gt;
&lt;p&gt;Imagine hitting the &lt;code&gt;datanoise&lt;/code&gt; repository and being informed &amp;#8220;this may not be the most active repository in the network. Check Person X&amp;#8217;s.&amp;#8221; Switch your remote to the new one, pull, and you&amp;#8217;re up to date. This is the type of information the Network Graph makes available, we just need to make it more visible and plain. (Heck, maybe that message could be printed out when you &lt;code&gt;git pull&lt;/code&gt; from an inactive remote.)&lt;/p&gt;
&lt;p&gt;For instance, hitting @dougbarth@&amp;#8217;s &lt;code&gt;actionwebservice&lt;/code&gt; fork and checking the Network Graph makes it obvious that &lt;code&gt;datanoise&lt;/code&gt; is the repo we want:&lt;/p&gt;
&lt;div class="photo"&gt;
&lt;a href="http://github.com/dougbarth/actionwebservice/network"&gt;
&lt;img src="http://img.skitch.com/20090121-xhman6nekg64icyer9i5cr7xkg.png" alt="" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;If we were previously using @dougbarth@&amp;#8217;s fork it would be clear that @datanoise@&amp;#8217;s is the one to watch in the future.&lt;/p&gt;
&lt;h3&gt;Moving Forward&lt;/h3&gt;
&lt;p&gt;It may seem strange, and perhaps even like a lot of work. &amp;#8220;Why should I have to check to see which is the most current? In the old model, there&amp;#8217;s always a canonical repository.&amp;#8221;&lt;/p&gt;
&lt;p&gt;In the old model, &lt;code&gt;actionwebservice&lt;/code&gt; wouldn&amp;#8217;t have made it past 1.2.6. Welcome to distributed version control.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Linux vs Classic Dev Style</title>
   <link href="http://ozmm.org/posts/linux_vs_classic_dev_style.html" />
   <updated>2009-01-20T00:00:00-08:00</updated>
   <id>http://ozmm.org//posts/linux_vs_classic_dev_style</id>
   <content type="html">&lt;p&gt;I tried to leave this as a comment on &amp;#8220;Developer &amp;gt; Project, or Project &amp;gt; Developer(s)?&amp;#8221;:http://journal.dedasys.com/2009/01/10/developer-project-or-project-developer-s but the form errored and I couldn&amp;#8217;t find a contact email address.  Here it is:&lt;/p&gt;
&lt;p&gt;GitHub lets you do Linux-style fork development, or classic SourceForge style development. The difference is you have the choice.&lt;/p&gt;
&lt;p&gt;Using the Network graph you can easily see which fork in a Linux-style network has the most recent activity. It&amp;#8217;s one click away from any repository&amp;#8217;s home page, but we&amp;#8217;re working on better surfacing and summarizing the information.&lt;/p&gt;
&lt;p&gt;As for lazy developers not requesting you pull in changes, the Fork Queue lets you see unmerged changes in forks and even lets you merge them in from the web interface.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re constantly working to improve our tools and the ways you can manage your projects, as well.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>TextMate Minor Mode</title>
   <link href="http://ozmm.org/posts/textmate_minor_mode.html" />
   <updated>2008-12-02T00:00:00-08:00</updated>
   <id>http://ozmm.org//posts/textmate_minor_mode</id>
   <content type="html">&lt;p&gt;&lt;a href="http://github.com/defunkt/textmate.el"&gt;TextMate Minor Mode&lt;/a&gt; is an&lt;br /&gt;
Emacs minor mode that emulates some awesome TextMate features.&lt;/p&gt;
&lt;p&gt;Like ⌘T (find file in project).&lt;/p&gt;
&lt;div align="center"&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20081202-ftygk17r4eepyst2be45daxars.png" alt="" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And ⇧⌘T (go to symbol in file).&lt;/p&gt;
&lt;div align="center"&gt;
&lt;p&gt;&lt;img src="http://img.skitch.com/20081202-kf5965ruf94muuee6ip1y53ype.png" alt="" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And more! Really, the&lt;br /&gt;
&lt;a href="http://github.com/defunkt/textmate.el/tree/master/README.markdown"&gt;&lt;span class="caps"&gt;README&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
says it all.&lt;/p&gt;
&lt;p&gt;Installation:&lt;/p&gt;
&lt;pre&gt;
$ cd ~/.emacs.d/vendor
$ git clone git://github.com/defunkt/textmate.el.git
&lt;/pre&gt;
&lt;p&gt;In your emacs config:&lt;/p&gt;
&lt;pre&gt;
(add-to-list 'load-path "~/.emacs.d/vendor/textmate.el")
(require 'textmate)
(textmate-mode)
&lt;/pre&gt;
&lt;p&gt;Or just grab the elisp: &lt;a href="http://github.com/defunkt/textmate.el/raw/master/textmate.el"&gt;textmate.el&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TextMate Minor Mode was written for &lt;a href="http://aquamacs.org/"&gt;Aquamacs&lt;/a&gt;&lt;br /&gt;
but works great on console Emacs, &lt;span class="caps"&gt;CVS&lt;/span&gt; Emacs.app and Carbon Emacs.  Try&lt;br /&gt;
it today!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Why Lisp Failed</title>
   <link href="http://ozmm.org/posts/why_lisp_failed.html" />
   <updated>2008-12-01T00:00:00-08:00</updated>
   <id>http://ozmm.org//posts/why_lisp_failed</id>
   <content type="html">&lt;p&gt;Emacs.&lt;/p&gt;
&lt;p&gt;Writing Lisp without Emacs is just too painful. If your language&lt;br /&gt;
depends on specific features of a specific editor, you better be a big&lt;br /&gt;
company like Sun or Microsoft with the mad moneys. Otherwise forget it.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Learning Your Editor</title>
   <link href="http://ozmm.org/posts/learning_your_editor.html" />
   <updated>2008-11-19T00:00:00-08:00</updated>
   <id>http://ozmm.org//posts/learning_your_editor</id>
   <content type="html">&lt;p&gt;Text editors should take a lesson from video games. In many games, you have access to subset of total weapons, powers, whatever. As you advance and master the basic weapons, more weapons become available to you. By the end of the game you have direct experience with all or most of the weapons &amp;#8211; from basic to advanced.&lt;/p&gt;
&lt;p&gt;How many times have you done something cool or strange in Vim only to think, &amp;#8220;How did I do that?&amp;#8221; &lt;code&gt;video-game-mode&lt;/code&gt; would be a fun way to learn an editor: start with the basic commands and unlock more as you progress.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Singin' Singletons</title>
   <link href="http://ozmm.org/posts/singin_singletons.html" />
   <updated>2008-11-18T00:00:00-08:00</updated>
   <id>http://ozmm.org//posts/singin_singletons</id>
   <content type="html">&lt;p&gt;There&amp;#8217;s stuff I just don&amp;#8217;t understand. David Bowie, for instance. Or the Southern Hemisphere. But nothing quite boggles my mind like Ruby&amp;#8217;s &lt;code&gt;Singleton&lt;/code&gt;. Because really, it&amp;#8217;s totally unnecessary.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s what &lt;em&gt;they&lt;/em&gt; want you to do with your code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;net/http&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# first you setup your singleton&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cheat&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Singleton&lt;/span&gt;
  
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;
    &lt;span class="vi"&gt;@host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://cheat.errtheblog.com/&amp;#39;&lt;/span&gt;
    &lt;span class="vi"&gt;@http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@host&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/s/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# then you use it&lt;/span&gt;
&lt;span class="no"&gt;Cheat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;migrations&amp;#39;&lt;/span&gt;
&lt;span class="no"&gt;Cheat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;yahoo_ceo&amp;#39;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;But that&amp;#8217;s crazy. Fight the power.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;net/http&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# here&amp;#39;s how we roll&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Cheat&lt;/span&gt;
  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;host&lt;/span&gt;
    &lt;span class="vi"&gt;@host&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://cheat.errtheblog.com/&amp;#39;&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;
    &lt;span class="vi"&gt;@http&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="no"&gt;Net&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/s/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# then you use it&lt;/span&gt;
&lt;span class="no"&gt;Cheat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;migrations&amp;#39;&lt;/span&gt;
&lt;span class="no"&gt;Cheat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;singletons&amp;#39;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Any why not? The &lt;span class="caps"&gt;API&lt;/span&gt; is more concise, the code is easier to test, mock, and stub, and it&amp;#8217;s still dead simple to convert into a proper class should the need arise.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Pretty Fixtures</title>
   <link href="http://ozmm.org/posts/pretty_fixtures.html" />
   <updated>2008-11-18T00:00:00-08:00</updated>
   <id>http://ozmm.org//posts/pretty_fixtures</id>
   <content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# in whatever test helper you use&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TestCase&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;defunkt&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:defunkt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;github&lt;/span&gt;
    &lt;span class="n"&gt;repositories&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:github&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# in your tests&lt;/span&gt;
&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;A user&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;belongs to a repository&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;assert_equal&lt;/span&gt; &lt;span class="n"&gt;defunkt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Somethin&amp;#8217; like that.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Sugar</title>
   <link href="http://ozmm.org/posts/sugar.html" />
   <updated>2008-10-30T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/sugar</id>
   <content type="html">&lt;p&gt;The console is part of your app. Treat yourself right.&lt;/p&gt;
&lt;script src="http://gist.github.com/21160.js"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;&lt;br /&gt;
$ ./console &lt;br /&gt;
Loading production environment (Rails 2.0.2)&lt;br /&gt;
&amp;gt;&amp;gt; me = User / :defunkt&lt;br /&gt;
=&amp;gt; #&amp;lt;User id: 2, &amp;#8230; &amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; repo = User / :defunkt / :gist&lt;br /&gt;
=&amp;gt; #&amp;lt;Repository id: 61713, &amp;#8230; &amp;gt;&lt;br /&gt;
&lt;/pre&gt;&lt;/noscript&gt;
&lt;script src="http://gist.github.com/21162.js"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;&lt;br /&gt;
User.instance_eval do&lt;br /&gt;
  def /(name)&lt;br /&gt;
    find_by_login(name.to_s)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Repository.instance_eval do&lt;br /&gt;
  def /(name)&lt;br /&gt;
    find_by_name(name.to_s)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;/pre&gt;&lt;/noscript&gt;</content>
 </entry>
 
 <entry>
   <title>Good Homes Found</title>
   <link href="http://ozmm.org/posts/good_homes_found.html" />
   <updated>2008-10-29T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/good_homes_found</id>
   <content type="html">&lt;p&gt;After &lt;a href="http://ozmm.org/posts/good_homes_wanted.html"&gt;putting out the call&lt;/a&gt;, a few developers interested in taking up sad, abandoned projects of mine stepped forward.&lt;/p&gt;
&lt;p&gt;Thanks to the following for giving these projects good homes:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://github.com/dustin"&gt;dustin&lt;/a&gt; for taking over mofo&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/gaustin"&gt;gaustin&lt;/a&gt; for taking over Choice&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/postmodern"&gt;postmodern&lt;/a&gt; for taking over Sake&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/bpauly"&gt;bpauly&lt;/a&gt; for taking over cache_fu&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Good Homes Wanted</title>
   <link href="http://ozmm.org/posts/good_home_wanted.html" />
   <updated>2008-10-22T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/good_home_wanted</id>
   <content type="html">&lt;p&gt;The following projects need a good home. Interested in taking over?&lt;br /&gt;
Let me know.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://github.com/defunkt/acts_as_textiled"&gt;acts_as_textiled&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/defunkt/cache_fu"&gt;cache_fu&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/defunkt/choice"&gt;choice&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/defunkt/facebox"&gt;facebox&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/defunkt/fixture_scenarios_builder"&gt;fixture_scenarios_builder&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/defunkt/mofo"&gt;mofo&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://github.com/defunkt/sake"&gt;sake&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>When GitHub goes down...</title>
   <link href="http://ozmm.org/posts/when_github_goes_down.html" />
   <updated>2008-10-08T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/when_github_goes_down</id>
   <content type="html">&lt;h3&gt;What if my GitHub repository is corrupted or deleted?&lt;/h3&gt;
&lt;p&gt;Don&amp;#8217;t Panic!  Because of the distributed nature of git, everyone always has a local full copy of the repository, complete with history.  Any of your repositories, assuming they have been kept up to date, can be uploaded to the GitHub repository with no loss of data.&lt;/p&gt;
&lt;p&gt;If the universe is conspiring against you and all copies of your repository are unaccessible, just email support@github.com &amp;#8211; we keep offsite, encrypted backups of all repositories.&lt;/p&gt;
&lt;h3&gt;How can I share my repository if GitHub goes down?&lt;/h3&gt;
&lt;p&gt;Luckily, git has a &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-daemon.html"&gt;built in server&lt;/a&gt; for sharing git repositories.  If you have several repositories in your Code directory:&lt;/p&gt;
&lt;pre&gt;
/Users/Matt/Documents/Code/
  rbvimeo/
  rubyzilla/
&lt;/pre&gt;
&lt;p&gt;You can serve all of these with the following command:&lt;/p&gt;
&lt;pre class="console"&gt;
git daemon --base-path=/Users/Matt/Documents/Code/ --export-all
&lt;/pre&gt;
&lt;p&gt;The repositories can then be cloned using the address of your computer&lt;/p&gt;
&lt;pre class="console"&gt;
git clone git://127.0.0.1/rbvimeo
git clone git://127.0.0.1/rubyzilla
&lt;/pre&gt;
&lt;p&gt;Note: The default port git uses is 9418.  Make sure that your firewall is set up to handle this.&lt;/p&gt;
&lt;h3&gt;How can I get a quick web interface?&lt;/h3&gt;
&lt;p&gt;You can run git instaweb to quickly start a network-accessible gitweb interface, for example:&lt;/p&gt;
&lt;pre class="console"&gt;
git instaweb --httpd=webrick
&lt;/pre&gt;
&lt;h3&gt;How do I deploy my application with Capistrano when GitHub is down?&lt;/h3&gt;
&lt;p&gt;There are quite a few ways to deploy without github&amp;#8230; ah the wonders of git!&lt;/p&gt;
&lt;h3&gt;Deploy from a local git server&lt;/h3&gt;
&lt;p&gt;Set up your repositories to be shared using git-daemon as detailed above.  Set your capistrano config files to point the repository to your local repository:&lt;/p&gt;
&lt;pre&gt;
set :repository, "git://YOUR_IP/rails-app"
&lt;/pre&gt;
&lt;p&gt;You can now deploy your repository as normal.&lt;/p&gt;
&lt;h3&gt;Push over ssh&lt;/h3&gt;
&lt;p&gt;Another handy trick is to push the repo to your deploy server over ssh, then deploy using the local path.  For this to work, you need ssh access to your deploy server, of course.&lt;/p&gt;
&lt;pre class="console"&gt;
git remote add deployserver ssh://myuser@myserver.com/~/myrepo
git push deployserver master
&lt;/pre&gt;
&lt;p&gt;Assuming your users are stored in &lt;code&gt;/home&lt;/code&gt;&amp;#8230;&lt;/p&gt;
&lt;pre&gt;set :repository, "/home/myuser/myrepo"&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Java in Ruby</title>
   <link href="http://ozmm.org/posts/java_in_ruby.html" />
   <updated>2008-07-24T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/java_in_ruby</id>
   <content type="html">&lt;p&gt;Witness as Ruby dons the fake mustache and bifocals of burly Java:&lt;/p&gt;
&lt;script src="http://gist.github.com/1837.js?nonum=1"&gt;&lt;/script&gt;</content>
 </entry>
 
 <entry>
   <title>Twitter Images</title>
   <link href="http://ozmm.org/posts/twitter_images.html" />
   <updated>2008-07-23T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/twitter_images</id>
   <content type="html">&lt;div align="center"&gt;
&lt;p&gt;&lt;img src="http://twictur.es/images/twictures/866687410.gif" /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I wanted an easy way to share tweets in Campfire. &lt;a href="http://twitter.com/shayarnett"&gt;@shayarnett&lt;/a&gt; delivered.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href="http://twictur.es/"&gt;http://twictur.es/&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>GitHub is Running Erlang</title>
   <link href="http://ozmm.org/posts/github_is_running_erlang.html" />
   <updated>2008-07-14T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/github_is_running_erlang</id>
   <content type="html">&lt;p&gt;It&amp;#8217;s true.  Read &lt;a href="http://github.com/blog/112-supercharged-git-daemon"&gt;the blog post&lt;/a&gt; &amp;#8211; we now serve all public git repos via Erlang.  We&amp;#8217;re trying hard to fit as many buzzwords as possible into our architecture.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>_why on GitHub</title>
   <link href="http://ozmm.org/posts/_why_on_github.html" />
   <updated>2008-07-13T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/_why_on_github</id>
   <content type="html">&lt;p&gt;The &lt;a href="http://poignantguide.net/ruby/"&gt;Poignant Guide&lt;/a&gt; is how I learned Ruby.  &lt;a href="http://redhanded.hobix.com/"&gt;RedHanded&lt;/a&gt; made me want to start blogging.  Projects like Shoes inspire me to keep hacking for hacking&amp;#8217;s sake.&lt;/p&gt;
&lt;div align="center"&gt;
&lt;img src="http://img.skitch.com/20080714-gsmbp1hrdggibjrx15rupiwmku.png"/&gt;
&lt;/div&gt;
&lt;p&gt;The lucky stiff has been on GitHub for a while, but just yesterday added all his projects.  Check it: &lt;a href="http://github.com/why"&gt;http://github.com/why&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hardcore.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Classic Metronome</title>
   <link href="http://ozmm.org/posts/classic_metronome.html" />
   <updated>2008-07-02T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/classic_metronome</id>
   <content type="html">&lt;div class="photo"&gt;
&lt;a href="http://flickr.com/photos/ozmm/2631667641"&gt;
&lt;img src="http://farm4.static.flickr.com/3088/2632491408_b09cd69344.jpg?v=0"/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class="photo"&gt;
&lt;a href="http://flickr.com/photos/ozmm/2632491408/"&gt;
&lt;img src="http://farm4.static.flickr.com/3048/2631667641_f6458f3e62.jpg?v=0"/&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;No batteries required.  Awesome.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>He's such a great blogger</title>
   <link href="http://ozmm.org/posts/hes_a_great_blogger.html" />
   <updated>2008-06-28T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/hes_a_great_blogger</id>
   <content type="html">&lt;p&gt;We must be careful to not confuse the prolific with the profound.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Queerer Than We Can Suppose</title>
   <link href="http://ozmm.org/posts/queerer_than_we_can_suppose.html" />
   <updated>2008-06-25T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/queerer_than_we_can_suppose</id>
   <content type="html">&lt;p&gt;By far my favorite &lt;span class="caps"&gt;TED&lt;/span&gt; talk.  Worth watching every few months to remind us how unique this experience we all share really is.&lt;/p&gt;
&lt;div align="center"&gt;
&lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1APOxsp1VFw&amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1APOxsp1VFw&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Mac Software I Bought</title>
   <link href="http://ozmm.org/posts/mac_software_i_bought.html" />
   <updated>2008-06-23T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/mac_software_i_bought</id>
   <content type="html">&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://agilewebsolutions.com/products/1Password"&gt;1Password&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://flyingmeat.com/acorn/"&gt;Acorn&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://rogueamoeba.com/airfoil/"&gt;Airfoil&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.guitar-pro.com/en/index.php"&gt;Guitar Pro&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.obdev.at/products/launchbar/index.html"&gt;LaunchBar&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I really wish I could pay for &lt;a href="http://skitch.com/"&gt;Skitch&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The Power of the Toe-Dip</title>
   <link href="http://ozmm.org/posts/the_power_of_the_toedip.html" />
   <updated>2008-06-19T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/the_power_of_the_toedip</id>
   <content type="html">&lt;p&gt;jQuery has &lt;code&gt;jQuery.noConflict()&lt;/code&gt;.  Just slip jQuery into your existing project and try it out &amp;#8211; dip your toe in.  There&amp;#8217;s no obligation.  You can always remove it and go back to Prototype.&lt;/p&gt;
&lt;p&gt;Git has &lt;code&gt;git-svn&lt;/code&gt;.  Just start using Git with your existing &lt;span class="caps"&gt;SVN&lt;/span&gt; repository and try it out &amp;#8211; dip your toe in.  There&amp;#8217;s no obligation.  You can always go back to raw &lt;span class="caps"&gt;SVN&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;While not the only cool feature these projects possess, the toe-dip factor is undeniably huge.  I started with both &lt;code&gt;jQuery.noConflict()&lt;/code&gt; and &lt;code&gt;git-svn&lt;/code&gt;.  I bet most converts did, too.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Profiling jQuery Apps</title>
   <link href="http://ozmm.org/posts/profiling_jquery_apps.html" />
   <updated>2008-06-16T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/profiling_jquery_apps</id>
   <content type="html">&lt;p&gt;Again, &lt;a href="http://ejohn.org/blog/deep-profiling-jquery-apps/"&gt;John Resig is the man&lt;/a&gt;.  Even cooler that his example uses GitHub.  Sorry about my crappy JS &amp;#8211; now I have no excuse not to optimize it.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the &lt;a href="http://dev.jquery.com/~john/plugins/profile/github.com.html"&gt;GitHub example&lt;/a&gt;.  Run &lt;code&gt;jQuery.displayProfile()&lt;/code&gt; in Firebug to see it in action.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Two programmers walk into a bar...</title>
   <link href="http://ozmm.org/posts/two_programmers_walk_into_a_bar.html" />
   <updated>2008-06-12T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/two_programmers_walk_into_a_bar</id>
   <content type="html">&lt;p&gt;One of them says, &amp;#8220;My framework couldn&amp;#8217;t do what I wanted, so I extended it.&amp;#8221;&lt;/p&gt;
&lt;p&gt;The other says, &amp;#8220;My framework couldn&amp;#8217;t do what I wanted, so I implemented the feature in app code.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Get it?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Should?</title>
   <link href="http://ozmm.org/posts/should.html" />
   <updated>2008-06-12T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/should</id>
   <content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;should ping a user&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;ping&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pings a user&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;ping&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Tell, don&amp;#8217;t ask.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Love Bank of America</title>
   <link href="http://ozmm.org/posts/love_bank_of_america.html" />
   <updated>2008-06-04T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/love_bank_of_america</id>
   <content type="html">&lt;p&gt;Here&amp;#8217;s the story:&lt;/p&gt;
&lt;p&gt;I opened a new Bank of America account and, naturally, ordered checks.  They never arrived.  I went into the bank and asked them for more, and if they could cancel the &lt;span class="caps"&gt;MIA&lt;/span&gt; block.  Nope.  They can only cancel checks for a certain amount of time, not indefinitely.  I needed to open a new bank account.&lt;/p&gt;
&lt;p&gt;Okay, that&amp;#8217;s fine.  But my rent is almost due.  If I open the new account today, can I immediately cut a check?  &amp;#8220;Yes!&amp;#8221;  Okay, great.  As long as my check doesn&amp;#8217;t bounce.  I love my landlord and would hate to pull a stunt like that.&lt;/p&gt;
&lt;p&gt;New account opened, new temporary checks received, and hey, I even get to keep my old check card.  Score.  I drop off my rent check on time and all is well.&lt;/p&gt;
&lt;p&gt;Two days later, I decide to deposit a check I just received.  The nice teller asks, &amp;#8220;Which account would you like this deposited in?&amp;#8221;  Well, I only have one account.  &amp;#8220;Actually, you have three.&amp;#8221;   What?  Okay, put it in the one with all the money in it.  I&amp;#8217;ll talk to a personal banker and make sure the others are being closed.&lt;/p&gt;
&lt;p&gt;Except, nothing is being closed.  And no money was transferred.  The account with all the money in it is my &lt;span class="caps"&gt;OLD&lt;/span&gt; account.  The new account is empty.  And no, there&amp;#8217;s no transaction pending &amp;#8211; the money &lt;span class="caps"&gt;WAS&lt;/span&gt; transferred, then was transferred back.  What the hell?  (Thanks for the email or phone call letting me know.)  The personal banker has no idea why.&lt;/p&gt;
&lt;p&gt;I go home and transfer the money online.  It&amp;#8217;s supposedly instant.  Let&amp;#8217;s hope the rent doesn&amp;#8217;t bounce.&lt;/p&gt;
&lt;p&gt;(As far as distributing money goes, I do in fact have a second checking account, but I just emptied that sucker paying taxes.  Emptied, of course, because I never had checks for the new Bank of America account.)&lt;/p&gt;
&lt;p&gt;So yeah, Bank of America sucks.  I think I may be moving back to Wamu or using Patelco, Charles Schwab, or eTrade &amp;#8211; all of these were recommended &lt;br /&gt;
today.  I moved away from Wamu because there is no branch near my apartment, but I think not hating my bank outweighs proximity.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The Bang</title>
   <link href="http://ozmm.org/posts/the_bang.html" />
   <updated>2008-05-26T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/the_bang</id>
   <content type="html">&lt;p&gt;I was checking out &lt;a href="http://www.ryanlowe.ca/blog/"&gt;Ryan Lowe&amp;#8217;s&lt;/a&gt; &lt;a href="http://github.com/ryanlowe/save_or_raise/tree/master"&gt;save_or_raise&lt;/a&gt; project today and stumbled upon this quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ruby methods that end with an exclamation point are a signal that they change the object they operate on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is not true.  A common misconception.&lt;/p&gt;
&lt;p&gt;The Ruby stdlib uses bang methods to identify a more dangerous version of a non-bang method.  For example, &lt;code&gt;Hash#merge!&lt;/code&gt; is the &amp;#8216;dangerous&amp;#8217; version of &lt;code&gt;Hash#merge&lt;/code&gt; &amp;#8211; the former affects the receiver while the latter does not.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Hash#update&lt;/code&gt;, the bangless alias for &lt;code&gt;Hash#merge!&lt;/code&gt;, illustrates the other side of this idiom.  No counterpart, no bang.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Cocoa Proggin' in Nu</title>
   <link href="http://ozmm.org/posts/cocoa_proggin_in_nu.html" />
   <updated>2008-05-26T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/cocoa_proggin_in_nu</id>
   <content type="html">&lt;p&gt;Tim Burks continues to make it easy to dip your toe into Nu via his brilliant guerilla tactics.  Case in point: the new &lt;a href="http://github.com/timburks/cocoa-programming-with-nu"&gt;Cocoa Programming with Nu&lt;/a&gt; repository on GitHub.&lt;/p&gt;
&lt;p&gt;For this project, Tim (and the Nu community) has taken Objective-C examples from Aaron Hillegass&amp;#8217; &lt;a href="http://www.amazon.com/gp/product/0321503619/"&gt;Cocoa Programming for Mac OS X&lt;/a&gt; and translated them into Nu.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s Nu?  It&amp;#8217;s an object oriented &lt;span class="caps"&gt;LISP&lt;/span&gt; implemented in Objective-C.  As such, simply integrates into your Cocoa apps.  &lt;a href="http://github.com/timburks/cocoa-programming-with-nu/tree/master/28_WebServices/AmaZone/nu/main.nu"&gt;Check some of the code&lt;/a&gt; to see Nu in action.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve already purchased Hillegass&amp;#8217; book and will be trying out both the Obj-C and Nu examples when I have time.  Can&amp;#8217;t wait.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Brutalism</title>
   <link href="http://ozmm.org/posts/brutalism.html" />
   <updated>2008-05-26T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/brutalism</id>
   <content type="html">&lt;div class="photo"&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Brutalism"&gt;&lt;br /&gt;
&lt;img src="http://upload.wikimedia.org/wikipedia/commons/f/f5/Geisel_library.jpg" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Erb Eval</title>
   <link href="http://ozmm.org/posts/erb_eval.html" />
   <updated>2008-05-21T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/erb_eval</id>
   <content type="html">&lt;p&gt;Because I always forget how to do it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;erb&amp;#39;&lt;/span&gt;

&lt;span class="nb"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bob&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;whatever, &amp;lt;%= name %&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;ERB&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Useful for sticking Ruby into config files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;YAML&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ERB&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config_file&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>How are rubies cut?</title>
   <link href="http://ozmm.org/posts/how_are_rubies_cut.html" />
   <updated>2008-05-08T00:00:00-07:00</updated>
   <id>http://ozmm.org//posts/how_are_rubies_cut</id>
   <content type="html">&lt;p&gt;Master Rubyist Charles Nutter recently posted an entry titled &lt;a href="http://headius.blogspot.com/2008/04/rubyists-are-wrong.html"&gt;The Rubyists are wrong&lt;/a&gt;.  Wrong about the way rubies featured in our Ruby logos are cut.&lt;/p&gt;
&lt;p&gt;My father has worked in the jewelry business for over 30 years.  As soon as I read Charles&amp;#8217; article, I wondered what Pop would think.  So, I emailed him.&lt;/p&gt;
&lt;p&gt;Here is his response:&lt;/p&gt;
&lt;blockquote&gt;

&lt;p&gt;[Charles] is close, but he missed it. The diamond part is correct. But in my&lt;br /&gt;
experience and having worked with diamonds and color all over the world&lt;br /&gt;
there is one common thread in the cutting of any color stone. Diamonds are&lt;br /&gt;
cut for brilliance and yield. Any color stone is cut into a shape which will&lt;br /&gt;
bring out the color to its upmost beauty and at the same time maximize the&lt;br /&gt;
yield of the rough. That is why you see more cushion shapes and ovals in&lt;br /&gt;
rubies.  But you usually only see those in larger stones.  The majority of&lt;br /&gt;
the small stones are round. So, I would have to say the round cut is cut the&lt;br /&gt;
most. Also, the round cut is different from the diamond brilliant cut.&lt;br /&gt;
Faceting is done to bring out the color in the color stones. So, there&lt;br /&gt;
really isn&amp;#8217;t a facet count on round color like a diamond would have.&lt;br /&gt;
Also, all of the Ruby logos are correct. If that was the best way to cut the&lt;br /&gt;
rough to maximize the color than it&amp;#8217;s possible a cutter would use any of the&lt;br /&gt;
shapes, including the JRuby logo. Yes, a lot of color stones are cut off&lt;br /&gt;
center or in a nonsymmetrical shape.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thanks Dad.&lt;/p&gt;</content>
 </entry>
 
 
</feed>
