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

<channel>
	<title>jBoxer</title>
	<atom:link href="http://jboxer.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jboxer.com</link>
	<description>I change the directions of small pieces of metal for a living.</description>
	<lastBuildDate>Sun, 28 Feb 2010 00:54:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>The most idiotic opinion on Google Buzz so far</title>
		<link>http://jboxer.com/2010/02/the-most-idiotic/</link>
		<comments>http://jboxer.com/2010/02/the-most-idiotic/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 00:54:07 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[opinion]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=327</guid>
		<description><![CDATA[I&#8217;ve read many opinions on Google Buzz over the past month. Some are smart, some aren&#8217;t. Today, I read one that takes the cake, as far as idiocy goes. From the article:
I&#8217;m not a social networking fan, anyway, and to break my GMail, my primary email account, with something as stupid and useless as Buzz; [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve read many opinions on Google Buzz over the past month. Some are smart, some aren&#8217;t. Today, I read <a href="http://www.daniweb.com/news/story263209.html">one</a> that takes the cake, as far as idiocy goes. From the article:</p>
<blockquote><p>I&#8217;m not a social networking fan, anyway, and to break my GMail, my primary email account, with something as stupid and useless as Buzz; I&#8217;m irritated. I usually wake up to 20 or more emails in my Inbox first thing in the morning. Today, I had one. Yes, one. I&#8217;ve sent numerous messages out today and I don&#8217;t know if they&#8217;re swirling about in some mail queue or if they&#8217;ve reached their destinations. Thanks Buzz. Thanks a lot.</p>
<p>I&#8217;m not sure that Google&#8217;s tech people realized how much bandwidth a service like this uses. It&#8217;s a lot. Just ask Twitter. It&#8217;s especially bandwidth hungry because, unlike Twitter, Buzz doesn&#8217;t limit you to 140 characters.</p></blockquote>
<p>The insinuation that Buzz is responsible for his low email count this morning is utterly ridiculous. Does he think that Buzz has created some magical black hole in Teh Google&#8217;s intarwebz that&#8217;s sucking up his email?</p>
<p>Also, the whole &#8220;bandwidth&#8221; thing is beyond stupid. Yeah, I&#8217;m sure Google&#8217;s tech people (the folks behind Youtube) don&#8217;t know much about bandwidth.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2010/02/the-most-idiotic/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>My doorbell is better than your &#8220;Please Rob Me&#8221;</title>
		<link>http://jboxer.com/2010/02/my-doorbell-is-better-than-your-please-rob-me/</link>
		<comments>http://jboxer.com/2010/02/my-doorbell-is-better-than-your-please-rob-me/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 18:34:18 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[location aware]]></category>
		<category><![CDATA[please rob me]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=324</guid>
		<description><![CDATA[&#8220;Hey man, I know you really like Foursquare, but you should check out this new site called Please Rob Me. Foursquare is actually really dangerous, cuz now it&#8217;s easy for robbers to know when you&#8217;re not at your house!&#8221;
I&#8217;m a Foursquare user, and I&#8217;ve heard variations of this from over a dozen of my friends [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>&#8220;Hey man, I know you really like <a href="http://foursquare.com/">Foursquare</a>, but you should check out this new site called <a href="http://pleaserobme.com/">Please Rob Me</a>. Foursquare is actually really dangerous, cuz now it&#8217;s easy for robbers to know when you&#8217;re not at your house!&#8221;</p></blockquote>
<p>I&#8217;m a Foursquare user, and I&#8217;ve heard variations of this from over a dozen of my friends in the past 24 hours. For the record, I think &#8220;Please Rob Me&#8221; is a really funny and creative idea, and I love that they made it. However, anyone who is legitimately giving privacy/security advice over this is being ridiculous.</p>
<p>First of all, <em>most people</em> are out of the house from 9am to 5pm. Robbers know this, and Foursquare checkins don&#8217;t change it.</p>
<p>Second, there&#8217;s absolutely zero indication of whether or not anyone else is home, or how soon you&#8217;ll be getting back. These are much more crucial pieces of knowledge than &#8220;a single person was not in his house at this time&#8221;.</p>
<p>Last, and most important, a superior technology has existed for decades: the doorbell. Run around a neighborhood ringing doorbells of houses that look like they might be vacated, and break into the ones that no one answers.</p>
<blockquote><p>&#8220;Oh but people don&#8217;t answer their doorbell every time, so a robber might break into an occupied house!&#8221;</p></blockquote>
<p>Right. Just like people don&#8217;t have to actually be at a place to check into it on Foursquare, and like how checking in on Foursquare doesn&#8217;t mean no one else is home. There are potential false positives with both methods (and if there weren&#8217;t, people would be getting robbed a lot more). The point is, breaking in based on doorbell-ringing is much less dangerous than doing it based on Foursquare checkins, as it&#8217;s reasonably likely that no one is home if no one answers the doorbell</p>
<p>In reality, privacy via anonymity has always been a pretty shaky concept. Yes, checking into Foursquare does give robbers one more tool to make their job easier, but in the face of much better tools (like the doorbell), it&#8217;s negligible. If you chose to be a Foursquare user in the first place, Please Rob Me should have no impact on your decision.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2010/02/my-doorbell-is-better-than-your-please-rob-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The best point about the iPad so far</title>
		<link>http://jboxer.com/2010/01/the-best-point-about-the-ipad-so-far/</link>
		<comments>http://jboxer.com/2010/01/the-best-point-about-the-ipad-so-far/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 16:46:16 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[multitasking]]></category>
		<category><![CDATA[slashdot]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=317</guid>
		<description><![CDATA[So far, the best point I&#8217;ve read about the iPad has come from a Slashdot comment:
It&#8217;s not about &#8220;do more things,&#8221; it&#8217;s about &#8220;do very few things better.&#8221;

That&#8217;s why Apple wins.

My wife asked about the iPad last night (she owns a netbook right now) and now she&#8217;s drooling over one. Why? It doesn&#8217;t have &#8220;files.&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>So far, the best point I&#8217;ve read about the iPad has come from <a href="http://linux.slashdot.org/comments.pl?sid=1529896&#038;cid=30950700">a Slashdot comment</a>:</p>
<blockquote><p>It&#8217;s not about &#8220;do more things,&#8221; it&#8217;s about &#8220;do very few things better.&#8221;<br />
<br />
That&#8217;s why Apple wins.<br />
<br />
My wife asked about the iPad last night (she owns a netbook right now) and now she&#8217;s drooling over one. Why? It doesn&#8217;t have &#8220;files.&#8221; It doesn&#8217;t have &#8220;windows.&#8221; She won&#8217;t have to worry about &#8220;flash drives.&#8221; And so on. She was so excited about all the things it didn&#8217;t have (and that she therefore didn&#8217;t have to worry about) that she was disappointed when I told her they weren&#8217;t in the Apple Store in Manhattan yet.<br />
<br />
Meanwhile, the geeks are running around blasting Apple products for all the things they &#8220;don&#8217;t have&#8221; and recommending complex alternatives.<br />
<br />
That&#8217;s why Apple is making $$$ these days. Because they&#8217;re removing 60 percent of the features and making the remaining 40 percent configuration free and so polished they make your eyes hurt.</p></blockquote>
<p>I said similar things to people who were upset about the lack of multitasking, but this guy really hits the nail on the head.</p>
<p>I think too many people wanted another iPhone launch. The iPhone, if you think about it, was actually an aberration as far as Apple products go; the iPhone did more than most phones (though at that point, smartphones were less popular in general), and somehow still managed to do almost everything really well. Compare this to Apple&#8217;s launch of the iPod. <a href="http://apple.slashdot.org/article.pl?sid=01/10/23/1816257">The iconic response from geeks</a>:</p>
<blockquote><p>No wireless. Less space than a nomad. Lame.</p></blockquote>
<p>We all know how that one turned out.</p>
<p>The fact of the matter is, aside from the iPhone, Apple has <em>always</em> released products that do less, and do it better. Us geeks may be offended by the &#8220;do less&#8221; part, but the average consumer loves it, and that&#8217;s why Apple will continue to launch into controversy and leave geeks looking foolish a couple years later.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2010/01/the-best-point-about-the-ipad-so-far/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The importance of attr_accessible in Ruby on Rails</title>
		<link>http://jboxer.com/2010/01/the-importance-of-attr_accessible-in-ruby-on-rails/</link>
		<comments>http://jboxer.com/2010/01/the-importance-of-attr_accessible-in-ruby-on-rails/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 19:21:21 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[attr_accessible]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authlogic]]></category>
		<category><![CDATA[models]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=309</guid>
		<description><![CDATA[I&#8217;m sure this has been written about ad nauseum, but I spent some time yesterday explaining it to someone who didn&#8217;t understand, and now I feel like writing it up a bit more formally.
What is attr_accessible?
In Ruby on Rails, attr_accessible allows you to specify which attributes of a model can be altered via mass-assignment (most [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sure this has been written about ad nauseum, but I spent some time yesterday explaining it to someone who didn&#8217;t understand, and now I feel like writing it up a bit more formally.</p>
<h2>What is attr_accessible?</h2>
<p>In Ruby on Rails, <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002281">attr_accessible</a> allows you to specify which attributes of a model can be altered via mass-assignment (most notably by <code>update_attributes(attrs)</code> and <code>new(attrs)</code>). Any attribute names you pass as parameters will be alterable via mass-assignment, and all others won&#8217;t be.</p>
<h2>How does mass-assignment work normally?</h2>
<p>By default, mass-assignment methods accept a hash of attribute values, each keyed by their associated attribute&#8217;s name. If I ran the following code:</p>
<pre class="brush: ruby;">User.new({ :name =&gt; 'Harry Potter', :email =&gt; 'hp@hp.com' })</pre>
<p>A new instance of the <code>User</code> model would be created, and the <code>name</code> and <code>email</code> attributes would be set accordingly. It can also be used to alter related models. For example:</p>
<pre class="brush: ruby;">User.new({
  :name =&gt; 'Albus Dumbledore',
  :is_teacher =&gt; true,
  :course_ids =&gt; [1, 2, 3] })</pre>
<p>In addition to creating a user with the appropriate attributes, this will update the specified courses to be owned by this user(assuming a user <code>has_many</code> courses in our app).</p>
<h2>How can this be abused?</h2>
<p>Very easily. What if someone did this:</p>
<pre class="brush: ruby;">User.new({ :name =&gt; 'Draco Malfoy', :is_teacher =&gt; true })</pre>
<p>This Draco Malfoy fellow may not actually be a teacher, but the system is none the wiser. Of course, the developer would never code this; in a real Rails app, the code is going to look like this:</p>
<pre class="brush: ruby;">User.new(params[:user])</pre>
<p>The elements in <code>params[:user]</code> are taken from the POST/GET/PUT data passed along when the action was run. They&#8217;re thrown blindly into the mass-assignment, and any attributes whose names match the keys will be set.</p>
<p><em>&#8220;So what&#8217;s the big deal? Just don&#8217;t include an &#8216;is_teacher&#8217; field in the web form, and the param won&#8217;t be there.&#8221;</em> This is true for innocent users, but the malicious ones (and Draco Malfoy is definitely a malicious one) have an easy way around this. A web form is just a way to make it easy for users to pass data to your app. There are other ways. For example, if I wanted to register for the app via the command line instead of a browser, I could do it like this:</p>
<p><code>curl -d "user[name]=Harry Potter&#038;user[email]=hp@hp.com" \<br />http://myapp.com/users/</code></p>
<p>This sends a request to <code>http://myapp.com/users/</code> and passes data in the exact format it would&#8217;ve appeared if I&#8217;d filled out a web form that asked for a name and email address. However, I could also do this:</p>
<p><code>curl -d \<br />"user[name]=Draco Malfoy&#038;user[email]=m@hp.com&#038;user[is_teacher]=1" \<br />http://myapp.com/users/</code></p>
<p>Since <code>is_teacher</code> is an attribute name in my User model, and mass-assignment methods blindly accept whatever attributes they see, Draco Malfoy has just set himself a teacher.</p>
<p>Even worse, I could use this to grab courses that may not be mine.</p>
<p><code>curl -d \<br />"user[name]=Draco Malfoy&#038;user[course_ids]=1&#038;user[course_ids]=2" \<br />http://myapp.com/users/</code></p>
<p>Draco Malfoy has now taken courses 1 and 2 away from whoever they originally belonged to (Dumbledore, if my memory serves me) and given them to himself.</p>
<h2>How can we prevent this?</h2>
<p>There are a few obvious but clumsy ways. We could skip mass assignment, setting each individual attribute in our controller, but this will introduce a lot of duplicate and unnecessary code. We could explicitly pull unwanted parameters out:</p>
<pre class="brush: ruby;">params.delete(:is_teacher)
params.delete(:course_ids)</pre>
<p>This also introduces a lot of duplicate code. If we ever add new columns that we want to restrict, or decide we want to unrestrict a column, we&#8217;re going to have to go through the <code>create</code> and <code>update</code> actions, and any others that perform mass assignment.</p>
<p>We could factor these out into some sort of <code>sanitize_params</code> method on each model. This is a better solution, but you still have to call it in every action that alters the data. It&#8217;s definitely not as good as the built-in one: <code>attr_accessible</code>. We can add this to the top of the <code>User</code> model:</p>
<pre class="brush: ruby;">attr_accessible :name, :email</pre>
<p>This white-lists <code>name</code> and <code>email</code>; these two attributes will be accepted from a mass-assignment method, while <em>all others</em> will be ignored. This is by far the safest way to do it; only attributes you&#8217;ve explicitly allowed (which hopefully means you&#8217;ve thought carefully about them) can be set by mass-assignment. This way, if some intern comes along and adds a bunch of dangerous columns or relations (<code>payment_accepted</code> or <code>horcruxes</code>, for example), no one has to think about updating the <code>sanitize</code> methods.</p>
<h2>What does this <em>not</em> do?</h2>
<p>I saw one person say &#8220;Why would I put anything in <code>attr_accessible</code>? Why would I want any of my attributes to be hackable?&#8221;</p>
<p>Make no mistake: <code>attr_accessible</code> is no substitution for proper access control. If all users have write access to all other users, <code>attr_accessible</code> will let one user change another&#8217;s <code>name</code> attribute if it&#8217;s specified. Regular authentication and access control must be used to prevent users from writing to model instances that they shouldn&#8217;t be able to write to. Once this is done correctly, <code>attr_accessible</code> can be used to prevent a malicious user from altering data of her own that she shouldn&#8217;t be able to alter.</p>
<p>To be more clear, it could be considered &#8220;hacking&#8221; if a user were able to change everyone&#8217;s <code>name</code> to &#8220;Voldemort&#8221;. <code>attr_accessible</code> can&#8217;t prevent this; you need to do proper authentication with something like <a href="http://github.com/binarylogic/authlogic">Authlogic</a>. Once you&#8217;ve set your controllers up to prevent a user from even attempting to change another user&#8217;s data, you&#8217;ve prevented this &#8220;hack&#8221;.</p>
<p>If the user tries to change <em>his own</em> name to &#8220;Voldemort&#8221;, that&#8217;s totally fine. We don&#8217;t care if he does it via the web app, curl, or anything else; users are allowed to change their own name. Including <code>:name</code> in <code>attr_accessible</code> isn&#8217;t making it &#8220;hackable&#8221;, because it&#8217;s an attribute that users <em>should</em> be able to change.</p>
<p>If the user tries to change his <code>is_teacher</code> attribute from <code>false</code> to <code>true</code>, that&#8217;s also considered &#8220;hacking&#8221;. We don&#8217;t want to let users do this, so we exclude <code>:is_teacher</code> from <code>attr_accessible</code> to prevent it.</p>
<h2>Are attributes excluded from attr_accessible immutable?</h2>
<p><strong>No. They can still be altered, just not via mass-assignment.</strong> If I exclude <code>is_teacher</code> from <code>attr_accessible</code>, and I go:</p>
<pre class="brush: ruby;">hagrid = User.first(:conditions =&gt; { :name =&gt; 'Rubeus Hagrid' })
hagrid.is_teacher = true
hagrid.save</pre>
<p>That will work just fine. The difference is, it forces you to set the attribute explicitly, so there&#8217;s no potential of accidentally setting an attribute unexpectedly passed to mass-assignment. This way, I can allow my non-dangerous attributes to be set via mass-assignment with <code>attr_accessible</code>, then explicitly provide or deny control over dangerous attributes in other actions.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2010/01/the-importance-of-attr_accessible-in-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prototype analog to jQuery&#8217;s $(document).ready</title>
		<link>http://jboxer.com/2010/01/prototype-analog-to-jquerys-document-ready/</link>
		<comments>http://jboxer.com/2010/01/prototype-analog-to-jquerys-document-ready/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 23:18:00 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[document.ready]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=304</guid>
		<description><![CDATA[I have a lot of experience with jQuery, but less with Prototype. Recently, I needed to add some event handlers to some elements in a Ruby on Rails app I&#8217;m building. I searched for how to do the equivalent of jQuery&#8217;s $(document).ready() function in Prototype so that I could add the handlers after the document [...]]]></description>
			<content:encoded><![CDATA[<p>I have a lot of experience with jQuery, but less with Prototype. Recently, I needed to add some event handlers to some elements in a Ruby on Rails app I&#8217;m building. I searched for how to do the equivalent of jQuery&#8217;s <code>$(document).ready()</code> function in Prototype so that I could add the handlers after the document loaded, but most of the guides I found were out of date (I&#8217;m running Prototype 1.6.0.3, and I don&#8217;t know which version these guides were for, but they all made my Javascript console angry).</p>
<p>Eventually, I was able to piece it together after digging through <a href="http://api.prototypejs.org/dom/document.html#observe-class_method">the</a> <a href="http://api.prototypejs.org/dom/event.html#observe-class_method">depths</a> of the Prototype API documentation. It&#8217;s actually very simple:</p>
<pre class="brush: jscript;">
document.observe('dom:loaded', function(){
	// do yo thang...
});
</pre>
<p>Wrap whatever you&#8217;re doing with that, and it won&#8217;t be run until the document is loaded.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2010/01/prototype-analog-to-jquerys-document-ready/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Ruby on Rails 2.3+ plugins from github</title>
		<link>http://jboxer.com/2010/01/installing-ruby-on-rails-2-3-plugins-from-githu/</link>
		<comments>http://jboxer.com/2010/01/installing-ruby-on-rails-2-3-plugins-from-githu/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 05:02:21 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[10.6]]></category>
		<category><![CDATA[authlogic]]></category>
		<category><![CDATA[carmen]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[os x]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=298</guid>
		<description><![CDATA[I&#8217;ve been banging my head against this wall for quite awhile now, and I just finally figured out the answer. Like I&#8217;ve done in other posts, I&#8217;ll just post what worked for me, and hopefully it&#8217;ll help other people.
I&#8217;m running Ruby 1.9 and Ruby on Rails 2.3.3 on Snow Leopard. I&#8217;ve been trying to install [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been banging my head against this wall for quite awhile now, and I just finally figured out the answer. Like I&#8217;ve done in other posts, I&#8217;ll just post what worked for me, and hopefully it&#8217;ll help other people.</p>
<p>I&#8217;m running Ruby 1.9 and Ruby on Rails 2.3.3 on Snow Leopard. I&#8217;ve been trying to install plugins (specifically, <a href="http://github.com/binarylogic/authlogic">Authlogic</a> and <a href="http://github.com/jim/carmen">Carmen</a>) for a couple days now using the following two commands (as taken from the main github pages):</p>
<pre class="brush: bash;">script/plugin install git://github.com/binarylogic/authlogic.git
script/plugin install git://github.com/jim/carmen.git</pre>
<p>In return, I received the following errors:</p>
<pre class="brush: bash;">Plugin not found: [&quot;git://github.com/binarylogic/authlogic.git&quot;]
Plugin not found: [&quot;git://github.com/jim/carmen.git&quot;]</pre>
<p>After a lot of poking around, it turns out you need to make two changes in order for this to work on Rails 2.3 or higher: change the <code>git://</code> at the beginning of each URL to <code>http://</code>, and add a trailing slash to the end of each URL. So instead, run these:</p>
<pre class="brush: bash;">script/plugin install http://github.com/binarylogic/authlogic.git/
script/plugin install http://github.com/jim/carmen.git/</pre>
<p>They both worked perfectly for me, so hopefully they&#8217;ll work for you. If not, leave a comment and I&#8217;ll try to help.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2010/01/installing-ruby-on-rails-2-3-plugins-from-githu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Erlang on Snow Leopard</title>
		<link>http://jboxer.com/2010/01/installing-erlang-on-snow-leopard/</link>
		<comments>http://jboxer.com/2010/01/installing-erlang-on-snow-leopard/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 21:22:23 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[10.6]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[os x]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=288</guid>
		<description><![CDATA[Here&#8217;s another in my series of &#8220;Installing X on Snow Leopard&#8221;. These aren&#8217;t official, well-tested guides; they&#8217;re just documentations of my attempts to compile and install various things on my personal computer. My last one (Installing MySQL on Snow Leopard) is my most popular post to date (aside from a couple that have been on [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s another in my series of &#8220;Installing X on Snow Leopard&#8221;. These aren&#8217;t official, well-tested guides; they&#8217;re just documentations of my attempts to compile and install various things on my personal computer. My last one (<a href="http://jboxer.com/2009/09/installing-mysql-on-snow-leopard/">Installing MySQL on Snow Leopard</a>) is my most popular post to date (aside from a couple that have been on Reddit). Erlang is less popular than MySQL, but hopefully this will still help a few people.</p>
<h3>Downloading and unpacking</h3>
<p>Go to http://erlang.org/download.html and download the Source for the newest version (when I was writing this, that was <strong><a href="http://erlang.org/download/otp_src_R13B03.tar.gz">R13B03</a></strong>. After downloading, extract it to somewhere that&#8217;s convenient to get to with the Terminal.</p>
<h3>Configure</h3>
<p>Open the Terminal and <code>cd</code> into the directory you extracted Erlang to (mine was <strong>/Users/jake/src/otp_src_R13B03</strong> . Then run the following command:</p>
<p><code>./configure \<br />
    --prefix=/usr/local/ \<br />
    --enable-smp-support \<br />
    --enable-threads \<br />
    --enable-darwin-64bit</code></p>
<p><strong>Note:</strong> You will probably get <strong>three errors</strong>. Read about them in the <a href="#configuration-errors">Configuration Errors</a> section coming up.</p>
<p>The first three configure options are the defaults according to the README. However, I&#8217;ve had experiences where supposed defaults aren&#8217;t really the defaults when compiled on OS X, so I don&#8217;t like to take chances. <code>--enable-darwin-64bit</code> enables experimental support for the 64bit x86 Darwin binaries. This may not be necessary, but in general, 64-bit stuff has fewer problems on Snow Leopard, so I figured this was a good idea.<br />
<a name="configuration-errors"></a></p>
<h3>Configuration Errors</h3>
<p>I got the following configuration errors:</p>
<pre>jinterface    : No Java compiler found
wx            : Can not combine 64bits erlang with wxWidgets on
                MacOSX, wx will not be useable
documentation : fop is missing. The documentation can not be built.</pre>
<p>These aren&#8217;t a problem. If you get any errors besides these, you&#8217;re in trouble. Leave a comment, and I&#8217;ll see if I can help.</p>
<h3>Making and installing</h3>
<p>These two commands shouldn&#8217;t give you any trouble:</p>
<p><code>make</code></p>
<p>And then, after <code>make</code> is done:</p>
<p><code>sudo make install</code></p>
<p>If you get any errors at either of these stages, leave a comment and I&#8217;ll try to help.</p>
<h3>Making sure it works</h3>
<p><strong>Note:</strong> This canonical test is gratefully borrowed from <a href="http://erlang.org/quick_start.html">erlang.org</a>.</p>
<p>Put the following into a text file:</p>
<pre class="brush: erlang;">-module(test).
-export([fac/1]).

fac(0) -&gt; 1;
fac(N) -&gt; N * fac(N-1).</pre>
<p>Save it as <code>test.erl</code> in a directory that&#8217;s easy to get to with the Terminal. Then, from the Terminal, <code>cd</code> into that directory and type <code>erl</code> (which, if everything worked right, should start the Erlang command-line interpreter). From the interpreter, run the following commands: </p>
<p><code>1> c(test).<br />
{ok,test}<br />
2> test:fac(20).<br />
2432902008176640000<br />
3> test:fac(40).<br />
815915283247897734345611269596115894272000000000</code></p>
<p><strong>Note:</strong> Lines starting with <code>N></code> (where N is a number) are lines you should type (but just type the stuff coming after <code>N></code>). The other lines represent output.</p>
<p><code>c(test).</code> compiles test.erl (assuming it&#8217;s in the directory you <code>cd</code>&#8216;ed into). <code>test:fac(20).</code> and <code>test:fac(40).</code> runs your factorial function.</p>
<p>So, that&#8217;s what worked for me. If anyone has any problems along the way, leave a comment and I&#8217;ll try to help.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2010/01/installing-erlang-on-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>The most important part of Google&#8217;s open letter</title>
		<link>http://jboxer.com/2009/12/the-most-important-part-of-googles-open-letter/</link>
		<comments>http://jboxer.com/2009/12/the-most-important-part-of-googles-open-letter/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 04:21:32 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[open]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=286</guid>
		<description><![CDATA[Today, Google published a previously internal email. It talks about the important of openness within the company. I thought it was extremely well-written, and brought up a lot of great and thought-provoking points. However, one part in particular really stuck out to me:
So if you are trying to grow an entire industry as broadly as [...]]]></description>
			<content:encoded><![CDATA[<p>Today, Google <a href="http://googleblog.blogspot.com/2009/12/meaning-of-open.html">published a previously internal email</a>. It talks about the important of openness within the company. I thought it was extremely well-written, and brought up a lot of great and thought-provoking points. However, one part in particular really stuck out to me:</p>
<blockquote><p>So if you are trying to grow an entire industry as broadly as possible, open systems trump closed. And that is exactly what we are trying to do with the Internet. <strong>Our commitment to open systems is not altruistic. Rather it&#8217;s good business</strong>, since an open Internet creates a steady stream of innovations that attracts users and usage and grows the entire industry.</p></blockquote>
<p>Generally, when a company professes its love for openness or charity or something similar, it does so with an airy &#8220;because we&#8217;re so nice&#8221; attitude, and must be read with a grain of salt. This paragraph (and the explanations that followed) were extremely refreshing. There are very few philanthropic claims in this letter; it explains exactly why Google sees value in openness, and how it helps their business.</p>
<p>I really enjoyed reading this piece, but it was this aspect that allowed it to be enjoyable. Without it, it&#8217;s just another fluff piece. With it, it becomes a powerful explanation of Google&#8217;s actions and intents.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2009/12/the-most-important-part-of-googles-open-letter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snide remarks against women in technology</title>
		<link>http://jboxer.com/2009/12/snide-remarks-against-women-in-technology/</link>
		<comments>http://jboxer.com/2009/12/snide-remarks-against-women-in-technology/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 18:33:38 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[kathy sierra]]></category>
		<category><![CDATA[quote]]></category>
		<category><![CDATA[robert scoble]]></category>
		<category><![CDATA[women]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=283</guid>
		<description><![CDATA[&#8220;It&#8217;s this culture of attacking women that has especially got to stop. Whenever I post a video of a female technologist there invariably are snide remarks about body parts and other things that simply wouldn&#8217;t happen if the interviewee were a man.&#8221;
- Blogger Robert Scoble, responding to threats against tech author Kathy Sierra
]]></description>
			<content:encoded><![CDATA[<p>&#8220;It&#8217;s this culture of attacking women that has especially got to stop. Whenever I post a video of a female technologist there invariably are snide remarks about body parts and other things that simply wouldn&#8217;t happen if the interviewee were a man.&#8221;<br />
- Blogger <a href="http://en.wikipedia.org/wiki/Robert_Scoble">Robert Scoble</a>, responding to threats against tech author <a href="http://en.wikipedia.org/wiki/Kathy_Sierra">Kathy Sierra</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2009/12/snide-remarks-against-women-in-technology/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dreaming of Floyd-Warshall</title>
		<link>http://jboxer.com/2009/12/dreaming-of-floyd-warshall/</link>
		<comments>http://jboxer.com/2009/12/dreaming-of-floyd-warshall/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 16:44:50 +0000</pubDate>
		<dc:creator>Jake Boxer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[dreams]]></category>
		<category><![CDATA[floyd-warshall]]></category>
		<category><![CDATA[tables]]></category>
		<category><![CDATA[the hobbit]]></category>

		<guid isPermaLink="false">http://jboxer.com/?p=276</guid>
		<description><![CDATA[Last night, I was studying the Floyd-Warshall algorithm. I finished at around 11:30, read a little of The Hobbit (I&#8217;m rereading it in preparation for the movie), then went to bed.
I dreamed that I was sitting inside a table cell. I was looking up above and watching the empty cells above me get filled in [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, I was studying <a href="http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm">the Floyd-Warshall algorithm</a>. I finished at around 11:30, read a little of The Hobbit (I&#8217;m rereading it in preparation for the movie), then went to bed.</p>
<p>I dreamed that I was sitting inside a table cell. I was looking up above and watching the empty cells above me get filled in one at a time. The last cell in a row would fill with some gibberish, and then the first cell in the next row would fill. The filling was getting closer and closer to me. Eventually, my cell was filled (I remember feeling very stressed at this point). I looked forward, and watched my neighbors fill. I looked under me, and watched the cells beneath me fill.</p>
<p>Suddenly, I was off on the sidelines, watching another table (that I was not a part of) get filled. Soon after this, the dream ended.</p>
<p>I can only conclude that, in my dream, I was a member of one of the cells in one of the tables of the Floyd-Warshall algorithm. Once the table I was in was filled, the algorithm incremented <code>k</code> and started on a new table.</p>
<p>I notice that I never saw a third table. Perhaps I was in table <code>k == n - 1</code>, and the table in front of me was the last one. Or perhaps this particular version of Floyd-Warshall was optimized (as it should be) to use <code>O(|V^2|)</code> space, and my table (and thus, my life) was deleted from memory after its successor was filled.</p>
<p>Or perhaps I just have really deep-rooted issues, and dreaming about being inside an algorithm is nature&#8217;s way of warning me that I should see someone.</p>
]]></content:encoded>
			<wfw:commentRss>http://jboxer.com/2009/12/dreaming-of-floyd-warshall/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
