<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>stinkrag.com: Steve Koppelman's Dumping Ground for Tech Notes</title>
	<atom:link href="http://stinkrag.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://stinkrag.wordpress.com</link>
	<description>a stultifying annex to hatless.com</description>
	<lastBuildDate>Sat, 09 Jun 2007 18:52:12 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='stinkrag.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/52cbef550e65a51e57f52dfa738c7c61?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>stinkrag.com: Steve Koppelman's Dumping Ground for Tech Notes</title>
		<link>http://stinkrag.wordpress.com</link>
	</image>
			<item>
		<title>IMified: on the vanguard of human-computer interaction!</title>
		<link>http://stinkrag.wordpress.com/2007/06/09/imified-on-the-vanguard-of-human-computer-interaction/</link>
		<comments>http://stinkrag.wordpress.com/2007/06/09/imified-on-the-vanguard-of-human-computer-interaction/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 18:52:12 +0000</pubDate>
		<dc:creator>hatless</dc:creator>
				<category><![CDATA[Compuserve]]></category>
		<category><![CDATA[IM]]></category>
		<category><![CDATA[IMified]]></category>
		<category><![CDATA[Other Tech]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://stinkrag.wordpress.com/2007/06/09/imified-on-the-vanguard-of-human-computer-interaction/</guid>
		<description><![CDATA[A colleague sent me a message titled &#8220;IM as the new command line&#8221;. It was a link to IMified, an single instant-messaging gateway to things like to-dos, reminders, stock quotes and, through an API for creating other gateways, numerous third-party sites like Google Calendar, Basecamp, Twitter and stuff.
The UI has some web aspects, as for [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=15&subd=stinkrag&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A colleague sent me a message titled &#8220;IM as the new command line&#8221;. It was a link to IMified, an single instant-messaging gateway to things like to-dos, reminders, stock quotes and, through an API for creating other gateways, numerous third-party sites like Google Calendar, Basecamp, Twitter and stuff.</p>
<p>The UI has some web aspects, as for the directory of available widgets, creation of custom shortcuts and so on. But the main interface, the one in IM?</p>
<p>Numbered menus.</p>
<p>With &#8220;B&#8221; to go &#8220;back&#8221; to the previous menu and &#8220;M&#8221; to go back to the main menu.</p>
<p>That&#8217;s right:</p>
<p><img src="http://stinkrag.files.wordpress.com/2007/06/imified-cap.png" alt="1981 all over again." /></p>
<p>It&#8217;s Compuserve, circa 1981, <em>down to typing &#8220;M&#8221; to go to the main menu! </em></p>
<p>No Sam Goody online store offering vinyl and cassettes yet, and they <em>do</em> have lowercase support, which is very fancy.</p>
<p>I do think it&#8217;s a coincidence, though. If they really were ripping off Compuserve, each service would have a predefined keyword you could use to access it directly, like &#8220;GO REMINDERS&#8221; to jump straight to the reminder service, &#8220;GO QUOTES&#8221; to get stock quotes, etc. No such staggering feats of productivity-enhancement here yet. Give them time, though. They&#8217;ll stumble on the idea sooner or later.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/stinkrag.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/stinkrag.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/stinkrag.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/stinkrag.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/stinkrag.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/stinkrag.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/stinkrag.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/stinkrag.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/stinkrag.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/stinkrag.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/stinkrag.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/stinkrag.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=15&subd=stinkrag&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://stinkrag.wordpress.com/2007/06/09/imified-on-the-vanguard-of-human-computer-interaction/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/550bd144abedf3cf5a1bb62ccb52550b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">hatless</media:title>
		</media:content>

		<media:content url="http://stinkrag.files.wordpress.com/2007/06/imified-cap.png" medium="image">
			<media:title type="html">1981 all over again.</media:title>
		</media:content>
	</item>
		<item>
		<title>Apache on Vista</title>
		<link>http://stinkrag.wordpress.com/2007/06/01/apache-on-vista/</link>
		<comments>http://stinkrag.wordpress.com/2007/06/01/apache-on-vista/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 17:33:04 +0000</pubDate>
		<dc:creator>hatless</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Other Tech]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://stinkrag.wordpress.com/2007/06/01/apache-on-vista/</guid>
		<description><![CDATA[No doubt this will get fixed in the next few months. Probably. But at the time of this writing in early June of &#8216;07, the official Apache 2.2 installer fails to install the Apache service and the Apache Monitor applet won&#8217;t run at all. But you can get it to work if you do the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=12&subd=stinkrag&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>No doubt this will get fixed in the next few months. Probably. But at the time of this writing in early June of &#8216;07, the official Apache 2.2 installer fails to install the Apache service and the Apache Monitor applet won&#8217;t run at all. But you can get it to work if you do the following (h/t some person on some forum I found via Google):</p>
<ol>
<li>Disable User Access Control, the Vista feature that protects you from malware by dimming the display and asking you if you&#8217;re SURE you want to do anything to your system, every five minutes or so. You can do this vai a link in the Users and Groups control panel.</li>
<li>Reboot so the above takes effect.</li>
<li>Install Apache</li>
<li>Re-enable UAC if you want. Reboot.</li>
<li>Use Apache.</li>
</ol>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/stinkrag.wordpress.com/12/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/stinkrag.wordpress.com/12/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/stinkrag.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/stinkrag.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/stinkrag.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/stinkrag.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/stinkrag.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/stinkrag.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/stinkrag.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/stinkrag.wordpress.com/12/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/stinkrag.wordpress.com/12/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/stinkrag.wordpress.com/12/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=12&subd=stinkrag&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://stinkrag.wordpress.com/2007/06/01/apache-on-vista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/550bd144abedf3cf5a1bb62ccb52550b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">hatless</media:title>
		</media:content>
	</item>
		<item>
		<title>Pitfalls of Parsing</title>
		<link>http://stinkrag.wordpress.com/2006/12/11/pitfalls-of-parsing/</link>
		<comments>http://stinkrag.wordpress.com/2006/12/11/pitfalls-of-parsing/#comments</comments>
		<pubDate>Mon, 11 Dec 2006 17:08:37 +0000</pubDate>
		<dc:creator>hatless</dc:creator>
				<category><![CDATA[My sites]]></category>
		<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://stinkrag.wordpress.com/2006/12/11/pitfalls-of-parsing/</guid>
		<description><![CDATA[I was pretty pleased with myself a few days ago. I was staring down some badly-formed HTML pages containing real estate listings that I needed to scrape in order to include direct links to a few properties at koppelmanteam.com. Using a tidy, standards-compliant XML parser was out of the question. When I tried to load [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=8&subd=stinkrag&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I was pretty pleased with myself a few days ago. I was staring down some badly-formed HTML pages containing real estate listings that I needed to scrape in order to include direct links to a few properties at <a href="http://www.koppelmanteam.com/">koppelmanteam.com</a>. Using a tidy, standards-compliant XML parser was out of the question. When I tried to load a page into one, I got an eyeful of error messages starting with the abesnce of an XML DTD declaration. Tags didn&#8217;t close properly. Barely anything had a Class or ID, and the few that did didn&#8217;t have the attribute values quoted properly. This was no good.</p>
<p><a href="http://www.crummy.com/software/RubyfulSoup/">RubyfulSoup</a> was just what the doctor ordered. Within a half-hour of tinkering and making the best of so-so documentation, I was pulling out prices, MLS numbers, image URLs and all that other good stuff via syntax something like</p>
<p><code>doc.html.find_all('table')[4].each do |tr|<br />
&nbsp;&nbsp;listing['price'] = tr.find_all('td')[3].string<br />
end</code></p>
<p>Not too shabby.</p>
<p>Like a good lad, I put the data on each property in a data structure. First I used Structs, then I tried a simple custom class, then I arrived on keeping it simple with a hash. Then I bundled the hashes of a whole set of properties into an outer hash. Armed with my hash of hashes, the next step was to store them.</p>
<p>Since I&#8217;m not building an MLS search engine and simply wanted to be able to display these lists of properties as-is, there was no need to create ActiveRecord objects to store the individual properties&#8217; information. All I needed was a way to store and retrieve the entire hash.</p>
<p>Enter ActiveRecord&#8217;s <em>serialize</em> declaration, which would automagically serialize my hash into a text column in the database. I&#8217;m using the acts_as_commentable plugin to store these search objects, so I had to put the declaration elsewhere, but for a normal AR model, it&#8217;s as simple as something like:</p>
<p><code>class Feed &gt; ActiveRecord::Base<br />
&nbsp;&nbsp;belongs_to :community<br />
&nbsp;&nbsp;serialize :search_results<br />
end</code></p>
<p>Easy as pie! Except it didn&#8217;t work.</p>
<p>Debugging and hair-pulling ensued. I tried serializing other things to the field, which worked perfectly fine. I tried serializing data structures that resembled my real one: hashes of strings, hashes of hashes, all fine. Eventually, after clearing away a few other bugs, it was still complaining that I was trying to serialize a Proc, which is a no-no. What? It was a hash of hashes of strings, right? I wasn&#8217;t creating anything with a custom constructor. What gave?</p>
<p>When I constructed a hash of hashes seemingly just like the ones I was generating and <em>that</em> serialized, it finally dawned on me: RubyfulSoup was the culprit.</p>
<p>I went into the Rails console, generated one of the real hashes of hashes that was failing, and started examining the members of the inner hashes with Object#class. And there it was. The RubyfulSoup #string method wasn&#8217;t returning Strings. It was returning instances of its own custom class, a NavigableString. Which made sense, of course. How else would one of the &lt;TR&gt; elements magically respond to a #find_all method to pull the &lt;TD&gt; tags inside it?</p>
<p>Duh.</p>
<p>So <code>tr.find_all('td')[3].string</code> became <code>tr.find_all('td')[3].string.to_s</code> and all was well in the world.</p>
<p>If you ain&#8217;t returning a String, don&#8217;t call the method #string, I say.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/stinkrag.wordpress.com/8/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/stinkrag.wordpress.com/8/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/stinkrag.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/stinkrag.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/stinkrag.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/stinkrag.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/stinkrag.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/stinkrag.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/stinkrag.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/stinkrag.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/stinkrag.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/stinkrag.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=8&subd=stinkrag&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://stinkrag.wordpress.com/2006/12/11/pitfalls-of-parsing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/550bd144abedf3cf5a1bb62ccb52550b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">hatless</media:title>
		</media:content>
	</item>
		<item>
		<title>Converting a Struct&#8217;s key-value pairs into a Hash</title>
		<link>http://stinkrag.wordpress.com/2006/11/27/converting-a-structs-key-value-pairs-into-a-hash/</link>
		<comments>http://stinkrag.wordpress.com/2006/11/27/converting-a-structs-key-value-pairs-into-a-hash/#comments</comments>
		<pubDate>Tue, 28 Nov 2006 04:45:21 +0000</pubDate>
		<dc:creator>hatless</dc:creator>
				<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://stinkrag.wordpress.com/2006/11/27/converting-a-structs-key-value-pairs-into-a-hash/</guid>
		<description><![CDATA[There&#8217;s some pre-alpha software I&#8217;ve been messing with. The company has its own proprietary object store that works more or less like an extended XML store, with XQuery as the basis for the main query language. They&#8217;ve put together the beginnings of an ActiveRecord-like data access layer that allows things like:
g = Gorilla.find(:first, :conditions =&#62; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=6&subd=stinkrag&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>There&#8217;s some pre-alpha software I&#8217;ve been messing with. The company has its own proprietary object store that works more or less like an extended XML store, with XQuery as the basis for the main query language. They&#8217;ve put together the beginnings of an ActiveRecord-like data access layer that allows things like:</p>
<p><code>g = Gorilla.find(:first, :conditions =&gt; 'name ftcontains "Magilla"')<br />
</code><br />
So far so good. But</p>
<p><code>g.attributes</code></p>
<p>returns an error, so it&#8217;s not quite an AR-alike. The data that comes back gets returned in a much more complex object with all sorts of pointers and metadata on each top-level element. For the sake of sanity, the subset of name-value pairs most developers will be interested in, analagous to AR attributes, are accessible as an array returned by <code>g.keys</code> and g.values, or as pairs returned by <code>g.each</code>. In other words, it currently behaves more or less like a Struct &#8212; except that while <code>g.height</code> will return a value, it also doesn&#8217;t respond to things like <code>g[:height]</code>, so right now it&#8217;s kinda-sorta like a half-implemented Struct, but being half-implemented maybe there&#8217;s a chance to make it act more AR-like.</p>
<p>One key part of AR is its elegant handling of relations. In this spirit, I set out on some initial exploration into what it would take to access a monkey&#8217;s or gorilla&#8217;s uncles via <code>g.uncles</code> (which right now would just return a pointer to another of these Struct-like representations of XML). I first wanted to begin getting those name-value pairs into a concise AR-like hash of their own. After some trial and error and a look through the pickaxe book, I arrived at this:</p>
<p><code>h = {}<br />
g.each {|a,b| h.merge!({a,b}) }</code></p>
<p>and now, glory be, after this, h contains a hash of name-value pairs of the attributes. Traversing the pointers to referenced external objects to get nested hashes of Uncle-attributes inside <code>g.uncles</code> will be another story entirely, to say nothing of getting these things to act more like AR objects, mind you&#8230;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/stinkrag.wordpress.com/6/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/stinkrag.wordpress.com/6/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/stinkrag.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/stinkrag.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/stinkrag.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/stinkrag.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/stinkrag.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/stinkrag.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/stinkrag.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/stinkrag.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/stinkrag.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/stinkrag.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=6&subd=stinkrag&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://stinkrag.wordpress.com/2006/11/27/converting-a-structs-key-value-pairs-into-a-hash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/550bd144abedf3cf5a1bb62ccb52550b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">hatless</media:title>
		</media:content>
	</item>
		<item>
		<title>Consumer Guide to Rails Plugins, Part I</title>
		<link>http://stinkrag.wordpress.com/2006/10/12/consumer-guide-to-rails-plugins-part-i/</link>
		<comments>http://stinkrag.wordpress.com/2006/10/12/consumer-guide-to-rails-plugins-part-i/#comments</comments>
		<pubDate>Fri, 13 Oct 2006 03:28:48 +0000</pubDate>
		<dc:creator>hatless</dc:creator>
				<category><![CDATA[Consumer Guide]]></category>
		<category><![CDATA[Ruby/Rails]]></category>

		<guid isPermaLink="false">http://stinkrag.wordpress.com/2006/10/12/consumer-guide-to-rails-plugins-part-i/</guid>
		<description><![CDATA[acts_as_commentable: It&#8217;s easy to add to an existing application. It works as advertised: any object can have comments associated with it. It&#8217;s super-useful. If you&#8217;re developing anything that involves comments, like a commerce site with reviews, a CRM tool, a collaboration site or any number of other things, it&#8217;s pretty swell. It&#8217;s also very lightly [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=5&subd=stinkrag&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>acts_as_commentable: </strong>It&#8217;s easy to add to an existing application. It works as advertised: any object can have comments associated with it. It&#8217;s super-useful. If you&#8217;re developing anything that involves comments, like a commerce site with reviews, a CRM tool, a collaboration site or any number of other things, it&#8217;s pretty swell. It&#8217;s also very lightly documented, and since it&#8217;s a plugin, it&#8217;s a bit constrained in how one can go about extending it beyond simply adding more fields, short of modifying the plugin. I&#8217;m using it to hold comments and system-generated log entries (like status changes) for the same objects, and I&#8217;d love to be able to use single-table inheritance to segregate the custom finders and different validations required by each one, instead of cluttering application.rb or an external library with clunky helper methods. Then again, maybe I just haven&#8217;t tried hard enough. Either way, it&#8217;s pretty swell. <strong>GRADE: A MINUS</strong><br />
<span style="font-weight:bold;">login_engine/user_engine (from <a href="http://www.rails-engines.org/">rails-engines.org</a>): </span> They&#8217;re fussy. The underlying Engines plugin that they run on top of breaks with every significant new update to Rails. Once it&#8217;s up and going, the Engines approach is nifty: extending the engines is as simple as overriding or adding methods to models and controllers you create in your own application, all without having to mess with the plugins themselves. Does it work? Yep. LoginEngine does rudimentary account management, lost-password recovery and basic access control at the application, controller or method level, and UserEngine adds simple role-based authentication. Am I using it in production? Yep. Well, LoginEngine, anyway. After a while, it became clear that the UserEngine approach to RBAC didn&#8217;t really fit where <a href="http://www.flhomeprices.com/">FLHomeprices </a>was going, so while I haven&#8217;t actually removed it from the app yet, I&#8217;m doing my administrative access control with my own methods. Frankly, the whole clever-hack aspect of Engines is a turnoff. Unless it becomes part of the Rails core, it&#8217;s vulnerable to being abandoned sometime down the road and may cause problems for applications that depend on it. For my next project, I&#8217;m probably going to write my own athentication and authorization framework so I&#8217;m not as dependent on someone else&#8217;s fragile code. That said, LoginEngine is the most polished drop-in authentication module I&#8217;ve tried, and if time is of the essence, it&#8217;s not bad. <span style="font-weight:bold;">GRADE: B PLUS</span></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/stinkrag.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/stinkrag.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/stinkrag.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/stinkrag.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/stinkrag.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/stinkrag.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/stinkrag.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/stinkrag.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/stinkrag.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/stinkrag.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/stinkrag.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/stinkrag.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=stinkrag.wordpress.com&blog=472440&post=5&subd=stinkrag&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://stinkrag.wordpress.com/2006/10/12/consumer-guide-to-rails-plugins-part-i/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/550bd144abedf3cf5a1bb62ccb52550b?s=96&#38;d=identicon" medium="image">
			<media:title type="html">hatless</media:title>
		</media:content>
	</item>
	</channel>
</rss>