<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-13762456</id><updated>2010-01-05T23:47:02.073-05:00</updated><title type='text'>The reality of my fantasy life</title><subtitle type='html'>A rambling blog from Arron, a scrawny little dork who likes to code. ;)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default?start-index=26&amp;max-results=25'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>188</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13762456.post-5735638669054937237</id><published>2010-01-04T23:39:00.003-05:00</published><updated>2010-01-05T23:47:02.080-05:00</updated><title type='text'>Ubuntu makes you a software snob.</title><content type='html'>&lt;div&gt;(&lt;b&gt;update:&lt;/b&gt; some dude addresses my concerns about GetDeb &lt;a href="http://handypenguin.blogspot.com/2010/01/some-questions-and-answers-about-getdeb.html"&gt;here&lt;/a&gt;.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Seriously.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After having used Ubuntu on both my netbook for almost a year now, it's turned me into a total software snob.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For instance, right now, &lt;i&gt;at this very moment&lt;/i&gt;, I'm not installing Songbird. Now, there are plenty of ways to get Songbird on my netbook. But none of them are good enough.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are no official debs. There are no official repositories. If you download Songbird from the &lt;a href="http://www.getsongbird.com/"&gt;official site&lt;/a&gt;, all you get is an archive. Which is fine if you want to unpack it by hand, fiddle with making a desktop short-cut and a menu entry by hand, as well as spending the time to find an OK-looking Songbird icon for the aforementioned short-cuts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;What? Excuse me?&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Seriously, those are the two things that instantly came to mind when I realized that Songbird's official download was a freakin' archive file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The fact that it wasn't available in the Ubuntu repositories wasn't all that bad: there's lots of software out there not in it, simply because there's so much software out there, period. But they don't even have their own official repository? Is Songbird &lt;i&gt;so good&lt;/i&gt; that I'm supposed to do the download-and-extract dance every time a new release comes out?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Shit, I don't even do that with most Windows software -- I've got this copy of PowerArchiver that's almost 3 years old. I get an update alert every time I open it, but I'm not going out of my way to download and install a new copy of it. Sheesh.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's GetDeb, but I'm not using it yet. I've got questions that the GetDeb site doesn't have answers for: who runs it? What releases do they package? Are program authors involved in any way? Are the programs modified before they land in the repository? As an issue of trust, I'm more willing to add repositories like Banshee's official PPA to Software Sources over a third-party I know nothing about.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, yeah. No Songbird for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know that in the time I've written this blog post I probably could have struggled to get Songbird integrated with Ubuntu properly... but that would still leave me with the issue of updating by hand. Something I consider especially annoying in an environment as advanced as Ubuntu. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the upside, Songbird screenshots were pretty to look at, though. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5735638669054937237?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5735638669054937237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=5735638669054937237' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5735638669054937237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5735638669054937237'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/01/ubuntu-makes-you-software-snob.html' title='Ubuntu makes you a software snob.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6951245601121643421</id><published>2009-12-05T01:15:00.004-05:00</published><updated>2009-12-05T01:22:33.386-05:00</updated><title type='text'>Rails source control: to check in db/schema.rb or not? ... Don't do it.</title><content type='html'>&lt;div&gt;The only argument for checking in schema.rb is that it's "faster."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah, OK, whatever. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Don't check it into source control. It just leads to local development problems in the future, and possible production problems if you don't have CI, because cap deploy:migrations is going to run Rails migrations that might be broken because everyone primed the database using rake db:schema:load instead of rake db:migrations. Oh boy, does that sound like fun to you? Because it doesn't sound like fun to me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Local development problems: consider Git, where everyone's got multiple branches. Someone's done some work in master, checked in their changed db/schema.rb. But oops, you've done some migration work too, and so now your db/schema.rb conflicts with the master db/schema.rb, and how do you end up resolving it? By nuking db/schema.rb and then running the new migrations to regenerate the file.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which is an extra, unnecessary step because db/schema.rb is in source control.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hurray.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's just keep db/schema.rb out of source control and save the 5 minutes.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6951245601121643421?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6951245601121643421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=6951245601121643421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6951245601121643421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6951245601121643421'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/12/rails-source-control-to-check-in.html' title='Rails source control: to check in db/schema.rb or not? ... Don&apos;t do it.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5228748527403949491</id><published>2009-10-09T18:06:00.005-04:00</published><updated>2009-10-09T18:21:15.189-04:00</updated><title type='text'>How to hose a Rubygems in one simple step.</title><content type='html'>&lt;div&gt;So, I had the unfortunate mispleasure of having to quickly solve The Mystery of the Hosed Rubygems Installation after installing 1 gem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apparently, the problem was with that gem's .gemspec file, in which the following line:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;s.require_paths = %q{"lib"}&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;was the culprit. That one little caused the entire rubygems system to fail -- &lt;b&gt;require&lt;/b&gt; failed, the `&lt;b&gt;gem&lt;/b&gt;` command failed; basically everything related to Rubygems failed in one spectacular burst of flame.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The solution of course was to change it to&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;s.require_paths = ["lib"]&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem being, Rubygems expects &lt;b&gt;Gem::Specification#require_paths&lt;/b&gt; to always be an array, and, not bothering to check otherwise, tries to call &lt;b&gt;Array#join&lt;/b&gt;. Apparently exceptions raised when parsing a gem's specification aren't caught anywhere in the system, so it hoses the whole thing top to bottom.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5228748527403949491?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5228748527403949491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=5228748527403949491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5228748527403949491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5228748527403949491'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/10/how-to-hose-rubygems-in-one-simple-step.html' title='How to hose a Rubygems in one simple step.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3556948810090576127</id><published>2009-08-29T20:28:00.003-04:00</published><updated>2009-08-29T20:31:00.443-04:00</updated><title type='text'>jQuery.Form and its AJAX file upload gotchas.</title><content type='html'>Hit a few "gotcha, motherfucker!" moments with jQuery.Form while doing AJAX file uploads:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you return an HTTP error, don't return any text (such as error details) -- it'll be interpreted as a successful call and won't handle your error callback.&lt;/li&gt;&lt;li&gt;If you return an HTTP error, don't reply on xhr.status from the error callback -- it'll be an unhelpful 0 for some reason.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Alternatives suck: returning an error code and checking to see what kind of data got returned from the call (is it an 'error' object or a model object?).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3556948810090576127?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3556948810090576127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=3556948810090576127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3556948810090576127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3556948810090576127'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/08/jqueryform-and-its-ajax-file-upload.html' title='jQuery.Form and its AJAX file upload gotchas.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3654988890405022227</id><published>2009-06-10T02:10:00.003-04:00</published><updated>2009-06-10T02:13:27.508-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='localhost'/><category scheme='http://www.blogger.com/atom/ns#' term='sharethis is null'/><category scheme='http://www.blogger.com/atom/ns#' term='sharethis is undefined'/><category scheme='http://www.blogger.com/atom/ns#' term='sharethis'/><category scheme='http://www.blogger.com/atom/ns#' term='sharethis is not defined'/><title type='text'>Argh, ShareThis!</title><content type='html'>Despite it's importance, this problem with &lt;a href="http://sharethis.com"&gt;ShareThis &lt;/a&gt;is almost totally undocumented: if you run your webserver locally and access it via "localhost"then the ShareThis widget won't work. You have to access it by an IP instead (127.0.0.1).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So if you get "SHARETHIS is null," "SHARETHIS is undefined," or "SHARETHIS is not defined," instead of spending an hour and a half pulling your hair out, just breathe deep and remember, there are still people out there who put all their code in a monotholic try/catch and fail silently.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3654988890405022227?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3654988890405022227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=3654988890405022227' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3654988890405022227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3654988890405022227'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/06/argh-sharethis.html' title='Argh, ShareThis!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7518861706847498351</id><published>2009-04-23T15:44:00.002-04:00</published><updated>2009-04-23T15:46:45.016-04:00</updated><title type='text'>Arron on...</title><content type='html'>&lt;a href="http://twitter.com/arronguy"&gt;Arron Washington&lt;/a&gt; on &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://identi.ca/radicaled"&gt;Arron Washington&lt;/a&gt; on a mostly abandoned &lt;a href="http://identi.ca"&gt;identi.ca&lt;/a&gt; account.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://plurk.com/arronwashington"&gt;Arron Washington&lt;/a&gt; on a definitely abandoned &lt;a href="http://plurk.com"&gt;Plurk &lt;/a&gt;account.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I seem to be turning into one of those people that collect social networks like rare Indian coins.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7518861706847498351?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7518861706847498351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=7518861706847498351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7518861706847498351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7518861706847498351'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/04/arron-on.html' title='Arron on...'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7733299220449318391</id><published>2009-04-03T14:21:00.002-04:00</published><updated>2009-04-03T14:21:59.316-04:00</updated><title type='text'>Busy busy!</title><content type='html'>Good Lord, I've been busy all month long and it's only getting worse.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hell, I totally forgot that I had yet to do my taxes until I got some kind of automated email reminder today.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have. Got. To. Keep. Going!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7733299220449318391?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7733299220449318391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=7733299220449318391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7733299220449318391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7733299220449318391'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/04/busy-busy.html' title='Busy busy!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2974331606064928388</id><published>2009-04-01T16:34:00.005-04:00</published><updated>2009-04-01T17:28:56.045-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='working'/><category scheme='http://www.blogger.com/atom/ns#' term='odesk'/><category scheme='http://www.blogger.com/atom/ns#' term='writing'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>How much did I make from oDesk in 2008?</title><content type='html'>I &lt;a href="http://twitter.com/arronguy/status/1433404996"&gt;recently tweeted&lt;/a&gt; that I made most of last year's income from oDesk.com.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, according to my accounting, from oDesk alone I made just shy of $40,000 last year.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's pretty good, considering I took a short break, and when I got back into the swing of things I decided to only work about 20/hrs a week (sometimes more, depending on client need). It helps that I get more things done in 20hrs/wk than some people do for 40hrs/wk, though. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously I could have made way more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But besides being a valuable income stream, oDesk has given me something much more valuable than that: freedom. Freedom to work my own hours, sure, but more importantly, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;freedom to do what I want.&lt;/span&gt; And what I've always wanted to do is be an author. Yes, that's right, Mr. Computer Programmer wants to be Mr. Writer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since I started freelancing, I've never really had the time until recently to unlock all the thoughts bouncing around in my head and unleash them on the world. When I was in college, there were huge gaps between classes that I filled with anime, video games, writing and code. But when I started freelancing, an incessant nagging in the back of my head ('money! money! money!') kept driving me to spend all my free time thinking about work, working on work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My free time became a narrow slot that I could only fill with one thing. Should I play a video game? Read a book, watch an anime, rent a DVD or write? My free time was so thin I felt like I'd cut myself if I wasn't careful with how I used it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When a long term contract on oDesk ended in 2008, I was between jobs with nothing much to do. So I wrote a little as I browsed for jobs; I had enough in my savings account to skate by for months without work, if I wanted. I went back and revisited old works, frowned at how bad they were and toyed with them in my spare time. I kept peeking at job openings, but my A-game was absent when trying to land a few big, "easy" jobs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then I realized something: with my skills and expertises, I didn't &lt;span class="Apple-style-span" style="font-weight: bold; font-style: italic;"&gt;have&lt;/span&gt; to spend every waking moment working. After all, people always need something done. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I said to myself, "Why not split my time between writing and work?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I did.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because with oDesk, I could, and with oDesk, it was simple: apply to jobs that would take less than 20 hours a week. That's it. There are thousands of those jobs on oDesk -- maybe even tens of thousands. When one job ended, there was no mad scramble looking for new work. The market place there is huge. &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;If you have talent&lt;/span&gt; then you've got a job waiting there for you. And me? I've got it up to &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;HERE&lt;/span&gt;, baby. I made a hand symbol just now; you know, the hand at the neck thing to convey how much of &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;IT&lt;/span&gt; I've got.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So, thanks to oDesk I can continue to spend time making kick-ass web stuff for clients, and use the rest to pull out my hair out over my insecurities about my writing or smashing my head against the wall because of writer's block or whatever weird thing it is that week that makes me think that every word spilled from my fingertips is crap.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But hey, that's freedom for you.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2974331606064928388?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2974331606064928388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=2974331606064928388' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2974331606064928388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2974331606064928388'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/04/how-much-did-i-make-from-odesk-in-2008.html' title='How much did I make from oDesk in 2008?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-963748119872454025</id><published>2009-03-26T00:12:00.003-04:00</published><updated>2009-03-26T00:13:55.324-04:00</updated><title type='text'>Legal retainers: you never know how valuable they are until you have to use them.</title><content type='html'>To quote the title, "&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px; white-space: pre; "&gt;Legal retainers: you never know how valuable they are until you have to use them.&lt;span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; white-space: normal; "&gt;"&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Seriously. For an LLC, it's much more cheaper and efficient then lugging around an attorney who just chills out all day until he has to write up a contract of some kind.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-963748119872454025?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/963748119872454025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=963748119872454025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/963748119872454025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/963748119872454025'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/03/legal-retainers-you-never-know-how.html' title='Legal retainers: you never know how valuable they are until you have to use them.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-8742761308053689971</id><published>2009-03-24T00:00:00.004-04:00</published><updated>2009-03-24T00:26:23.425-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spiced incense warehouse'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rambling'/><title type='text'>Slow going in the fjord of his mind.</title><content type='html'>If you look at my &lt;a href="http://geekninja.blogspot.com/2009/03/attack-of-spiced-incense-warehouse.html"&gt;Spiced Incese Warehouse post&lt;/a&gt; below you'll notice that it has a few comments, probably by the owner or a shill perhaps. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are some deleted ones: two were posting someone's phone #, address, etc, and two that were just pure spam. Well, not pure spam. If you've been around the 'net long enough you'll occasionally find people who are essentially being paid by the hour to 'attack' a site in an attempt to render it unusuable. It never works, of course, but it's still kinda funny to watch.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, it's a classic case of not knowing how the Internet works. By commenting repeatedly and shilling in an attempt to sweep whatever under the covers, I don't think he's realized that he's raising the popularity of the articles in question. The blog post, for instance, fell off the front page for awhile, then suddenly found itself ranked 4th or 5th for the search term "spiced incense warehouse." It'll probably outrank his site in a few days if he keeps up the pressure -- I'm not sure if that's good or bad. Good in the sense that it would be hilarious, primarily because he did it to himself, and bad because then my blog post turns into one of those little battlegrounds where everyone with a keyboard converges and argues -- same thing happened with my 'oDesk vs RentACoder' review, which I won't link to since its mostly obsolete and I haven't tried RentACoder in forever.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Plus, I think he underestimates the intelligence of his potential customers. I showed some non-tech friends the original blog post and the comments, and they totally lol'd their eyes out (or so they assured me).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, it made my ask myself, you know, what exactly is going on in this guy's mind? Is there some part in the back that tells him that making a fool of himself is the best course of action? Or, does he think he's not making a fool of himself at all?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I sat down and thought about it for awhile -- I had just finished playing two crappy rounds of Halo Wars and didn't have much else to do until She Who Is Unknown returned, so, you know, why not? After a bit I came to the conclusion that he's one of those types who gets red in the face and acts irrationally without thinking. That probably explains the sudden quiet-time that occured while I was waiting to be served (which apparently isn't going to happen).  I've never worked a salaried job in my life, so I've never had the great misfortune to be exposed to those kinds of people, but I've read about them and of course I've had the usual antecdotal "you wouldn't BELIEVE what this bossy motherfucker did today!" story from friends.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the plus side, his annoying behavior spurred me to change the way pages are cached on &lt;a href="http://fearlessblogging.com"&gt;FearlessBlogging&lt;/a&gt;, which is neither fearless nor, technically, blogging. I actually had an entirely different concept for the site, but then realized it would be redundant and more-or-less worthless in the grand scheme of things.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The caching changes I made were to localize all of my caching logic in a cache sweeper. Oh god, I know what you're thinking, and no. Caching was implemented initially as a *very* quick (talking, 15 minutes) hack, which involved a lot of cut-and-pasting of code everywhere. Things got messy fast, and as a result somewhere along the lines, during a random site upgrade / bugfix, I broke the admin panel. I could mark posts as disabled, but particular portions of the cache wouldn't refresh, so they'd show up in the sidebar but still be unviewable. Yeah. Stupid, I know.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also re-learned one important thing that I forgot: Never. Use. Page. Caching. In Rails. Ever. That shit causes boatloads of problems. Page-level caching in Rails is the goddamn devil. And there's no easy way to clean the cache, either, except to "manually" remove the files, as far as I know.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The moral of the story?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That stories don't have to have morals to be stories.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(oooh, yes I &lt;span class="Apple-style-span" style="font-weight: bold; font-style: italic;"&gt;did&lt;/span&gt; just go there).&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-8742761308053689971?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/8742761308053689971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=8742761308053689971' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8742761308053689971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8742761308053689971'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/03/slow-going-in-fjord-of-his-mind.html' title='Slow going in the fjord of his mind.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-673609219529133906</id><published>2009-03-19T18:00:00.003-04:00</published><updated>2009-03-19T18:04:08.384-04:00</updated><title type='text'>Hotmail login doesn't do HTTPS by default. ^.^?!</title><content type='html'>So, I almost never use my Hotmail or Y!Mail accounts anymore.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Too much spam, obviously.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, today, I did my monthly email check. Nothing but spam in the both of them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I did notice something funny.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Logging into Yahoo! Mail took me to an SSL protected page, where-as logging into Hotmail took me to a regular HTTP page.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, I was extra concious of where I was on the web because this morning my Mom got scammed; she followed one of those 'reset your password' emails and lost a couple hundred dollars from her Paypal account.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I gave her a 20 minute lecture (again) on not following those links. Frankly, she got off real lucky -- as far as I know he only took money from her account, and not a lot at that. The scammer could have done way worse.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, after my high-and-mighty lecture, I notice that Hotmail doesn't do HTTPS by default. I totally lawl'd.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've become used to seeing the SSL certificate in the browser bar as a way of verifying I'm where I meant to be, even though that's not exactly what it means. So I found Hotmail's lack of security on the login landing page very... unusual.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's the end of this blog post!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-673609219529133906?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/673609219529133906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=673609219529133906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/673609219529133906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/673609219529133906'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/03/hotmail-login-doesnt-do-https-by.html' title='Hotmail login doesn&apos;t do HTTPS by default. ^.^?!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2295226789110571609</id><published>2009-03-15T19:46:00.005-04:00</published><updated>2009-03-15T20:19:12.522-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spiced incense warehouse'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Attack of the Spiced Incense Warehouse!</title><content type='html'>So, I run, partially as a hobby, partially as a experimental programming site, a little site called &lt;a href="http://www.fearlessblogging.com/"&gt;FearlessBlogging&lt;/a&gt;. It's an awkard mishmash of technologies: there are identicons in posts, a half-baked prototype way of targeting problematic users by session details without actually having to lock-on with a username / password system, my first foray into LiveValidations and Prototype, etc.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's been about a year or two since it launched and it's more or lessed fulfilled its role. As it 'matured,' I kept my modifications to it to a minimal. I've started working on other websites to explore more newer technologies. The last major thing I did to FearlessBlogging was an upgrade from Rails 1.2.3 --&gt; Rails 2.2.2. It went very smoothly, only a few depreciated methods in the environment configs. Other than that, everything, including caching, was ready.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Resource-use, overall, has gone down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the most part it's been sailing along quietly, averaging about 20k pageviews a month, mostly on hot-button issues like a post about incest, or the dozen or more about infidelity. Just regular people blowing off steam.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Attack of the Spiced Incense Warehouse!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Recently, however, I've had the extreme displeasure of being introduced to something called "&lt;a href="http://www.spicedincensewarehouse.co.uk/"&gt;Spiced Incense Warehouse&lt;/a&gt;." It all started about 14 days ago with a post called, "&lt;a href="http://fearlessblogging.com/post/view/2364"&gt;Spiced Incense Warehouse - rip off&lt;/a&gt;!" Catchy, title, right? Apparently some dude had shipping problems or something with some product he bought off the site. Whatever; typical nerd-rage on the Internet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I figured it was inevitable I would get an angry email from the operator of Spiced Incense Warehouse, chock full of legal threats. No surprise, about a week and a half later, I get one. Now, I don't get a lot of these (the site averages less than 12 a year), and all of them are bogus. Mostly its people who feel offended that someone out there in the big wide world has the hates for them. Some of them are polite and terse, some of them are like enraged alcoholics who demand what they demand and will accept no substitute.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, guess which one this guy is?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I get a series of mostly incomprehensible emails demanding I take the post in particular down or else I'll be in &lt;b style="text-decoration: inherit; "&gt;beaucoup&lt;/b&gt; ligitation up to my eyeballs. I checked the post again (I'm all polite and shit like that) and, consulting with a lawyer, determine that it's coolio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, as general principal, I don't let any unintentionally public information spill onto the site. So, no email addresses, or street addresses, real names, etc, unless you're one of those people who have a public website and plaster that information all over the Interwebs in general. Websites are fine, obviously.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, after informing this guy what's up, I don't hear back for him in awhile.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, that's because he's busy spamming the site. The post "&lt;a href="http://fearlessblogging.com/post/view/2364"&gt;Spiced Incense Warehouse - rip off&lt;/a&gt;" ends up getting filled with pseudo-garbage as the owner of Spiced Incense Warehouse goes on a trip fantastic blaming everything from the postal service to the customer in question.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, a long time ago, I implemented identicons on the site. If you don't know what an identicon is, it's a visually pleasant representation of a hash value. There's a wikipedia article about &lt;a href="http://en.wikipedia.org/wiki/Identicon"&gt;Identicons&lt;/a&gt; available. The identicon implementation this site uses is based on a user's IP address and the current post they are commenting in (or the post they've created). So, if you make three comments in the same post, they all have your bright and shiny identicon. If you make another comment in another post, you get a different looking identicon. Neat, huh?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I implemented this feature because I was having a bit of a human-spam problem, and also because conversations were becoming difficult to follow, as in, commentors were saying "well, I meant this guy, not this guy." A visual identifer that was tied to a single person in a single thread but which was still anonymous was interesting, technology-wise, and it would also help solve the problem of who-said-what without collecting personal information. Of course, I remember almost nothing about the implementation now, just that generating these things crossbrowser is no fun and I will definitely be avoiding it until all browsers support the canvas element.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, back to Spiced Incense Warehouse. The site has a "master" RSS feed people can subscribe to. It gets them all posts and comments on the site -- since the site is very low traffic, this feature isn't a problem at all. In this RSS feed, after about an hour, almost a dozen entries show up, all comments for the Spiced Incense Warehouse post. It's become a total circus.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The owner of the site (and it is VERY clear this is the owner of the site, since all the identicons are the same but he's pretending to be a horde of happy customers leaving &lt;span class="Apple-style-span" style="font-style: italic;"&gt;A++ would buy again&lt;/span&gt;-style feedback.) has posted almost a dozen of wild comments. Now, I didn't really care for a bit, since the identicon made it clear it was the same person spamming the post, and the site visitors can pick that up visually.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It only became a problem when I started seeing personal details pop up on the site, presumably the personal details of the original poster. It had his full name, his street address, phone number and email -- it was like some kind of super stalker in action. Normally what I will try to do is edit out the sensitive details like that and leave the rest of the post intact, but this guy was so intent on destroying the site that I didn't have the time or energy to scrub the posts. Not that they had much content besides this guy's personal information. So I just whang'd them all with the disable button, which took about 30 seconds, and left the rest of his crazy rantings up there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Except he wasn't done.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A few hours later, the details crop up again. And again. And again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because once you're eCrazyStalker, you're a fucking eCrazyStalker through-and-through.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The site has a very basic counter-measure to combat automated spam, but I've never really considered having to kung-fu fight "human" spam. Humanized spam? What do you even call it?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I sat down for a bit and thought about the various non-invasive measures of tracking human-spammers and kibbitzing them. Keep track of their session ID and 'poison' the site, not allowing them to post? Keep a pool of 'bad' IP addresses and ignore any action from them for 24, 48 hours?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As I'm writing this, he's still going on in short, machine-gun style bursts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think the worst part of this is, the site has very little traffic -- the individual posts, fewer. Even the most controversial posts see a sharp drop in traffic once they're off the sidebar.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, the sidebar also keeps track of the most recent comments. By continuously commenting, he's ensuring that curious visitors take a look at the post in question. They're going to see him in it, acting the fool, and increasing exposure.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;People are so hard to understand sometimes. Some of them, I just don't understand at all.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2295226789110571609?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2295226789110571609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=2295226789110571609' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2295226789110571609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2295226789110571609'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/03/attack-of-spiced-incense-warehouse.html' title='Attack of the Spiced Incense Warehouse!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5058245820359110491</id><published>2009-03-15T15:30:00.003-04:00</published><updated>2009-03-15T16:05:37.577-04:00</updated><title type='text'>Games I've been playing.</title><content type='html'>About a week ago, I purchased both &lt;a href="http://www.amazon.com/gp/product/B001KN317K?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001KN317K"&gt;Halo Wars&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/product/B001EYUX3K?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B001EYUX3K"&gt;Tom Clancy's HAWX&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I purchased HAWX, an action-intense fighter-pilot game, because when I played the demo level, "Glass Hammer," I immediately thought back to Ace Combat 6 and, of course, Garuda team. I nabbed Halo Wars because the first two demo levels were OK and I thought it'd be an average RTS game I could stomach.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As it turns out, my expectations were completely fucked: Tom Clancy's HAWX was a total chore to get through once, and gut-wrenchingly boring the 2nd time around on "Elite." CO-OP mode is a little better: the missions are harder, and if everyone is playing on &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Elite mode&lt;/span&gt; some missions can be pretty fun (as long as everyone is playing with a headset). However, the game is full of more misses than missiles in the air (ha hah, why does a fighter plan have 82 missiles?!-style joke!). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The storyline is a total mess, from its incredibly implausible premise, to its jerky storytelling method of hopping around the entire planet (planet meaning the United States and Tokyo). I'm going to get some hate for me ripping on the storyline while loving Ace Combat 6, but there's a big difference here, I'd like to think, and that is that Ace Combat 6 goes full-throttle into fantasy land, with its giant flying fortresses and city-sized rail-guns. HAWX clearly went for a super-realistic takes-place-in-the-near-future feel, going for a gritty story of nuclear threats with the overarching theme of capitalism taken to the extreme. Unfortunately the actual execution of the story is bullshit. Yes, bullshit. Go watch a friend play it if you really want to experience the roller-coaster of suck for yourself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The game itself suffers from weapon-itus, meaning there are a ton of starter planes you use once, because the mission forces you to, and then never again; missions that DEMAND you bring a free-fall bomb, even though you can just as easily use multi-target air-to-ground missiles to do the same thing; missions that are incredibly easy but gimmicking -- one in particular involves having to aim your plane at a radar signal while flying through radar net gaps so large you could drive a fleet of trucks through, yet somehow bomber planes can't manage that themselves.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, and then there's: bad scripting (I've inadvertantly broken several levels by destroying all the enemies before I was supposed to insert eye-roll here), bad dialogue (THE NUCLEAR MISSILE WILL GO OFF IN MINUTES CRENSHAW!!!!!!, WE HAVE ONLY MINUTES UNTIL THE INVASION ARRIVES CRENSHAW!!!!, BACKUP WILL BE HERE IN ONLY MINUTES CRENSHAW !!!, MY HOT POCKET WILL BE FINISHED IN ONLY MINUTES, CRENSHAW!!!), and an extremely annoying AWACs who announces EVERYTHING to you. If you miss with a rocket pod attack -- even one rocket -- you get to hear, "You missed the target!" even though that's on my fucking HUD and I clearly knew that by the lack of exploding enemies on the ground.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Did I mention the super anti-climatic finale levels? One of which is really just an interactive epilogue and a total waste of 10 minutes?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ugh. Anyway.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As it turns out, the best mission of the game was the one in the demo: Glass Hammer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, Halo Wars...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Halo Wars!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm no fanboy, and I wasn't even sure this was going to be a good game, since the first two levels are pretty much a snore-fest, but right after that the action and pacing starts to pick up. The controls are quick to learn, the gameplay challenging but not "goddamn cheating-computer!"-challenging, and the game itself is just genuinely fun. The cut-scenes are just long enough to tell a bit of story but not so long that you get bored watching them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even losing a mission and having to restart from the beginning is a pleasant experience: overall missions are about 30 minutes long, and the gameplay and strategies you can use are varied enough that it is actually kind of fun to lose, since it means you can try another technique. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's built-in CO-OP for all the levels, I think. Haven't gotten there yet -- just finished the campaign, but I'll definitely have to try... there's no way I'm going to save the citizens of Arcadia City all by myself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The story is fairly solid, told with ingame communications and cut-scenes, typical gaming fair. There's nothing particularly epic about the story; it's just there to support the gameplay, which it does very nicely. There are a few unexplained WTFs at the end which I won't mention because of spoilers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Multiplayer can be hit or miss, depending on the mode. 1v1 is good, 2v2 or 3v3 can either be excellent or horrible. This is entirely dependent on the people you're playing with: I got a good team going my first few games, so we stuck together and decimated the enemy with good teamwork and communication. The next matches a few days later ended terribly. Players not communicating, some of them not even really playing "right" (new players, clearly). As this is an RTS, there's no solution to an AFK or non-responsive team-mate: you're going to lose, plan and simple. 2v2 lessens the odds of you having a doofus on your team, but doesn't quite have the huge epic battles that 3v3 brings to your door.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Still, multiplayer can be pretty sweet when it's all workin' right.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All in all, a very enjoyable game.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* * *&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, have you ever wondered what would happen if a Blue Whale ate you?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Don't. It's a weird thought to have.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5058245820359110491?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5058245820359110491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=5058245820359110491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5058245820359110491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5058245820359110491'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/03/games-ive-been-playing.html' title='Games I&apos;ve been playing.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3432848550167898582</id><published>2009-02-20T15:21:00.003-05:00</published><updated>2009-02-20T15:57:34.163-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discover card'/><category scheme='http://www.blogger.com/atom/ns#' term='money'/><category scheme='http://www.blogger.com/atom/ns#' term='discover'/><category scheme='http://www.blogger.com/atom/ns#' term='discover bank'/><title type='text'>Oooh, Discover pisses me off.</title><content type='html'>I applied for a &lt;a href="http://www.discovercard.com/"&gt;Discover&lt;/a&gt; debt consolidation loan about two weeks ago after reading one of their pre-qualified pamphlets that you get in the mail. "You're a winner now!" sorta bullshit. The only reason I went for it is because the rates were actually really nice in comparison to most of the crap I get in the mail. I've recently had some dental surgery that I've put on my credit cards and they've been gathering interest like dust bunnies ever since, so this seemed like a good way to consolidate both cards.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Easy, right? I'm &lt;span class="Apple-style-span" style="font-weight: bold; font-style: italic;"&gt;pre-approved&lt;/span&gt;, right? Oh, I bet you know where this is going.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is the first time since I've become self-employed that I actually got a rejection letter from a bank / credit card company. And the reasons, &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;GOD THE REASONS&lt;/span&gt;, it's like someone accidently stamped 'UNAPPROVED' instead of 'APPROVED' and made up some reasons in a panic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of them was "excessive number of non installement/finance inquiries" which is the apparent result of &lt;a href="http://www.discovercard.com/"&gt;Discover &lt;/a&gt;keep checking my credit report way too often, since this is the first time in about 9 months I've actually signed up for something credit / finance related.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also got "too many revolving accounts," and "utilization on revolving accounts too high," which is fantastic, since I only have 3 credit cards; 1 card empty, and the other 2 with, together, a grand total of... $8,000. (dental surgery is _expensive_ when you don't have insurance).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, I have a credit score of 700. I've been told that's not awful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All together, car note included, I have about $15,000 worth of debt, maybe a little more (netflix + fastfood addiction). Man, you know the economy is in the shitter when a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;bank&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; considers that too much debt.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3432848550167898582?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3432848550167898582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=3432848550167898582' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3432848550167898582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3432848550167898582'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/02/oooh-discover-pisses-me-off.html' title='Oooh, Discover pisses me off.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4572641793171877804</id><published>2009-02-16T16:45:00.004-05:00</published><updated>2009-02-16T17:24:06.443-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='palm pre'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile phones'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>When will Mobile Browsers be the new Mobile API?</title><content type='html'>As a forward, let me talk about the &lt;a href="http://i.gizmodo.com/5126702/palm-pre-preview-simply-amazing"&gt;Palm Pre&lt;/a&gt; for a few minutes. Alternatively, you can just read that article I just linked to then skip a couple paragraphs.&lt;br /&gt;&lt;br /&gt;The Palm Pre is heralded by some as the second coming of Palm. What makes this phone stand out the most is the fact that its operating system is essentially a web-browser that talks to the hardware underneath. It's user interface is HTML/CSS/JavaScript, built on standards &lt;span style="font-style: italic;"&gt;blah blah blah.&lt;/span&gt; The thrust of it means that writing a Palm Pre app is as simple (or complex) as writing a webpage. For regular end users, this is probably meaningless; all that matters is that the phone looks good and moves quickly. For developers, however, it opens up a new realm of app-developing whup-ass. By making web-apps easier to create, the Palm Pre is enabling developers to make &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;more&lt;/span&gt; apps&lt;/span&gt; with &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;better &lt;/span&gt;quality&lt;/span&gt; for &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;less &lt;/span&gt;investment.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pretty much every developer, and several people who have no idea what they're doing, has a good grasp of HTML/CSS/JavaScript. This means that anyone can immediately dip their feet into Palm Pre and start developing. Ease of development is what made the Web explode, and the same potential is lying in wait for the Palm Pre.&lt;br /&gt;&lt;br /&gt;So, &lt;span style="font-weight: bold;"&gt;when will Mobile Browsers be the new Mobile API?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Palm Pre is very much a step in that direction: you talk to the Palm Pre OS using its JavaScript libraries, and you markup the application's user interface using HTML/CSS. There's only one catch: the application has to be installed first.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;Why can't I, Arron Washington, Destroyer of Worlds and Small Celestial Bodies, visit http://maps.example.com, be prompted by the phone ("Hey Mr. World Smasher, this website would like to access your phone's GPS!"), and then have all the tight integration you would come to expect with an application on any website the Web cares to offer?&lt;br /&gt;&lt;br /&gt;Imagine the potential awesomeness of that, being able to access a phone's features via JavaScript in a regular web page. You go to Google Maps Mobile, it asks for GPS access, you grant it, and voila': a whole new subset of features are available just for you, without having to download the app and update it every time a new release comes out.&lt;br /&gt;&lt;br /&gt;With this kind of available integration, anyone can make their website "mobile enhanced" just by calling the phone's custom JavaScript libraries. With simple (DEAD SIMPLE) JavaScript integration, something as simple as a coupon site could deliver location-aware opportunities (sales in progress, 30% off!, etc)  without having to make an application for every popular phone. Just point your browser at the site, authorize and it's there, all magically delicious 'n' shiznit.&lt;br /&gt;&lt;br /&gt;Now, some privacy nuts will tell you, "Hey man, what happens if I enable a site to use my GPS to find my location? That's an invasion of my privacy!" I'll tell those folks, don't get in a boat with cannibals.&lt;br /&gt;&lt;br /&gt;I think with the Palm Pre we're inching just a little bit closer to that. The whole awesome website-phone integration thing, not the boat full of cannibals thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4572641793171877804?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4572641793171877804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=4572641793171877804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4572641793171877804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4572641793171877804'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/02/when-will-mobile-browsers-be-new-mobile.html' title='When will Mobile Browsers be the new Mobile API?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-8123998476425845577</id><published>2009-01-31T00:04:00.003-05:00</published><updated>2009-01-31T00:20:13.099-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>can_has_assets? A new Rails plugin for requiring stylesheets and javascript in views.</title><content type='html'>I sat down and scratched an itch I've had ever since I started developing Rails plugins: finding a way to require javascript / stylesheets on a per-view basis.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's &lt;a href="http://www.intridea.com/2008/1/11/needy-controllers-2"&gt;Needy Controllers&lt;/a&gt;, but that operates in your controllers, and me, being me, wanted to require the CSS and JS from the view, since I'm already hooked on the whole&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&amp;lt;%= title "hello world" %&amp;gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;in views idiom. (view-specific logic in views, basically)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I built &lt;a href="http://github.com/radicaled/can_has_assets/tree"&gt;can_has_assets&lt;/a&gt; as a way to scratch my itch. The master branch is currently acting as stable, and since the plugin is so simple, it probably won't be updated very often (or at all). Feel free to push if you do something interesting with it though.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, straight from the README:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  line-height: 18px; font-family:helvetica;font-size:13px;"&gt;&lt;pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 115%/normal Monaco, 'Courier New', monospace; line-height: 1.4em; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 85%; color: rgb(68, 68, 68); "&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;CanHasAssets&lt;br /&gt;============&lt;br /&gt;&lt;br /&gt;can_has_assets is a super-simple way of requiring stylesheets and javascript files&lt;br /&gt;from within views. It also supports inserting snippets of CSS and Javascript into&lt;br /&gt;a page only once. Snippet support should really only be used for rapid prototyping,&lt;br /&gt;though. :)&lt;br /&gt;&lt;br /&gt;Installation&lt;br /&gt;------------&lt;br /&gt;&lt;br /&gt;script/plugin install git://github.com/radicaled/can_has_assets.git&lt;br /&gt;&lt;br /&gt;Notes&lt;br /&gt;-----&lt;br /&gt;&lt;br /&gt;can_has_* will include a file or snippet only once -- it is safe to call these&lt;br /&gt;methods multiple times, where-ever required.&lt;br /&gt;&lt;br /&gt;Alternatives&lt;br /&gt;------------&lt;br /&gt;&lt;br /&gt;If you're looking for more control, consider Needy Controllers by Michael Bleigh:&lt;br /&gt;&lt;br /&gt;http://github.com/mbleigh/needy-controllers/tree&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;=======&lt;br /&gt;&lt;br /&gt;In your layout:&lt;br /&gt;&lt;br /&gt;&amp;lt;%= stylesheet_link_tag :can_has_assets %&amp;gt;&lt;br /&gt;&amp;lt;%= javascript_include_tag :can_has_assets %&amp;gt;&lt;br /&gt;&lt;br /&gt;In your views:&lt;br /&gt;&lt;br /&gt;CSS&lt;br /&gt;---&lt;br /&gt;&amp;lt;% can_has_css 'css_file' %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% can_has_css :sample_snippet do %&amp;gt;&lt;br /&gt;.item {&lt;br /&gt; /* some fake example css here */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Javascript&lt;br /&gt;----------&lt;br /&gt;&amp;lt;% can_has_js 'js_file' %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% can_has_js :sample_snippet do %&amp;gt;&lt;br /&gt;function helloWorld() {&lt;br /&gt; alert("Hello, world!");&lt;br /&gt;}&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-8123998476425845577?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/8123998476425845577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=8123998476425845577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8123998476425845577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8123998476425845577'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/canhasassets-new-rails-plugin-for.html' title='can_has_assets? A new Rails plugin for requiring stylesheets and javascript in views.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1740989199491440382</id><published>2009-01-29T02:28:00.006-05:00</published><updated>2009-01-29T02:44:27.811-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Discipline + Git = good awesome funtime!</title><content type='html'>(inflammatory rant about some Git users follows)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Git is awesome. If you haven't tried it yet, you should use it for your next non-critical project. Even if you're trapped using Subversion at work, the git-svn bridge will get you by and no one will be the wiser.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just remember one very, very important thing: Git is not The End All.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I say this because I've noticed that some people, after migrating to Git (or Github), completely lose all discipline.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No branches.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No tags.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For these people, there is nothing but The Master Branch (dramatic thunderstrike!). There is no stable or unstable; there is only the master branch and its whimsical nature. Will the project work today? Will it work tomorrow? Did it even work yesterday? Who knows.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's a hint that you've gone horribly awry: if people need to track down the latest "stable" commit you made to the master branch by checking the timestamp on your announcement via Twitter about it, then you've royally fucked up and need to re-evaluate.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rant over, as abruptly as it began.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1740989199491440382?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1740989199491440382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=1740989199491440382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1740989199491440382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1740989199491440382'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/discipline-git-good-awesome-funtime.html' title='Discipline + Git = good awesome funtime!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7735990864472930625</id><published>2009-01-27T20:04:00.005-05:00</published><updated>2009-01-27T21:28:37.428-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tags'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='getting with the program'/><category scheme='http://www.blogger.com/atom/ns#' term='tag aliases'/><title type='text'>Tag Aliases: get them, people.</title><content type='html'>This has been on my mind ever since I made &lt;a href="http://identi.ca/notice/2008075"&gt;this identi.ca notice&lt;/a&gt;:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  line-height: 23px; font-family:'Lucida Sans Unicode';font-size:14px;"&gt;&lt;span class="vcard author" style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-right: 11px; "&gt;&lt;a href="http://identi.ca/radicaled" class="url" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 46, 110); text-decoration: none; "&gt;&lt;span class="nickname fn" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-style: italic; font-weight: bold; "&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;p class="entry-content" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; display: inline; "&gt;#&lt;span class="tag" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;a href="http://identi.ca/tag/rails" rel="tag" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 46, 110); -webkit-border-top-right-radius: 4px 4px; -webkit-border-top-left-radius: 4px 4px; -webkit-border-bottom-left-radius: 4px 4px; -webkit-border-bottom-right-radius: 4px 4px; background-color: rgb(252, 252, 252); "&gt;rails&lt;/a&gt;&lt;/span&gt; vs #&lt;span class="tag" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;a href="http://identi.ca/tag/rubyonrails" rel="tag" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 46, 110); -webkit-border-top-right-radius: 4px 4px; -webkit-border-top-left-radius: 4px 4px; -webkit-border-bottom-left-radius: 4px 4px; -webkit-border-bottom-right-radius: 4px 4px; background-color: rgb(252, 252, 252); "&gt;rubyonrails&lt;/a&gt;&lt;/span&gt; -- AKA, "Why Tag Aliases are needed in every tagging system."&lt;/p&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll notice that Rails and RubyOnRails are two seperate tags -- even though they both reference the same topic. This almost inevitably comes up when you're dealing with a tagging system where individuals supply the tags in question. Is it &lt;span class="Apple-style-span" style="font-style: italic;"&gt;#sn&lt;/span&gt; or &lt;span class="Apple-style-span" style="font-style: italic;"&gt;#socialnetworking&lt;/span&gt;? &lt;span class="Apple-style-span" style="font-style: italic;"&gt;#rails&lt;/span&gt; or &lt;span class="Apple-style-span" style="font-style: italic;"&gt;#rubyonrails&lt;/span&gt;?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first time I saw tag aliases in the wild, they were on an imageboard for porn. Yes, all innovations have their roots in porn. Porn is the great innovator! All hail porn!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tag aliases evolved out of necessity in the world of web 2.0 pornography: when dealing with certain topics, say fetishes for example, there are often two ways to reference the same topic: the technical nomenclamature, and the common name. So, what do you tag it under? Both, of course. Under the hood, the system tags these tag aliases together and presents one uniform tag, which can the technical tag, the common-name tag, or both (for usability).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As I've demonstrated, tag aliases are useful for more than porn. When you're dealing with microblogging, for instance, do you want to use a short name, for space, or a long name, for usability / readability? Without tag aliases the community really has to decide on one or the other. With tag aliases, it's just a matter of personal preference -- you may not want to use the shorter version of a tag if you have a readership unfamiliar with the topic at hand, for example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So why the hell do I only see tag aliases on random pr0n imageboards and not where they're needed in other portions of the web 2.0 space? It might be a matter of mechanics. Who gets to decide what tags are aliased, where? Is it a Wiki-like system, or a trust-based system like StackOverflow?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That is all.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7735990864472930625?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7735990864472930625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=7735990864472930625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7735990864472930625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7735990864472930625'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/tag-aliases-get-them-people.html' title='Tag Aliases: get them, people.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5137485048578642102</id><published>2009-01-27T17:23:00.000-05:00</published><updated>2009-01-27T17:24:04.843-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metacritic'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla ubiquity'/><title type='text'>Mozilla Ubiquity: Metacritic Script</title><content type='html'>I developed this rarely used script to search &lt;a href="http://www.metacritic.com/"&gt;Metacritic&lt;/a&gt; way back when, as my first Ubiquity script. Ever since I got it working I just kinda left it there. It's a total hack and it'll break when they change the way the page renders, but you, dear viewer, might find it useful.&lt;br /&gt;&lt;br /&gt;Yes, Mozilla Ubiquity &lt;span style="font-style:italic;"&gt;does&lt;/span&gt; rock. However, having no API to your site does not rock. It is the exact opposite of rock, in fact!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;function __searchMetaCritic(pblock, searchText) {&lt;br /&gt;    jQuery.get("http://www.metacritic.com/search/process?sb=0&amp;tfs=all&amp;ty=3&amp;x=0&amp;y=0&amp;ts=" + escape(searchText),&lt;br /&gt;      function(response) {         &lt;br /&gt;         var resultsREGXP = /\&lt;p\&gt;[0-9]\.(.*)\&lt;\/p\&gt;/gmi;&lt;br /&gt;         var results = response.match(resultsREGXP);&lt;br /&gt;         found = true;&lt;br /&gt;         &lt;br /&gt;         if (results == null) {&lt;br /&gt;            var msg = 'No results for "${what}"';&lt;br /&gt;            var subs = {what: searchText};&lt;br /&gt;&lt;br /&gt;            pblock.innerHTML = CmdUtils.renderTemplate( msg, subs );  &lt;br /&gt;            return;&lt;br /&gt;         }&lt;br /&gt;        var tempElement = CmdUtils.getHiddenWindow().document.createElementNS("http://www.w3.org/1999/xhtml", "div");&lt;br /&gt;&lt;br /&gt;        tempElement.innerHtml = '&amp;lt;link href="http://www.metacritic.com/general.css" rel="stylesheet" type="text/css"&amp;gt;';&lt;br /&gt;        tempElement.innerHtml = tempElement.innerHtml + results.join('');&lt;br /&gt;&lt;br /&gt;        var msg = 'Searching for "${what}" &lt;br /&gt; ${results}';&lt;br /&gt;        var subs = {what: searchText, results: tempElement.innerHtml};&lt;br /&gt;&lt;br /&gt;        pblock.innerHTML = CmdUtils.renderTemplate( msg, subs );    &lt;br /&gt;      });&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CmdUtils.CreateCommand({&lt;br /&gt;  name: "metacritic",&lt;br /&gt;  takes: {"what": noun_arb_text},&lt;br /&gt;  preview: function(pblock, what) {&lt;br /&gt;    __searchMetaCritic(pblock, what.text);&lt;br /&gt;    var msg = 'Searching for "${what}"';&lt;br /&gt;    var subs = {what: what.text};&lt;br /&gt;&lt;br /&gt;    pblock.innerHTML = CmdUtils.renderTemplate( msg, subs );&lt;br /&gt;&lt;br /&gt;  },&lt;br /&gt;  execute: function(what) { __searchMetaCritic(what); }&lt;br /&gt;});&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5137485048578642102?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5137485048578642102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=5137485048578642102' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5137485048578642102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5137485048578642102'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/mozilla-ubiquity-metacritic-script.html' title='Mozilla Ubiquity: Metacritic Script'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3302329072816847510</id><published>2009-01-24T23:17:00.002-05:00</published><updated>2009-01-24T23:20:33.670-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='left 4 dead'/><category scheme='http://www.blogger.com/atom/ns#' term='revenge'/><title type='text'>My moment of revenge against L4D exploiters. :)</title><content type='html'>Left 4 Dead is Valve's newest zombie survival horror game. Everyone loves it. People that don't are lying and really zombies in meatmasks.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, the game's got some issues due to its physics engine -- the most notable issue is in the Versus mode where it's possibly for enemy zombies to intentionally block paths, making it impossible for the zombie survivors to move forward. It's an exploit, and beyond that it's a stupid thing to do.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So today I had the great fortune of joining a team that was blocking the sewer hole on No Mercy 2 like a buncha douches... except, just as I was about to leave, I spawned as the car-throwing Tank right next to my exploiting team-mates.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll let you figure out what happened next. &gt;:)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3302329072816847510?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3302329072816847510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=3302329072816847510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3302329072816847510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3302329072816847510'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/my-moment-of-revenge-against-l4d.html' title='My moment of revenge against L4D exploiters. :)'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-9189401372673124179</id><published>2009-01-19T17:38:00.004-05:00</published><updated>2009-01-19T17:51:44.818-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='omb'/><category scheme='http://www.blogger.com/atom/ns#' term='open microblogging'/><title type='text'>I don't want to talk to you if I need to sign up for something new to do it.</title><content type='html'>I've been getting real lazy about communicating with people on the Web. There are some things I just don't do anymore, for no other reason than I just don't have the patience.&lt;br /&gt;&lt;br /&gt;Like, take &lt;a href="http://lists.openmicroblogging.org/pipermail/omb/2009-January/000002.html"&gt;this post from the OpenMicroBlogging mailing list&lt;/a&gt;. It's about OMB Spec 0.2. When I read it, I instantly had questions about #3, &lt;span style="font-weight: bold; font-style: italic;"&gt;HTML-rendered notice content&lt;/span&gt;&lt;span style="font-style: italic;"&gt;. &lt;/span&gt;A: what the hell does that mean, and B: won't that lock-in OMB consumers to a particular implementation of @ replies and # tags?&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yet, I just can't bring myself to sign up for the mailing list to ask. I don't want to mess with another account on another site for something so trivial. I just don't have it in me anymore. I've even started designing my own small sites to accept OpenID or whatever else I can get my hands on to avoid making a unique account &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;for myself.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I guess I'm all username/password'd out.&lt;br /&gt;&lt;br /&gt;As for OMB -- no link, can't find a portal site for it -- my interest is easy integration of microblogging into client sites. In my mind, if a client breeds a community site, integrate microblogging as a communication stream, and expose it via OMB so they can "reach out" as a community into the Web. It's still a big foggy in my mental about it. For now I've just been watching its progress in case a relevant scenario pops up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-9189401372673124179?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/9189401372673124179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=9189401372673124179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9189401372673124179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9189401372673124179'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/i-dont-want-to-talk-to-you-if-i-need-to.html' title='I don&apos;t want to talk to you if I need to sign up for something new to do it.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-922745677512625230</id><published>2009-01-16T19:35:00.003-05:00</published><updated>2009-01-16T19:58:31.337-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yahoo boss'/><category scheme='http://www.blogger.com/atom/ns#' term='google adsense'/><title type='text'>Monetizing Yahoo! BOSS.</title><content type='html'>This isn't a post about how to make money using &lt;a href="http://developer.yahoo.com/search/boss/"&gt;Yahoo! BOSS&lt;/a&gt;; rather, it's just a link to the current policy of monetizing Yahoo! BOSS through third-party methods (Google Adsense, basically). I'm posting it mostly because I looked for this information for a long time when I had the opportunity to use BOSS, but couldn't find it, so had to opt for a customized site search instead.&lt;br /&gt;&lt;br /&gt;Excerpted from &lt;a href="http://tech.groups.yahoo.com/group/ysearchboss/message/778"&gt;this post about third-party monetization with Yahoo! BOSS&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Our current policy is, while we do not prevent you from implementing a third party monetization method in conjunction with your use of BOSS, &lt;span style="font-weight: bold;"&gt;we may at any time require you, for example, to implement and display Yahoo!'s Sponsored Search (or similar) advertising offering&lt;/span&gt; &lt;span style="font-weight: bold; font-style: italic;"&gt;instead of a third party's&lt;/span&gt;. Alternatively, we are considering the option to pay a fee based on your use of the service; in this case, we would anticipate permitting the continued use of monetization methods from third parties.&lt;/blockquote&gt;Basically, Yahoo! reserves the right to fuck you up: any time, any place.&lt;br /&gt;&lt;br /&gt;For small niche-like sites this is probably OK; they wouldn't bother trying to get any cheddar from you. If you run something moderately successful powered by BOSS you might have problems in the future.&lt;br /&gt;&lt;br /&gt;I don't have a problem with having to display YPN ads or whatever. The real problem is not being able to support third-party monetization efforts. For instance, if you're running a site that makes good bread with CPA ads / Amazon affiliate links, removing those and replacing them with lesser YPN ads is a kick in your junk. What do you do then? Try to manage direct sales?&lt;br /&gt;&lt;br /&gt;Something to think about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-922745677512625230?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/922745677512625230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=922745677512625230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/922745677512625230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/922745677512625230'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/monetizing-yahoo-boss.html' title='Monetizing Yahoo! BOSS.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-666366271070156738</id><published>2009-01-09T19:29:00.001-05:00</published><updated>2009-01-09T19:31:00.836-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>The Microsoft Tag site...</title><content type='html'>...doesn't work in Firefox.&lt;br /&gt;&lt;br /&gt;Even though it's powered by Silverlight, which means it should function identically in anything that runs Silverlight.&lt;br /&gt;&lt;br /&gt;Seriously.&lt;br /&gt;&lt;br /&gt;Visit http://www.microsoft.com/tag/ and try to click on 'Get it for your phone' or 'Make a tag' -- it &lt;span style="font-weight: bold;"&gt;Just Doesn't Work&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;That is such a cold, cold burn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-666366271070156738?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/666366271070156738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=666366271070156738' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/666366271070156738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/666366271070156738'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/microsoft-tag-site.html' title='The Microsoft Tag site...'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6498223708806139916</id><published>2009-01-06T23:17:00.003-05:00</published><updated>2009-01-06T23:29:19.118-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wordpress themes'/><category scheme='http://www.blogger.com/atom/ns#' term='wordpress'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='websites'/><title type='text'>Need design ideas? Surf Wordpress blogs.</title><content type='html'>I'm a terrible designer. As one of those people who can't close their eyes and imagine with clarity The Perfect Design, I'm forced to rely on other people who don't suck at makin' things pretty and useable.&lt;br /&gt;&lt;br /&gt;One of the best resources I've found so far are Wordpress blogs. Some Wordpress blogs have the most ridiculously beautiful themes you will ever find. For instance, following a link from Hacker News got me to some dude's post about "&lt;a href="http://donttrustthisguy.com/2009/01/04/encouraged-commentary"&gt;Encouraged Commentary&lt;/a&gt;." Excellent ideas aside, the first thing that struck me was that his blog was &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;freakin' beautiful.&lt;/span&gt;&lt;/span&gt; I mean, look at it. It is aesthetically pleasing and functional, to boot. Hell, look at what he does to images -- they're faded out until you roll over one, at which point the image becomes crisp and the caption pops up.&lt;br /&gt;&lt;br /&gt;Another resource is the official &lt;a href="http://wordpress.org/extend/themes/"&gt;Wordpress Themes site&lt;/a&gt;. Some gems hidden away in there.&lt;br /&gt;&lt;br /&gt;I'm not saying steal these themes or anything -- far from it. But they can provide a jumping off point for the uncreative types to work with. For a certain site, I started with a pretty nice Wordpress theme and then modified it so much it looked nothing like the original... but without the original, I wouldn't have gotten even half as far as I did. It helps that most of the themes on the Wordpress site are liscensed liberally, even though I don't actually look at the underlying CSS. I actually cherry pick certain parts of the designs and incorporate them into one OK-looking site.&lt;br /&gt;&lt;br /&gt;It provides enough momentum to get me going, at least.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6498223708806139916?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6498223708806139916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=6498223708806139916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6498223708806139916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6498223708806139916'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/need-design-ideas-surf-wordpress-blogs.html' title='Need design ideas? Surf Wordpress blogs.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7273350999023400775</id><published>2009-01-06T18:18:00.003-05:00</published><updated>2009-01-06T19:15:12.057-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='sinatra'/><title type='text'>Sinatra made me go ROOOOAARRRR.</title><content type='html'>So I wanted to give &lt;a href="http://sinatra.rubyforge.org/"&gt;Sinatra&lt;/a&gt; a try today because I had to throw up, quite literally, a one-one dynamic webapp. No tests, no helpers, nothing -- just the one page with some Ruby-powered bits on the backend. The only reason I wanted Sinatra was because I wasn't in the mood to do a massive svn check-in of a vendored rails with the project.&lt;br /&gt;&lt;br /&gt;So, &lt;span style="font-weight: bold;"&gt;sudo gem install sinatra&lt;/span&gt; and we're off to the races, right? Wrong. After about 10 minutes of debugging I realize that the Sinatra gem, a) doesn't work with the latest Rack (0.9), and b) seems to be updated infrequently judging by some blog posts I've read. They recommend grabbing Sinatra from github, but there's no stable Git branch available. I don't know if they're using the master branch as the stable branch or what. Doesn't matter, because I don't know what revision of Sinatra works with what copy of Rack. &gt;:(&lt;br /&gt;&lt;br /&gt;So I do the next best thing, which is to downgrade Rack to 0.4, which is what the Sinatra gem requires.&lt;br /&gt;&lt;br /&gt;Which works. For a bit, until I need to serve up a static html file. I guess that functionality isn't in the Sinatra gem. Some blogs mention how to use the 'public/' directory, which I tried, and failed miserably at; I'm assuming that functionality is somewhere in the github version of Sinatra and not in the gem.&lt;br /&gt;&lt;br /&gt;Right around that point I gave up and just cracked out a full-blown Rails project. I copied the logic over, had it up and running in about 7 minutes, which was a stark contrast to the ~2/hrs I spent trying to get Sinatra working.&lt;br /&gt;&lt;br /&gt;Lesson?&lt;br /&gt;&lt;br /&gt;Next time, just use the latest edge version of Sinatra and hope there are no bugs in it.&lt;br /&gt;&lt;br /&gt;This time, I'll just waste two minutes watching the '...'s go by.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7273350999023400775?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7273350999023400775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=13762456&amp;postID=7273350999023400775' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7273350999023400775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7273350999023400775'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/sinatra-made-me-go-rooooaarrrr.html' title='Sinatra made me go ROOOOAARRRR.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='08920800990875749358'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry></feed>