<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13762456</id><updated>2012-01-13T02:36:30.565-05:00</updated><category term='optional'/><category term='flv to mp3'/><category term='metacritic'/><category term='sharethis'/><category term='html5'/><category term='getting with the program'/><category term='spiced incense warehouse'/><category term='hosting'/><category term='mobile phones'/><category term='wtf'/><category term='localhost'/><category term='google docs'/><category term='firefox'/><category term='form_for'/><category term='partial'/><category term='mckibbon hotel group'/><category term='runlevel'/><category term='discover card'/><category term='git'/><category term='web 2.0'/><category term='buyer beware'/><category term='rails'/><category term='rss'/><category term='mozilla ubiquity'/><category term='.net'/><category term='has_one'/><category term='webfeed'/><category term='rant'/><category term='kitchen sink'/><category term='jaiku'/><category term='virtualbox'/><category term='odesk'/><category term='rails3'/><category term='basestream'/><category term='google adsense'/><category term='techcrunch'/><category term='google documents'/><category term='left 4 dead'/><category term='flex'/><category term='sharethis is null'/><category term='working'/><category term='wordpress'/><category term='vlc'/><category term='defensio'/><category term='tag aliases'/><category term='scm_passphrase'/><category term='rspec'/><category term='palm pre'/><category term='dojo'/><category term='patent'/><category term='discover'/><category term='amazon mp3'/><category term='websites'/><category term='shoulda'/><category term='wordpress themes'/><category term='html'/><category term='coding'/><category term='atom'/><category term='sinatra'/><category term='discover bank'/><category term='design'/><category term='asp.net'/><category term='streamreader'/><category term='heroku'/><category term='named_routes'/><category term='ubuntu'/><category term='testing'/><category term='locals'/><category term='plugins'/><category term='madness'/><category term='ruby'/><category term='opinionated'/><category term='google app engine'/><category term='ubuntu 8.10'/><category term='javascript'/><category term='canvas tag'/><category term='apple'/><category term='buyer beaware'/><category term='youtube'/><category term='amazon mp3 downloader'/><category term='aptana studio'/><category term='sharethis is undefined'/><category term='openoffice'/><category term='adobe air'/><category term='flex 2'/><category term='host key verification.'/><category term='amazon'/><category term='ruby rails aptana radrails netbeans'/><category term='canvas'/><category term='map.resources'/><category term='pointless ranting'/><category term='open microblogging'/><category term='linux'/><category term='revenge'/><category term='feed'/><category term='silverlight'/><category term='yahoo boss'/><category term='mckibbon hotel management'/><category term='flv'/><category term='sharethis is not defined'/><category term='google gears'/><category term='xbox360'/><category term='gae'/><category term='scm_user'/><category term='C#'/><category term='jquery'/><category term='tags'/><category term='ruby on rails'/><category term='scm_password'/><category term='i don&apos;t know what i&apos;m doing with my life'/><category term='twitter'/><category term='omb'/><category term='microsoft'/><category term='multiple logins'/><category term='capistrano'/><category term='annoying'/><category term='writing'/><category term='rambling'/><category term='money'/><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?max-results=100'/><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=101&amp;max-results=100'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>213</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13762456.post-8501278054003510836</id><published>2011-10-28T23:54:00.003-04:00</published><updated>2011-10-29T00:01:08.974-04:00</updated><title type='text'>accepts_nested_attributes_for, belongs_to, and has_many#build</title><content type='html'>There's a self-explainatory code sample before.&lt;br /&gt;&lt;br /&gt;Basically, if you have accepts_nested_attributes_for on a belongs_to relation, you can't use model.has_many_relationship.build params[:has_many_relationship] -- Rails bugs out.&lt;br /&gt;&lt;br /&gt;This is because, AFAIK, model.has_many_relationship.build params[:has_many_relationship]&lt;br /&gt;&lt;br /&gt;assigns params[:has_many_relationship] first, BEFORE assigning the foreign keys that link the relationship with the model.&lt;br /&gt;&lt;br /&gt;Code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class User &lt; ActiveRecord::Base&lt;br /&gt;  has_many :papers&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Paper &lt; ActiveRecord::Base&lt;br /&gt;  belongs_to :user&lt;br /&gt;  accepts_nested_attributes_for :user&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class PagesController&lt;br /&gt;  def create&lt;br /&gt;    # The below line FAILS;&lt;br /&gt;    # current_user.papers.build params[:paper]&lt;br /&gt;    paper = current_user.papers.build&lt;br /&gt;    paper.attribute&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;"current_user.papers.build params[:paper]" does this under the hood:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# this triggers accepts_nested_attributes_for, when user_id is currently blank, so it will fail.&lt;br /&gt;Paper.new params[:paper] &lt;br /&gt;Paper.user_id = current_user.id # too little, too late!&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-8501278054003510836?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/8501278054003510836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=8501278054003510836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8501278054003510836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8501278054003510836'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/10/acceptsnestedattributesfor-belongsto.html' title='accepts_nested_attributes_for, belongs_to, and has_many#build'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-237212025103624228</id><published>2011-08-10T22:40:00.002-04:00</published><updated>2011-08-10T23:07:27.545-04:00</updated><title type='text'>"What do you think of Cloud9 IDE?"</title><content type='html'>I think it'll fail.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://cloud9ide.com"&gt;Cloud9 IDE&lt;/a&gt; is bills itself as "development-as-a-service", but it's really just a web-based editor with some built-in support for running Node.js applications. Don't get me wrong, it's a really good web-based editor, but alone isn't going to cut it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I mean, sure, you can run Node.js... but what about Ruby? Python? PHP? Yeah, you can edit the files, but what good is that without being able to test those changes? Deploy them to a staging server? Production? Run your project's test suites?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Frankly, I think they're got the right idea but the wrong product.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think they should be selling a "Cloud9 DE" -- &lt;i&gt;a cloud-based development environment&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let me tell you a story about an old, old Rails project I worked on. It was a popular site -- had millions of visitors a month -- but it was built using the 0.x series of Rails. Old as dirt. Development on it had started way before we got sweet things like Bundler, a more robust Rubygems, etc. And that was reflected in the codebase and some of the &lt;i&gt;hand-written&lt;/i&gt; C libraries we had to use to hook into system libraries, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In fact...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was so damn old and brittle that we couldn't get a local copy running, for any of the developers. Instead, what Our Glorious Leader decided was that he would make copies of the actual production instance running on EC2, scrub the database, and then spin up an EC2 instance with these modified images for each developer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We worked through SSH, mainly using Vim or Nano, but I actually got some "SSH filesystem" deal going on Ubuntu (can't remember, FUSE?) and could edit my files using Gedit and etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was awful, fucking awful, let me tell you. A completely miserable experience. But if the code weren't such shit, and the concept had been fleshed out just a little more...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, interlude over, and back to the topic at hand: Cloud9 IDE is the right idea, wrong product.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think they should be selling &lt;i&gt;remote development environments&lt;/i&gt; -- prepackaged Amazon EC2 images, spun up and down on demand, billed by the minute and ready to go for whenever you need to start hacking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One click should get me a prepackaged EC2 instance ready for the latest Ruby on Rails development, and one more should get me a public (or private) Git repo checked out and ready for development on that EC2 instance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll always get a clean system for every project. Don't run MySQL/etc in the background if this project doesn't need it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll always have SSH access, so if you need to do some tooling around in that project's instance, no problem. Need to run tests, or some other custom shell command? No problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll always have access to your development machine, no matter where you are, via the Cloud9 IDE itself. Don't like the interface? Mount the filesystem using FUSE and hack the code with your favorite IDE.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Taking it one step further, let teams create their own prepackaged developer images so that getting a new developer set up is as simple as adding him to a team in the Cloud9 IDE. Now you're suddenly measuring developer set up time in &lt;i&gt;minutes&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's valuable. That's worth money.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A web-based editor for $14.99/mo? No.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Remote development environments like the one above ~$60/mo? Hell yes.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-237212025103624228?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/237212025103624228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=237212025103624228' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/237212025103624228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/237212025103624228'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/08/what-do-you-think-of-cloud9-ide.html' title='&quot;What do you think of Cloud9 IDE?&quot;'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3095496385620710280</id><published>2011-05-26T00:33:00.003-04:00</published><updated>2011-05-26T00:35:35.593-04:00</updated><title type='text'>oDesk WTFs</title><content type='html'>Applicants that:&lt;div&gt;&lt;ul&gt;&lt;li&gt;Apply to a job, but state very clearly when asked that they have no experience in the relevant technology and have no intention of learning the required technology&lt;/li&gt;&lt;li&gt;Apply to a job, but state that they have no intention of finishing the project within the alloted budget&lt;/li&gt;&lt;li&gt;Apply to a job, beg for a chance, then completely ignore instructions and try to sell you some half-baked CMS they had developed for another client&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3095496385620710280?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3095496385620710280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3095496385620710280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3095496385620710280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3095496385620710280'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/05/odesk-wtfs.html' title='oDesk WTFs'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6919625124902711684</id><published>2011-05-15T21:25:00.004-04:00</published><updated>2011-05-15T21:34:22.609-04:00</updated><title type='text'>Ubuntu v. Fedora</title><content type='html'>WTF.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So many bugs in Ubuntu 11.04, all of them with Unity. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Crazy graphical errors that make it impossible to work (I mean that literally), &lt;/li&gt;&lt;li&gt;Unity steals title bars at random so I can't can't drag some title bars for dialogs or windows,&lt;/li&gt;&lt;li&gt;the global menu steals some (SOME) of the menu bars in Eclipse, but not others, leaving me in a fucked up wasteland of not being able to access functionality without knowing the keyboard shortcut,&lt;/li&gt;&lt;li&gt;Unity decides that no, it does not need to hide at the moment, and there's nothing you can do about it, so the leftmost 50ish pixels of my applications are completely inaccessible,&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;All this shit for a dock that doesn't do anything yet.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fedora 15 works like a dream on my laptop, no weird errors or anything like what Unity's been boning me with. I'm looking into exactly what it would take to migrate my development machines from Ubuntu 11.04 to Fedora 15.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only alternative is to wait 6 months and *hope* Unity stops being so goddamn buggy. I want to like it, but Unity seems less like a product and more of a promise of what could be.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6919625124902711684?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6919625124902711684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6919625124902711684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6919625124902711684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6919625124902711684'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/05/ubuntu-v-fedora.html' title='Ubuntu v. Fedora'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5686053893643601816</id><published>2011-04-30T02:37:00.002-04:00</published><updated>2011-04-30T02:42:39.673-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>UJS drivers (rails.js / jquery-ujs.js) -- load them LAST.</title><content type='html'>Don't load your UJS driver (rails.js or jquery-ujs.js) before your application logic JavaScript.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/949480.js"&gt; &lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why? Because your UJS driver is going to hook into the submission events for ajax elements. If you need to run a validation (or anything like it) that has to be executed BEFORE form submission occurs, because it may cancel the submission event, you need to have that code hook into the submission events before your UJS driver does.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Therefore, load your UJS driver last.&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-5686053893643601816?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5686053893643601816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5686053893643601816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5686053893643601816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5686053893643601816'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/04/ujs-drivers-railsjs-jquery-ujsjs-load.html' title='UJS drivers (rails.js / jquery-ujs.js) -- load them LAST.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3903217585219043049</id><published>2011-04-08T16:53:00.003-04:00</published><updated>2011-04-08T17:07:24.037-04:00</updated><title type='text'>Mint.com is pretty awful now.</title><content type='html'>Mint sucks. What happened? After Intuit bought them, they added support for one of my previously unlisted banks, but then almost immediately all four Bank of America accounts I had inputted stopped updating.&lt;br /&gt;&lt;br /&gt;And just awhile ago, my Prosper account stopped updating.&lt;br /&gt;&lt;br /&gt;So now I have:&lt;br /&gt;&lt;br /&gt;* a PayPal account I get non-stop "low balance" warnings for, even though the balance hasn't changed in over a year,&lt;br /&gt;* a car note account that doesn't show my remaining balance,&lt;br /&gt;* An Ally CD,&lt;br /&gt;* and one bank account.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The most hilarious moment of this has to be that today I got an email from Mint, claiming that they've improved their back-end so now they don't talk to a 3rd party any more to get your bank updates: they connect directly to the financial institutions instead. Too bad connecting directly with the banks is apparently less robust than connecting through that 3rd party, am-i-rite?&lt;br /&gt;&lt;br /&gt;Runner up for most hilarious moment: Mint claims that you have to turn off all (ALL) of Bank of America's three-factor security mechanisms in order for Mint to work, because they're "unsupported." I have an account with another bank that updates perfectly fine via Mint, and it uses the same three-factor security that Bank of America does.&lt;br /&gt;&lt;br /&gt;It's unfortunate that Wesabe and the rest of them died off so quickly; they probably could have used this moment to start picking up customers as they drop off of Mint.&lt;br /&gt;&lt;br /&gt;There is no way I'm turning off any bank's additional security. I've already had my identity thiefed twice (caught by the bank both times before they did any real damage), I am not making it easier for someone to ninja my bank account, because, you know, there is &lt;i&gt;MONEY IN THEM THERE ACCOUNTS&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3903217585219043049?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3903217585219043049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3903217585219043049' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3903217585219043049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3903217585219043049'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/04/mintcom-is-pretty-awful-now.html' title='Mint.com is pretty awful now.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-408247014264651174</id><published>2011-04-06T00:46:00.007-04:00</published><updated>2011-04-07T19:23:47.437-04:00</updated><title type='text'>Making Jammit jam with Heroku</title><content type='html'>So, you want to use Heroku and Jammit together, and you've come here of all places! I know, there's no good solution for this floating around The Interwebs, so I figured one out myself, and now I'm publishing so that you, YOU THE VIEWER, can be both shocked and amazed.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's a nicely formatted gist &lt;a href="https://gist.github.com/905157"&gt;right here&lt;/a&gt;, or you can read it inline below:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/905157.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Yes, that large hack floating around in the middle is specifically for Heroku. If you're on another cloud service that is a little less wizardly, you can drop the class_eval block entirely and you should be good to go.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;If you're wondering if the resultant files will be cached by Heroku's Varnish HTTP accelerator: &lt;b&gt;yes&lt;/b&gt;. Rack::Static will return the fetched files as Rack::File objects, which Heroku caches.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;UPDATE: if it's not obvious, this needs to go into config/initializers -- so it runs once on app start up.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-408247014264651174?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/408247014264651174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=408247014264651174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/408247014264651174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/408247014264651174'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/04/making-jammit-jam-with-heroku.html' title='Making Jammit jam with Heroku'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4929089980043783148</id><published>2011-03-21T15:40:00.002-04:00</published><updated>2011-03-21T16:03:06.285-04:00</updated><title type='text'>Ubuntu --&gt; openSuse --&gt; Fedora --&gt; Ubuntu</title><content type='html'>Last night:&lt;br /&gt;&lt;br /&gt;Installed openSuse on my laptop, overwriting my Ubuntu Natty install. Installer is laggy. Doesn't have the firmware for my wireless. Can't get the gnome shell setup script to work without modification. Gnome Shell build fails anyway. Can't get wireless drivers installed. Give up. &lt;br /&gt;&lt;br /&gt;Install Fedora 15. Install is clumsy and demands internet connection. It detects wireless, but won't activate it. Installer allows me to continue anyway. I end up at a strangely themed Gnome 2 desktop.  I dig out a wireless USB adapter and start the install over. This time, I end up with Gnome Shell. Looks good. Nice performance. Oh, nice security update notification. Start installing updates.  Screen suddenly fades as I'm surfing web. The screen is locked, asking for a password. Mouse works, keyboard doesn't. I let the updates go for an hour; when I come back, keyboard works again. I play around a little, then restart. Can't get past Fedora's boot splash.&lt;br /&gt;&lt;br /&gt;Wait an hour, then install Ubuntu. Cant detect wireless at first. Nothing bad happens, and on first boot it asks if I want to enable my wireless. I do. It works. It rebooted fine.&lt;br /&gt;&lt;br /&gt;All I wanted to do was use Gnome Shell, but if it isn't available for Ubuntu, its gonna be a problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4929089980043783148?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4929089980043783148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4929089980043783148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4929089980043783148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4929089980043783148'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/03/ubuntu-opensuse-fedora-ubuntu.html' title='Ubuntu --&gt; openSuse --&gt; Fedora --&gt; Ubuntu'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1742417087022688081</id><published>2011-03-13T20:32:00.005-04:00</published><updated>2011-03-13T21:03:40.851-04:00</updated><title type='text'>One way MongoDB will get you in trouble if you're not careful.</title><content type='html'>One way MongoDB will get you in trouble if you're not careful:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;b&gt;Storing everything in a single document.&lt;/b&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An example I see a lot of is storing blog posts and the associated comments inside of a single MongoDB document. For instance, &lt;a href="http://www.infoq.com/presentations/Scaling-with-MongoDB"&gt;this presentation about scaling with MongoDB&lt;/a&gt; uses the following example schema:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;{&lt;br /&gt; _id: ObjectID('Incredibly Long, unfriendly GUID'),&lt;br /&gt; author: 'roger',&lt;br /&gt; date: 'Some random Date String',&lt;br /&gt; text: 'This is the main body of the blog post.',&lt;br /&gt; comments_count: 1,&lt;br /&gt; comments: [&lt;br /&gt;   { author: 'Gretchen',&lt;br /&gt;     date: 'Yesterday',&lt;br /&gt;     text: 'This is a spam comment; there are no real comments on the Internet.',&lt;br /&gt;   }&lt;br /&gt; ]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's wrong with this schema? Like, 80 million things.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What happens when you want to collect every blog post author and show it somewhere on the blog, let's say as an "authors" sidebar? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you want to show the site's most recent comments, by date?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Show a billboard of your blog's most prolific commenters and their highest rated comments?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You see where I'm going with this.  Theoretically, you could write a map reduce function for all of the above queries -- &lt;i&gt;theoretically&lt;/i&gt;. Looking at it from the perspective of a pragmatic programmer, though, do you really want to dip your feet into what are essentially SQL's Stored Procedures?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Make no mistake, the syntax is different, but once you start writing a map reduce function for any of the above queries, you have to maintain it -- whenever the schema changes, you have to update it, whenever the data moves, you have to update it. Poor schema modeling will turn the beauties of an efficient map reduce into a maintenance nightmare.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's a right time to jam everything into one document, and there's a wrong time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The wrong time&lt;/b&gt;: any valuable data you are going to want to isolate and iterate through, without having to load a possibly enormous parent document into memory first. These are the basics in relational models: the user model, the comment model, the blog post model. See above for the laundry list of reasons why.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The right time&lt;/b&gt;: miscellaneous data. Metadata. Any kind of data that won't fit cleanly into a relational model, or any kind of data that will be awkward to work with when its been detached from a document.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Too vague?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's say you want users of your site to be able to hide certain posts (blog posts OR comments) by certain authors ("it offends my eyes!"). You add an attribute to the User document, "hidden_authors," which is an array of ObjectIDs. &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;1) The attribute has no meaning outside of the User document.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) In general if you need to access a User document's hidden_authors attribute you will have already loaded that document into memory. If you haven't, thanks to MongoDB's excellent querying you can query inside of the array, which covers most cases ("Is this author blocked by this user?") quite nicely.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) It literally makes no sense as a separate document. As a separate document, it would end up being more unwieldy: not only would you need the hidden_authors attribute on this second document, but you'd also need an attribute to point to the related User document. What have you gained? Nothing. You've actually lost some flexibility, since now you're dealing with two documents. In a relational database like MySQL or Postgres, you've got no choice, but in MongoDB the easier way is also the better way in this case.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know the whole "blog post + comments = single document" is the canonical example for everyone who discusses MongoDB, but I really wish people would just let it die and be replaced by something that makes more sense. If you've had your head deep enough in databases, when you see that example you see something very "brittle" and something that is going to give you some headaches in the near future.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1742417087022688081?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1742417087022688081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1742417087022688081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1742417087022688081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1742417087022688081'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/03/one-way-mongodb-will-get-you-in-trouble.html' title='One way MongoDB will get you in trouble if you&apos;re not careful.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-8490408474995300051</id><published>2011-02-03T20:22:00.002-05:00</published><updated>2011-02-03T20:26:27.940-05:00</updated><title type='text'>Rubymine is...</title><content type='html'>...fat, and slow, and a total resource hog...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But nothing beats it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just spent some time tonight doing the IDE dance -- every once in awhile you have to go through all the long forgotten development environment options to see if you're missing out -- and I'm still where I am 2 years ago when I first purchased RubyMine: there is nothing else like it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aptana Studio 3 still sucks (it finally got SCSS support, though), NetBeans is terrible as always (and is apparently being discontinued, no surprise there), and I still don't have the MANLY STEEL required to set up vim for Ruby/Rails and stick with it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, RubyMine for the win (again). In a few months I'll be purchasing my, what, third license for it? I hope they keep up the steady development pace.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-8490408474995300051?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/8490408474995300051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=8490408474995300051' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8490408474995300051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8490408474995300051'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2011/02/rubymine-is.html' title='Rubymine is...'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6118867489231173173</id><published>2010-12-25T19:07:00.002-05:00</published><updated>2010-12-25T19:18:21.010-05:00</updated><title type='text'>Alpha Protocol ain't no Deus Ex.</title><content type='html'>I bought Alpha Protocol for 3 reasons: &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* it was recommended by some RPS commentors on an article about Deus Ex&lt;/div&gt;&lt;div&gt;* a reviewer likened it to a "spiritual successor" for Deus Ex.&lt;/div&gt;&lt;div&gt;* it was on sale for $19.99&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For a $19.99 game, it is alright -- but if you're seriously thinking it's as good (or better) than Deus Ex, you are either sadly mistaken or your eyeballs are so engorged with hatred for the human race that only crushing the spirit of hope in humans can you bear your foul existence for even a moment. Seriously bro, what a dick.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alpha Protocol is, again, alright. For a $19.99 game. So it's no surprise there isn't going to be an Alpha Protocol 2. The game is buggy, and combined with flawed gameplay mechanics it isn't much more than a bargain-bucket game with OK visuals. You ever trying sneaking through a level, almost making it, then having an enemy appear right in front you? Literally appear. And not only appear, &lt;i&gt;appear facing you.&lt;/i&gt; And then when you reload a save, despite being completely undetected at the time of the save, every enemy in the game is already in the alert state and aware of your presence. The difference between barreling through a level guns blazing and a slow, methodical stealth approach? Nothing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why is everyone trying to sell shitty games for $59.99 ($49.99 on the PC)? On the plus side, this has opened up the market for indie games that are worth their price, but damn it's obnoxious when every game that comes in a box is trying to max out the price ceiling for whatever platform they're targeting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, Merry Christmas.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6118867489231173173?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6118867489231173173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6118867489231173173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6118867489231173173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6118867489231173173'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/12/alpha-protocol-aint-no-deus-ex.html' title='Alpha Protocol ain&apos;t no Deus Ex.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3210274561458384578</id><published>2010-12-05T21:08:00.002-05:00</published><updated>2010-12-05T21:12:49.967-05:00</updated><title type='text'>Deus Ex: wow. again.</title><content type='html'>I played Deus Ex years ago, when it first came out. Never played the sequel.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Got a chance to play them both again when they were on sale on Steam during the Thanksgiving holiday. You know the one, where everyone runs amok and crush babies underfoot while trying to get $5 off a $1900 television set. Yeah, that one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, goddamn. DX, and even DX:IW, had to be the best games I've played in years. I mean that literally -- even with dated graphics and stupid gameplay problems they're the best. How long has it been since I paused, I &lt;i style="font-weight: bold; "&gt;stopped what I was doing mid-game&lt;/i&gt; and actually thought about the consequences of my actions?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At the end of DX:IW, I'm standing in front of the rebuilt statue of liberty, asking myself, "Is this the right choice?" I literally didn't know what I wanted to do. I skulked around, found the other factions in the game and talked to them. Still couldn't decide. Leo (crazy-ass Leo) wanted me to blow them all to hell and let mankind make its own choices, for better or for worse. As much as I agreed with him, I couldn't help but think of the people in the Old Cairo medina who would get crushed in that scenario.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After 10 or 15 minutes of wandering through snowy Liberty Island, I made my choice.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope it was the right one.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3210274561458384578?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3210274561458384578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3210274561458384578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3210274561458384578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3210274561458384578'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/12/deus-ex-wow-again.html' title='Deus Ex: wow. again.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3130719257593376205</id><published>2010-11-30T18:33:00.002-05:00</published><updated>2010-11-30T18:37:21.301-05:00</updated><title type='text'>As much as Ubuntu's Unity sucks...</title><content type='html'>...it's the best there is, if you want a Linux distro on your netbook.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MeeGo is zippy (faster than Unity, actually), but it's lacking features that I've come to expect in a modern operating system, and installing new software seems nonexistent -- I could never find a way to enable streaming music from my DAAP server, for instance, and, unlike Unity, I couldn't get my bluetooth headphones to work with audio from Chrome -- only from the local music player, Banshee.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other distributions are more up to date (Fedora, etc) but they just don't work well on the small screen of a netbook, and I'm not really into manually paring down the user interface to try and get everything to "fit."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, here I am, installing Ubuntu 10.10 on my netbook again...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&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-3130719257593376205?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3130719257593376205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3130719257593376205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3130719257593376205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3130719257593376205'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/11/as-much-as-ubuntus-unity-sucks.html' title='As much as Ubuntu&apos;s Unity sucks...'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4663576731065862368</id><published>2010-10-01T15:26:00.005-04:00</published><updated>2010-10-02T01:06:24.058-04:00</updated><title type='text'>Dear would-be start-ups: an exit is not a business plan.</title><content type='html'>No. &lt;b&gt;NO&lt;/b&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;NO.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An exit is not a business plan. An exit is like some kind of Christmas surprise: it's instant money, winning a scratch-off lottery ticket when all you've got in your pocket is 32 cents and a half-used condom. Saying that your business plan is "to exit" is essentially saying that you've got gambling issues and need to check in to rehab.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I get a lot of offers for revenue sharing (my position being anywhere from developer to CTO) and the business plan almost always, invariably, bad. Very bad. But the worst are exits, where the founder plans to "float" on whatever savings and investments he can get on the slim hopes that he gets acquired and we have a major payday. It's insane.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Insane.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stop doing it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because you know what the worst part about it is? Some of these people have very good ideas, great for monetization, but because they're so adamant about their major payday, they're going to end up with nothing instead of the something they could have had.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4663576731065862368?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4663576731065862368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4663576731065862368' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4663576731065862368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4663576731065862368'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/10/dear-would-be-start-ups-exit-is-not.html' title='Dear would-be start-ups: an exit is not a business plan.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5794844557136845764</id><published>2010-07-19T22:32:00.004-04:00</published><updated>2010-07-19T22:39:18.209-04:00</updated><title type='text'>FGLRX + Black Bars at 1920x1200 (or 1920x1800).</title><content type='html'>When I first enabled hardware accelerated drivers in Ubuntu, I thought I had stumbled across an odd bug -- when I was using the default resolution (1920x1200), I had two black bars at the left and right side of my screen. I was totally stumped, and decided it was a driver bug.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fast forward a month later, trying to enable hardware accelerated drivers again, and the same issue persists.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Well, apparently the fix is pretty trivial: Open up the "Catalyst Control Center" (in your System --&gt; Preferences menu entry), select your current display, go to the adjustments tab, and for scaling options, move the slider all the way to the right (0% in other words). See attached picture.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/_AHQVJOUROvU/TEUMFfPPX3I/AAAAAAAAAFo/D3g5DhtwNHM/s400/Screenshot-Catalyst+Control+Center-1.png" style="cursor:pointer; cursor:hand;width: 400px; height: 314px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5495812208699858802" /&gt;&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-5794844557136845764?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5794844557136845764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5794844557136845764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5794844557136845764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5794844557136845764'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/07/fglrx-black-bars-at-1920x1200-or.html' title='FGLRX + Black Bars at 1920x1200 (or 1920x1800).'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AHQVJOUROvU/TEUMFfPPX3I/AAAAAAAAAFo/D3g5DhtwNHM/s72-c/Screenshot-Catalyst+Control+Center-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-9208757865870522689</id><published>2010-06-26T20:18:00.004-04:00</published><updated>2010-06-26T20:31:40.866-04:00</updated><title type='text'>Separate vendor prefixes for CSS sucks</title><content type='html'>Seriously.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Here's my Sass mixins for some CSS3 stuff:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;@mixin box-shadow($color, $radius = 1em) {&lt;br /&gt;-moz-box-shadow: 0 0 $radius $color;&lt;br /&gt;-webkit-box-shadow: 0 0 $radius $color;&lt;br /&gt;box-shadow: 0 0 $radius $color;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;@mixin transitions($properties, $duration, $delay = 0) {&lt;br /&gt;-moz-transition-property: $properties;&lt;br /&gt;-webkit-transition-property: $properties;&lt;br /&gt;-o-transition-property: $properties;&lt;br /&gt;transition-property: $properties;&lt;br /&gt;&lt;br /&gt;-moz-transition-duration: $duration;&lt;br /&gt;-webkit-transition-duration: $duration;&lt;br /&gt;-o-transition-duration: $duration;&lt;br /&gt;transition-duration: $duration;&lt;br /&gt;&lt;br /&gt;-moz-transition-delay: $delay;&lt;br /&gt;-webkit-transition-delay: $delay;&lt;br /&gt;-o-transition-delay: $delay;&lt;br /&gt;transition-delay: $delay;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;and here's where they get used:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;.post.snippet:hover {&lt;br /&gt;@include transitions(background-color, 2s);&lt;br /&gt;@include transitions(box-shadow, 2s);&lt;br /&gt;@include transitions(-moz-box-shadow, 4s);&lt;br /&gt;@include transitions(-webkit-box-shadow, 4s);&lt;br /&gt;@include transitions(box-shadow, 4s);&lt;br /&gt;&lt;br /&gt;@include box-shadow(#0481B5, 1em);&lt;br /&gt;background-color: #0481B5;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Which results in this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;.post.snippet:hover {&lt;br /&gt;-moz-transition-property: background-color;&lt;br /&gt;-webkit-transition-property: background-color;&lt;br /&gt;-o-transition-property: background-color;&lt;br /&gt;transition-property: background-color;&lt;br /&gt;-moz-transition-duration: 2s;&lt;br /&gt;-webkit-transition-duration: 2s;&lt;br /&gt;-o-transition-duration: 2s;&lt;br /&gt;transition-duration: 2s;&lt;br /&gt;-moz-transition-delay: 0;&lt;br /&gt;-webkit-transition-delay: 0;&lt;br /&gt;-o-transition-delay: 0;&lt;br /&gt;transition-delay: 0;&lt;br /&gt;-moz-transition-property: box-shadow;&lt;br /&gt;-webkit-transition-property: box-shadow;&lt;br /&gt;-o-transition-property: box-shadow;&lt;br /&gt;transition-property: box-shadow;&lt;br /&gt;-moz-transition-duration: 2s;&lt;br /&gt;-webkit-transition-duration: 2s;&lt;br /&gt;-o-transition-duration: 2s;&lt;br /&gt;transition-duration: 2s;&lt;br /&gt;-moz-transition-delay: 0;&lt;br /&gt;-webkit-transition-delay: 0;&lt;br /&gt;-o-transition-delay: 0;&lt;br /&gt;transition-delay: 0;&lt;br /&gt;-moz-transition-property: -moz-box-shadow;&lt;br /&gt;-webkit-transition-property: -moz-box-shadow;&lt;br /&gt;-o-transition-property: -moz-box-shadow;&lt;br /&gt;transition-property: -moz-box-shadow;&lt;br /&gt;-moz-transition-duration: 4s;&lt;br /&gt;-webkit-transition-duration: 4s;&lt;br /&gt;-o-transition-duration: 4s;&lt;br /&gt;transition-duration: 4s;&lt;br /&gt;-moz-transition-delay: 0;&lt;br /&gt;-webkit-transition-delay: 0;&lt;br /&gt;-o-transition-delay: 0;&lt;br /&gt;transition-delay: 0;&lt;br /&gt;-moz-transition-property: -webkit-box-shadow;&lt;br /&gt;-webkit-transition-property: -webkit-box-shadow;&lt;br /&gt;-o-transition-property: -webkit-box-shadow;&lt;br /&gt;transition-property: -webkit-box-shadow;&lt;br /&gt;-moz-transition-duration: 4s;&lt;br /&gt;-webkit-transition-duration: 4s;&lt;br /&gt;-o-transition-duration: 4s;&lt;br /&gt;transition-duration: 4s;&lt;br /&gt;-moz-transition-delay: 0;&lt;br /&gt;-webkit-transition-delay: 0;&lt;br /&gt;-o-transition-delay: 0;&lt;br /&gt;transition-delay: 0;&lt;br /&gt;-moz-transition-property: box-shadow;&lt;br /&gt;-webkit-transition-property: box-shadow;&lt;br /&gt;-o-transition-property: box-shadow;&lt;br /&gt;transition-property: box-shadow;&lt;br /&gt;-moz-transition-duration: 4s;&lt;br /&gt;-webkit-transition-duration: 4s;&lt;br /&gt;-o-transition-duration: 4s;&lt;br /&gt;transition-duration: 4s;&lt;br /&gt;-moz-transition-delay: 0;&lt;br /&gt;-webkit-transition-delay: 0;&lt;br /&gt;-o-transition-delay: 0;&lt;br /&gt;transition-delay: 0;&lt;br /&gt;-moz-box-shadow: 0 0 1em #0481b5;&lt;br /&gt;-webkit-box-shadow: 0 0 1em #0481b5;&lt;br /&gt;box-shadow: 0 0 1em #0481b5;&lt;br /&gt;background-color: #0481B5; }&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;So, yeah: I'm switching to jQueryUI for most of the animation heavy lifting, now.  Hopefully browsers start dropping the -moz, -o and -webkit for primary use and settle on -v (vendor) or something like that in the future. Maybe with fallbacks to their own prefixes in case someone really really really needs to specify that -moz handles it another way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-9208757865870522689?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/9208757865870522689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=9208757865870522689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9208757865870522689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9208757865870522689'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/06/separate-vendor-prefixes-in-css-drafts.html' title='Separate vendor prefixes for CSS sucks'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6607116430036757258</id><published>2010-06-09T02:44:00.002-04:00</published><updated>2010-06-09T02:48:02.798-04:00</updated><title type='text'>Rails 2.3.8 + HTML strings.</title><content type='html'>Be careful with doing concatenating inside of ERB views with Rails 2.3.8.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This recently broke an app that concat'd (via '+')  two strings full of HTML.  Before you ask, no, I don't know why anyone would do that in a view of all places.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The quick fix was to call String#html_safe on the second string (I didn't check to see if there was any other solution since the fix was urgent).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Without String#html_safe, what ended up happening was that the 2nd string's HTML was escaped -- thus breaking the app in a few places.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6607116430036757258?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6607116430036757258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6607116430036757258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6607116430036757258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6607116430036757258'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/06/rails-238-html-strings.html' title='Rails 2.3.8 + HTML strings.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1180361648826754230</id><published>2010-06-06T18:20:00.003-04:00</published><updated>2010-06-06T18:43:39.559-04:00</updated><title type='text'>I'm a Penguin.</title><content type='html'>For the past 2 years, I've been keeping my personal life Windows powered, and my development life Linux-powered.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No more!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As of two days ago, I have replaced my Windows machine with a shiny black Ubuntu box. Three years ago, when I purchased my Windows Vista laptop (thinking it couldn't be all that bad, HO HO HO &lt;b&gt;&lt;i&gt;WRONG&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;), there were still several desktop applications that I used on a regular basis.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When I decided to upgrade again this year, I took a long, hard look at my desktop usage for a few days.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One desktop application (that runs fine under Wine, by the way), and Chrome. That's it -- my computing life essentially consists of nothing but webapps. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So when it came time to upgrade, I had a simple choice: Windows 7 or Ubuntu. I've long sinced used Ubuntu for my development PC, and I was very comfortable with it. It's got great hardware support and it's fast as hell (my developer machine is specc'd lower than my Windows laptop, yet performs much better).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, given a choice between two almost identical operating systems in terms of functionality, which one do you choose? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The free one.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1180361648826754230?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1180361648826754230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1180361648826754230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1180361648826754230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1180361648826754230'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/06/im-penguin.html' title='I&apos;m a Penguin.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2737334973145980881</id><published>2010-05-20T16:46:00.002-04:00</published><updated>2010-05-20T16:59:08.715-04:00</updated><title type='text'>I love Sproutcore, but I hate it.</title><content type='html'>&lt;a href="http://sproutcore.com/"&gt;Sproutcore &lt;/a&gt;is awesome -- it's a framework for building rich web applications. It's got a lot of nice widgets, the default theme is pretty, and it uses an MVC-style pattern.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem is, I hate it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A long time ago, I used to be a desktop developer, primarily .NET apps. Unlike HTML, when you're creating the user interface for a desktop application, there's no markup language you can use, like HTML. Instead of this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;button&gt;Click me!&lt;/button&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;You write this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;b = Button.new();&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;b.Text = "Click me!";&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;b.Position = new Position(1,1);&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;b&gt;canvas.addControl(b);&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now imagine a user interface full of buttons, tabs, and other things to play with, and you'll see where I'm going with the second half of this post title.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;I HATE LAYING OUT USER INTERFACES IN SPROUTCORE&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you see how the UI is laid out in Sproutcore, it's like shell-shock; it immediately takes me back to the days of writing desktop app UIs, and that is terrible. I consider Sproutcore worse, though, because the end result of defining your UI through Sproutcore ends up being HTML! Man, I love me some exclamation marks, btw.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I mean, if we're going to render in browsers anyway, I think it'd be better to exploit what browsers already have, which is the DOM. Facebook does it with its &lt;b&gt;&lt;fb:...&gt; &lt;/b&gt;tags, so I don't see why Sproutcore can't do it with its own &lt;b&gt;&lt;sc:...&gt; &lt;/b&gt;tags. Will there be a slight delay as the custom tags get processed? Yeah. But the delay is minimal... and I'd deal with the delay rather than the misery of laying out UI elements in code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And no, visual designers that just output the code for laying out a UI is not a substitute. Anyone who has done some heavy UI hacking knows that once you hit a certain point the designer just gets in the way -- and worse, all the designer-generated code is terrible, and trudging through it is like walking across hot coals.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I love Sproutcore, but when it comes to hacking out the user interface, it is not my cup of tea. For a few small internal applications, it's OK -- the UI drudgery isn't much -- but there's no way I'm breaking out a large interactive application using it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2737334973145980881?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2737334973145980881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2737334973145980881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2737334973145980881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2737334973145980881'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/05/i-love-sproutcore-but-i-hate-it.html' title='I love Sproutcore, but I hate it.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2242919262198916586</id><published>2010-04-27T01:43:00.003-04:00</published><updated>2010-04-27T01:49:01.963-04:00</updated><title type='text'>I should've never stopped using Hoptoad.</title><content type='html'>Man, Exceptional is crap. The only reason I even deployed it for this project is because production is being hosted on Heroku and installing + configuring it was just a click.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not worth the click, by the way, 'cuz  not only does the free plan under deliver, but the premium plan is ridiculously priced compared to Hoptoad. For $10 less you get about 2x more than the equivalent Exceptional plan. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now my only problem is cajoling clients to set up their own Hoptoad account (I do not like 'owning' accounts that have client data).&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-2242919262198916586?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2242919262198916586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2242919262198916586' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2242919262198916586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2242919262198916586'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/04/i-shouldve-never-stopped-using-hoptoad.html' title='I should&apos;ve never stopped using Hoptoad.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-8753580955268302734</id><published>2010-04-25T04:20:00.002-04:00</published><updated>2010-04-25T04:28:36.149-04:00</updated><title type='text'>Your code is not your product.</title><content type='html'>Your code is not your product, it will not make money rain from the sky, and letting contractors -- people you're paying -- see it will not be the end of your world.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Twitter was someone's weekend hack that made it big thanks to idea and execution, not the 4 hours someone spent coding it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Your code is only worth what you paid for it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-8753580955268302734?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/8753580955268302734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=8753580955268302734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8753580955268302734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8753580955268302734'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/04/your-code-is-not-your-product.html' title='Your code is not your product.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2338394390001923410</id><published>2010-03-31T04:16:00.002-04:00</published><updated>2010-03-31T04:29:46.684-04:00</updated><title type='text'>Gnome Shell is a total win.</title><content type='html'>I been using Gnome Shell exclusively for the past few days on my development computer, and I gotta say, I love it to death. I was using the version of gnome-shell in the Ubuntu repos, and while it was OK, it wasn't particularly engaging or anything... but the &lt;a href="https://launchpad.net/~ricotz/+archive/testing"&gt;Gnome Shell Testing PPA&lt;/a&gt; is freakin' awesome. It still needs some polish (there's annoying flicker every once in awhile, and the top bar freaks out when I switch to RubyMine), but it's streamlined the way I use my computer.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Two things I'm missing: &lt;/div&gt;&lt;div&gt;* a quick way to summon the activities tab for a search (which is how I start most apps)&lt;/div&gt;&lt;div&gt;* Ubuntu's special applets, what are they called, the indicator and the me menu?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I really do miss the "Me Menu" though. Here's hoping Lucid can integrate it with Gnome Shell somehow.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other than that, it's a blast. I've really taken to snapping the mouse to the upper left to get that Expose-like windows discovery, and its pretty much replaced ALT-TAB and minimizing windows for me. The transition is fast and smooth; ALT-TAB feels especially clumsy after discovering windows this way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not too sold on the "sidebar" though (click your name, then click 'sidebar' to see it). Doesn't seem to do anything more than moving to the activities tab, and given how fast "Activities" responds to a quick mouse flick I'm not sure I'd even use the sidebar. I haven't been, so far.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Could definitely do with a smaller "recent items" and a bigger "applications" / favorite space, too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, enough rambling. I have to go fix this "mysteriously broken" Vista laptop. You like that, yeah? "Mysteriously broken?" 'Cuz I sure as hell don't.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2338394390001923410?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2338394390001923410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2338394390001923410' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2338394390001923410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2338394390001923410'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/03/gnome-shell-is-total-win.html' title='Gnome Shell is a total win.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2177334351292463180</id><published>2010-03-28T17:06:00.003-04:00</published><updated>2010-03-28T17:20:33.504-04:00</updated><title type='text'>Parents + Ubuntu</title><content type='html'>So, my parents use Linux now.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My dad, using my borrowed laptop; the old windows laptop he had ran for crap. My laptop is super old too, but it's got Ubuntu on it and it's dead simple to use. He's running 9.10 now, after I upgraded it. My mom's using my old netbook sometimes, which is running some bizarre off-brand distro that I'd like to nuke and put Ubuntu Netbook on it, if I can figure out how to get it to work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ubuntu's evolved to the point where my dad can use it for pretty much everything -- his proprietary FOREX trading software works alright in WINE (a little laggy starting up), he can play WMV videos in webpages (because he goes to those old government sites that still use it), the Internet is fast and compatible with Firefox... pretty cool. He even knows how to install security updates, though he tends to ignore the Update Manager dialog.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They're moving the close/min/max buttons to the left in Ubuntu 10.04, which everyone I'm sure has already heard about. I don't really care, because I'm going to change it back immediately, because I'm one of those people that don't really pay attention and occasionally hit the title bar instead of the menu bar, which is going to be an instant close/min/max given the circumstances.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm not so much worried about myself but worried for my parents. They're not on the computer a lot, so they don't have the sniper-like aim of regular computer users. The moment I saw a shot of the new button placement the first thing I saw in my mind was my dad trying to press one of the buttons in Firefox and hitting close window button instead. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fortunately, &lt;a href="http://www.omgubuntu.co.uk/2010/03/ubuntu-1004-window-buttons-back-on.html"&gt;OMG Ubuntu reports that for other themes&lt;/a&gt;, the window control buttons will remain on the right side of the screen. So, as long as I perform the distro upgrade myself, and make sure to change the theme to something else, it'll be fine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But still, I don't like that Ubuntu's taken a step back and re-inserted me into the picture. Ubuntu was at the point where I wasn't needed: didn't have a codec to play a video? My dad figured out how to do that by himself, because all he had to do was click "find codec" and put in his password. Needed plugin for website? Firefox has it handled. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I gotta do the distro upgrade for him because he won't be able to figure out how to fix the booby-trapped window titlebars? Sheesh.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh well. Nobody's perfect, I guess.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;EDIT:&lt;/b&gt; before I get any flak for this, let it be known: I don't care for "uniqueness." I'm a programmer. Functionality &gt; Form.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2177334351292463180?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2177334351292463180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2177334351292463180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2177334351292463180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2177334351292463180'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/03/parents-ubuntu.html' title='Parents + Ubuntu'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-9038056941196521871</id><published>2010-03-28T03:23:00.002-04:00</published><updated>2010-03-28T03:30:08.837-04:00</updated><title type='text'>Worst anime I've ever watched: Infinite RYVIUS</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Infinite_Ryvius"&gt;Infinite RYVIUS&lt;/a&gt; (wikipedia) has got to be the worst anime I've ever watched. It is in fact so bad that I commonly use it for reference when discussing stuff I hate, which is why I'm bothering to mention it even though I watched it a year and a half ago.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Spoiler free syonpsis: a bunch of space cadets become stranded on a massive warship while evacuating their disintegrating space station; order breaks down because the top cadets can't keep the rest of them in line while they try to find their way home, and it turns into Lord of the Flies in Space.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It started off strong, but midway through I just hated it. &lt;i&gt;Loathed it.&lt;/i&gt; Something deep in my gut said, "This is a terrible, awful story."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you tell a story like this, a story that makes you &lt;b&gt;&lt;i&gt;hate&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; all of the characters, there's gotta be something worthwhile tucked away. Some little spark of hope or redemption that makes it worth-while. Infinite RYVIUS has none of this. &lt;i&gt;Nothing.&lt;/i&gt; &lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;During an encounter with a hostile space-ship, I suddenly yelled "FUCK YAH!" when I thought the enemy space ship was actually going to sink them. That's how much I hated the whole thing.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;But, being how I am, I ended up watching it through to the end. There's a happy ending, but it isn't enough to make the anime taste like anything other than goddamn awful.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;So now you know: when I start rambling about kids and space and hoping the whole goddamn ship blows up into a million pieces, you'll know what I was talking about: Infinite RYVIUS.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-9038056941196521871?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/9038056941196521871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=9038056941196521871' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9038056941196521871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9038056941196521871'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/03/worst-anime-ive-ever-watched-infinite.html' title='Worst anime I&apos;ve ever watched: Infinite RYVIUS'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7980504846040616898</id><published>2010-03-27T19:01:00.002-04:00</published><updated>2010-03-27T19:10:09.037-04:00</updated><title type='text'>Prototype vs jQuery: are we still having this discussion?</title><content type='html'>Seriously, are we?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I literally don't know anyone that is still using Prototype for reasons other than, "that's what we started with."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah, I guess I'm ragging on you if you're still using Prototype intentionally. Sorry, but it's pretty funny form my point of view. Take solace in the fact that nobody loves me, Prototypers.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7980504846040616898?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7980504846040616898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7980504846040616898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7980504846040616898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7980504846040616898'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2010/03/prototype-vs-jquery-are-we-still-having.html' title='Prototype vs jQuery: are we still having this discussion?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><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='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5735638669054937237' title='7 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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>7</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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2295226789110571609' title='29 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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>29</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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-8790223880841471684</id><published>2009-01-02T19:57:00.002-05:00</published><updated>2009-01-02T19:58:07.812-05:00</updated><title type='text'>My Dirty Programming Secret #424</title><content type='html'>I develop Ruby on Rails...&lt;br /&gt;&lt;br /&gt;...using &lt;span style="font-weight: bold;"&gt;Ubuntu&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;...inside of a virtual machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-8790223880841471684?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/8790223880841471684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=8790223880841471684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8790223880841471684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8790223880841471684'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2009/01/my-dirty-programming-secret-424.html' title='My Dirty Programming Secret #424'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7502141682008441733</id><published>2008-12-31T16:08:00.002-05:00</published><updated>2008-12-31T16:14:31.124-05:00</updated><title type='text'>Preoptimization in real life.</title><content type='html'>So yesterday I went down to my local Subway (we actually have 2, but I don't go to one of them because it's a pain traffic-wise), and got in line. I had plenty of time to decide what I wanted; about two minutes since the small family in front of me was taking their time.&lt;br /&gt;&lt;br /&gt;No sweat, even though I picked out what I wanted in about 10 seconds.&lt;br /&gt;&lt;br /&gt;I spent the rest of the time thinking about how to phrase the sentence,&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-weight: bold;"&gt;I want a foot-long Subway Club on wheat.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;But then I thought to myself, "&lt;span style="font-weight: bold;"&gt;If I say I want a foot long wheat Subway Club&lt;/span&gt;," she'll be able to get the sub bread before I finish speaking. Then I realized that, although that sentence is understandable, it is not very "correct." Would she understand immediately, or would it introduce a further delay in my sub making adventure? On the other hand, even if she did understand it immediately, would she even be able to react in time before I finished the sentence? Was the optimization even worth it?&lt;br /&gt;&lt;br /&gt;I totally wasn't paying attention by then, so when she said "What do you want?" I kinda jerked in place and replied,&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-weight: bold;"&gt;Uh, a subway club. On wheat. Foot long wheat.&lt;/span&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7502141682008441733?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7502141682008441733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7502141682008441733' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7502141682008441733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7502141682008441733'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/preoptimization-in-real-life.html' title='Preoptimization in real life.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3930614232506729009</id><published>2008-12-30T20:39:00.006-05:00</published><updated>2008-12-30T20:56:30.878-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='openoffice'/><category scheme='http://www.blogger.com/atom/ns#' term='google docs'/><category scheme='http://www.blogger.com/atom/ns#' term='google documents'/><title type='text'>Importing OpenOffice files into Google Documents: Don't.</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;OR: what to do when Google Docs screws up your formatting (see end)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;Seriously, don't do it.&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First of all, the file upload size is much too small -- there's some ridiculously small cap, like 500kb. I got a document here, 1.1MB -- all text -- that just can't be imported. So now I got some documents in Google Docs, some documents out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Secondly, and most importantly, Google Docs totally fucks up imported styles. Witness:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/_AHQVJOUROvU/SVrN9q0aNNI/AAAAAAAAABI/_AGrBbmbjyM/s400/yeah_no_thanks_google_docs.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 11px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5285763572022523090" /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Now dude, I love me some Google Docs, but that just isn't fun. The only way to fix it, as far as I can tell, is to just "rewrite" those particular lines all over again. But I've got an entire document full of them and it ain't pretty business.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;If I could do it all over again I'd just do a massive C/P job, which seems to preserve the formatting.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Still, it's not enough to make me give up Google Documents, which is excellent. I just hope they keep better backups than I do.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I've cleverly deduced that for some parts of the document, Google Docs doesn't have a font set -- eg, you click into a paragraph and the 'font' drop-down is empty. If you select all of the document contents and set the font to something like Veranda for the whole document, it seems to correct the graphical glitches. Of course now the document doesn't look quite right, and it's still missing the linebreaks that the original document had, but at least now it's readable -- and, editable.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3930614232506729009?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3930614232506729009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3930614232506729009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3930614232506729009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3930614232506729009'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/importing-openoffice-files-into-google.html' title='Importing OpenOffice files into Google Documents: Don&apos;t.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_AHQVJOUROvU/SVrN9q0aNNI/AAAAAAAAABI/_AGrBbmbjyM/s72-c/yeah_no_thanks_google_docs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1988969650062251096</id><published>2008-12-27T01:42:00.003-05:00</published><updated>2008-12-27T01:45:03.105-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='i don&apos;t know what i&apos;m doing with my life'/><category scheme='http://www.blogger.com/atom/ns#' term='flex 2'/><title type='text'>Flex file uploads: no custom HTTP headers for you!</title><content type='html'>Stubbed my toe on this recently.&lt;br /&gt;&lt;br /&gt;For some reason (unexplained, and it seems unlikely that this is an actual security issue) you can't have custom HTTP headers for file uploads in Flex 3.2 (possibly Flash as a whole). They state it in the documentation, to their credit, but it's more of an aside, tucked away at the end of an irrelevant paragraph, than a big red "HEY WE JUST CHOPPED OUT SOME FUNCTIONALITY YOU'D NORMALLY EXPECT TO BE THERE" warning.&lt;br /&gt;&lt;br /&gt;For half a minute I thought I was in ruby and said to myself, "I'll just override this and inject the custom headers myself," then I realized where I was and went "D'oh!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1988969650062251096?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1988969650062251096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1988969650062251096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1988969650062251096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1988969650062251096'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/flex-file-uploads-no-custom-http.html' title='Flex file uploads: no custom HTTP headers for you!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-8571954145137454628</id><published>2008-12-22T19:58:00.003-05:00</published><updated>2008-12-22T20:18:15.499-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aptana studio'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>Aptana: Changing Ruby Interpreter on a per-project basis?</title><content type='html'>Anyone know of a way to change the Ruby Interpreter in Aptana for each individual project?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been wanting to give it another test drive and see how the latest version compares, but for the life of me I couldn't make this one simple thing happen. I've got multiple projects in both Ruby and jRuby, so not being able to easily switch is a big big pain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I got as far as the "build path" bits, but I couldn't make those dance the way I wanted so I gave up and went back to NetBeans 6.5. Which works perfectly, but I'm not a fan of the default directory structure. If you use the "files" view instead of "projects" you lose a lot of functionality. :/&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; font-style: italic;"&gt;EDIT:&lt;/span&gt; "why not post on the Aptana forums?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because I forgot my username and password. And you can't get your password without supplying your username for some fucked up reason. So, basically I'm locked out of the forums. :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-8571954145137454628?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/8571954145137454628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=8571954145137454628' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8571954145137454628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/8571954145137454628'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/aptana-changing-ruby-interpreter-on-per.html' title='Aptana: Changing Ruby Interpreter on a per-project basis?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-9115762687345704783</id><published>2008-12-22T18:34:00.001-05:00</published><updated>2008-12-22T18:36:05.450-05:00</updated><title type='text'>"The Chrome."</title><content type='html'>That's what my mother's started calling The Internet ever sinced I set her up with a copy of Chrome.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;She says, "Hey, have you been on The Chrome? Why don't you put The Chrome on dad's laptop, too?"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;She misses one feature: auto-fill for forms. She found a toolbar somewhere that did it all by herself, and now she really mimsses it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That and Hotmail support. She is not happy she has to go back to using "the blue one" for Hotmail.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-9115762687345704783?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/9115762687345704783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=9115762687345704783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9115762687345704783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9115762687345704783'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/chrome.html' title='&quot;The Chrome.&quot;'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4488312657176332360</id><published>2008-12-18T17:23:00.003-05:00</published><updated>2008-12-18T17:32:15.636-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shoulda'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>ThoughtBot Shoulda -- It Whups the RSpec's ass.</title><content type='html'>Anyone remember that?!&lt;br /&gt;&lt;br /&gt;Heh, heh. Yeah, back when people used WinAMP... I guess they still might. I switched to WMP (gawd, I know), but then to Songbird when it finally stopped sucking (still sucks a little, to be honest).&lt;br /&gt;&lt;br /&gt;Anyway, for newer Rails projects, I've completely replaced RSpec with &lt;a href="http://www.thoughtbot.com/projects/shoulda/"&gt;Shoulda&lt;/a&gt;. It's nice, clean, readable, doesn't add anything extra to the Rails folder hierarchy, and best of all, it is filled with sweet-as-hell macros that take a lot of pressure off'a my tired fingers.&lt;br /&gt;&lt;br /&gt;For non-Rails projects (I do those too!), they offer a gem, but I haven't used it yet.&lt;br /&gt;&lt;br /&gt;It seems like every day that something exciting and awesome happens in the Ruby / Rails area, and everyone moves up to the next big thing... but I think that's because the next big thing is better than the thing you happen to be using at the moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4488312657176332360?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4488312657176332360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4488312657176332360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4488312657176332360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4488312657176332360'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/thoughtbot-shoulda-it-whups-rspecs-ass.html' title='ThoughtBot Shoulda -- It Whups the RSpec&apos;s ass.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3742170934573812537</id><published>2008-12-17T01:04:00.005-05:00</published><updated>2008-12-17T01:28:04.282-05:00</updated><title type='text'>SaaS RailsKit: I've hit my first WTF, and I don't think it will be my last.</title><content type='html'>&lt;div&gt;(an hour in)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;WTF #1: the way the database is boot-strapped.&lt;div&gt;WTF #2: "accounts.full_domain" -- ?! Yay for adding, requiring, and building code around things that not every SaaS app is going to need!&lt;/div&gt;&lt;div&gt;WTF #3: rdoc, motherfuckers. Get some.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Update&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ugh. This thing was clearly modelled around 37signal-style SaaS. I can probably use most of it and just use dummy values to satisfy the bits that won't be used, but still.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3742170934573812537?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3742170934573812537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3742170934573812537' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3742170934573812537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3742170934573812537'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/saas-railskit-ive-hit-my-first-wtf-and.html' title='SaaS RailsKit: I&apos;ve hit my first WTF, and I don&apos;t think it will be my last.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4887227628897994112</id><published>2008-12-16T16:41:00.002-05:00</published><updated>2008-12-16T16:49:20.532-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='heroku'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><title type='text'>"She's dead, Jim."</title><content type='html'>Awhile ago if you had asked me about free, super-easy Rails hosting, I would have blown your mind by mentioning &lt;a href="http://www.heroku.com"&gt;Heroku&lt;/a&gt; -- cloud-based Rails hosting. FREE cloud-based Rails hosting.&lt;br /&gt;&lt;br /&gt;Lately, though, I'm not so sure.&lt;br /&gt;&lt;br /&gt;Check out the &lt;a href="http://groups.google.com/group/heroku/topics"&gt;Heroku Google Group&lt;/a&gt;. There are a lot of complaints there, and no one from Heroku is talking. Seeing "my website has been down for 4 days," and then seeing another say "mine too" without any response from the Heroku team is enough to put you on edge. But, maybe these issues &lt;span style="font-weight: bold;"&gt;are&lt;/span&gt; getting handled, and they back-and-forth just isn't taking place on the group. If so, maybe Heroku should think about having their own ticket system or something in place, because as it stands now, all the unaswered complaints are casting a bad light on the service as a whole.&lt;br /&gt;&lt;br /&gt;All that considered, if you're looking for an extremely easy way to deploy a trivial little app, Heroku might be for you. I've got my own VPS, but lord knows using Heroku would be a lot easier... but I'll wait until they come out of beta for that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4887227628897994112?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4887227628897994112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4887227628897994112' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4887227628897994112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4887227628897994112'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/shes-dead-jim.html' title='&quot;She&apos;s dead, Jim.&quot;'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4166835963744034230</id><published>2008-12-15T00:20:00.004-05:00</published><updated>2008-12-15T00:24:12.618-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='madness'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Using jQuery with Dojo?</title><content type='html'>Can someone come up with a really good reason for me not to use &lt;a href="http://jquery.com/"&gt;jQuery &lt;/a&gt;with &lt;a href="http://dojotoolkit.org"&gt;Dojo&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Because the way I see it, jquery + jquery-ui is pretty fantastic, so throwing in dojo when I need something a bit more powerful (dojox.gfx anyone?) seems like it could be a good fit.&lt;br /&gt;&lt;br /&gt;Dojo seems to keep their stuff locked tight in the "dojo" namespace, so I don't see any collisions happening, but I've given it just a glance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4166835963744034230?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4166835963744034230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4166835963744034230' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4166835963744034230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4166835963744034230'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/using-jquery-with-dojo.html' title='Using jQuery with Dojo?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1927835575097375615</id><published>2008-12-13T22:40:00.003-05:00</published><updated>2008-12-13T22:52:00.836-05:00</updated><title type='text'>Rails Plugin developers: *PLEASE* don't use Prototype's $() syntax in your plugins!</title><content type='html'>One of the very first things I like to do when starting a project from scratch in Rails is to throw out Prototype and bring in jQuery via jRails. Look, I love me some Rails, but I hate me some Prototype -- it's like someone spilled their goddamn Java over my sparkling Ruby somehow.&lt;br /&gt;&lt;br /&gt;Not cool, man.&lt;br /&gt;&lt;br /&gt;Anyway, the thrust of this post is about not using Prototype's shorthand syntax when developing plugins that include UI elements. I name no names, but a few plugins take for granted that you'll be using Prototype throughout your project, and so use $() with reckless abandon. That's fine and all except when you're &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;not&lt;/span&gt;&lt;/span&gt; using Prototype everywhere, and are trying to use jQuery's sweet ass $() shorthand instead.&lt;br /&gt;&lt;br /&gt;I realize that jQuery comes with a no-conflict mode for situations like this, but it'd be cooler if plugins kept themselves as abstract as possible,  or just stuck to Rails Javascript generating code instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1927835575097375615?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1927835575097375615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1927835575097375615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1927835575097375615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1927835575097375615'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/rails-plugin-developers-please-dont-use.html' title='Rails Plugin developers: *PLEASE* don&apos;t use Prototype&apos;s $() syntax in your plugins!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1118377893791278662</id><published>2008-12-11T23:34:00.002-05:00</published><updated>2008-12-11T23:42:01.784-05:00</updated><title type='text'>Feeling stuck? Self-loathing? Shoe-gazing?</title><content type='html'>Think life can't get any worse?&lt;br /&gt;&lt;br /&gt;Have a good read through the &lt;a rel="nofollow" href="http://www.blackhatworld.com/blackhat-seo/"&gt;Black Hat SEO&lt;/a&gt; forum.&lt;br /&gt;&lt;br /&gt;If you're in a REALLY bad mood, time-travel back to the last time Google nuked a swatch of spammers from their index and read through the complete hysterical narrative.&lt;br /&gt;&lt;br /&gt;I mean, I was feeling pretty crappy earlier, but when you read about some guy about to go homeless because Dreamhost busted their account for spamming, well, you know, it puts things in perspective.&lt;br /&gt;&lt;br /&gt;I guess if you're a sadist you'll enjoy the fact that most of these people spend 2-3x the effort making 1/3rd the money most people make doing a regular job, but whatever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1118377893791278662?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1118377893791278662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1118377893791278662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1118377893791278662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1118377893791278662'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/feeling-stuck-self-loathing-shoe-gazing.html' title='Feeling stuck? Self-loathing? Shoe-gazing?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3530589462535603512</id><published>2008-12-10T20:52:00.003-05:00</published><updated>2008-12-10T21:04:50.102-05:00</updated><title type='text'>Flex / Adobe AIR == Ninja / Pirate</title><content type='html'>I didn't know, until I downloaded &lt;a href="http://flex.org/tour"&gt;Tour De Flex&lt;/a&gt;, just how badass this technology was.&lt;br /&gt;&lt;br /&gt;Browsing through the sample demos, I realized you could really build a regular desktop application using these technologies. I mean, I've hammered-out plenty of C# applications that could have easily been Flex + Adobe AIR applications if they had been around back then.&lt;br /&gt;&lt;br /&gt;And the install badges for AIR applications? It is, literally, out of this world. I haven't seen an install system look &lt;span style="font-weight: bold;"&gt;and &lt;/span&gt;feel so fluid since 3-4 years ago when I was looking at &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;mockups&lt;/span&gt;&lt;/span&gt; of web-based Linux package installers (Autopackage?).&lt;br /&gt;&lt;br /&gt;The big "killer" is the lack of a freely available IDE. Since Flex's MXML can be done by hand, and ActionScript is basically Javascript with a few nice add-ons, you don't really need anything advanced -- a nice text editor can do wonders. But since Flex has to be combiled into a SWF, it makes web-style development harder: kiss the iterative "code, refresh page, repeat" process goodbye.&lt;br /&gt;&lt;br /&gt;Still, all in all, it looks like a pretty solid set of technologies, and the development process is fairly similar to web design / programming. Could be an extremely valuable asset to pick up in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3530589462535603512?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3530589462535603512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3530589462535603512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3530589462535603512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3530589462535603512'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/flex-adobe-air-ninja-pirate.html' title='Flex / Adobe AIR == Ninja / Pirate'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5132859017074054695</id><published>2008-12-09T18:32:00.001-05:00</published><updated>2008-12-09T18:32:50.525-05:00</updated><title type='text'>zomg, are you sure?</title><content type='html'>Recently heard during development of an API:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"we don't need error codes" (paraphrased).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5132859017074054695?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5132859017074054695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5132859017074054695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5132859017074054695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5132859017074054695'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/zomg-are-you-sure.html' title='zomg, are you sure?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-9034843279451851005</id><published>2008-12-04T21:59:00.003-05:00</published><updated>2008-12-04T22:27:36.203-05:00</updated><title type='text'>Fun experiences with JavaFX.</title><content type='html'>&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: Yes, I updated to Java 6 Update 10 after #1.&lt;br /&gt;&lt;br /&gt;Had a peek at some JavaFX demos earlier -- have been evaluating XUL, Flash, and Silverlight lately, looking for a good, free, easy to target platform for enriching some sites. You know, giving them some *umph*. You know, a richer experience for those who can afford it (someone cue rimshot!).&lt;br /&gt;&lt;br /&gt;Here's how JavaFX played out:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Crashed the browser when I visited a JavaFX applet running an older version of Java (1.6 update 7). The *WHOLE* browser. All of it. Thanks, Sun.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Viewing the demos on javafx.com, they all repeatedly bitched about needing to use an "older" version of Java. Hit cancel, dialog pops up again -- FOREVER.&lt;/li&gt;&lt;li&gt;Jarring, incredibly annoying browser-wide freeze for about 6 seconds while Java sloughed itself into memory.&lt;/li&gt;&lt;/ol&gt;So far, typical Java.&lt;br /&gt;&lt;br /&gt;After I got the JavaFX demos up-and-running, they looked OK, but the demos aren't really reassuring.&lt;br /&gt;&lt;br /&gt;XUL's a good'un, but that's only for Firefox browsers. However, for an intranet setting, XUL would win out completely. Some Firefox plugins are freaking *awesome* -- and they're all pure XUL + Javascript.&lt;br /&gt;&lt;br /&gt;The whole javascript + svg + css + etc combo is in theory great but in reality minor browser differences are a big 'go fuck yourself.'&lt;br /&gt;&lt;br /&gt;Silverlight actually looks really good in the respect that it can be driven by JS and written with plain XML, but it's a downer, same as XUL, for people not running Windows and IE7. Yeah, they say there's Mac and Firefox support, but I haven't found a good sample that works aside from Netflix's Instant Viewing (that only ran in Firefox, by the way).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-9034843279451851005?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/9034843279451851005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=9034843279451851005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9034843279451851005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9034843279451851005'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/fun-experiences-with-javafx.html' title='Fun experiences with JavaFX.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6655480189921553525</id><published>2008-12-03T15:48:00.003-05:00</published><updated>2008-12-03T16:08:49.176-05:00</updated><title type='text'>Google Friend Connect vs Facebook Connect</title><content type='html'>Which should you use?&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;VS MODE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.google.com/friendconnect/"&gt;Google Friend Connect&lt;/a&gt; is really just a handful of widgets that let viewers have a "presence" on your site. Basically, within these widgets, Google / Yahoo users can talk to each other, discuss articles on the site, share pictures, etc, etc.&lt;br /&gt;&lt;br /&gt;This is the solution you want if you're looking to add a "no touch" social networking angle to your site: you just drop in the widget code where you want it to appear, and off you go. The sites using Google Friend Connect right now are pretty lackluster looking; the best integration you'll find is &lt;a href="http://www.billboardforthepeople.com/"&gt;Billboard for The People&lt;/a&gt;. This is programming-free social networking at its laziest.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developers.facebook.com/connect.php"&gt;Facebook Connect&lt;/a&gt; on the other hand, is for people who really want to dig in deep and have a much more fluid integration story. &lt;a href="http://www.techcrunch.com"&gt;TechCrunch &lt;/a&gt;(see &lt;a href="http://www.techcrunch.com/2008/12/03/techcrunch-is-now-in-a-relationship-with-facebook-connect/"&gt;this story&lt;/a&gt;) is doing it right -- you can connect your Facebook account to TechCrunch, and never have to enter your name / email / website ever again. You even get the option of publishing your comment to your profile, if you feel it's good enough. There's probably oodles more they could do, but I'm not much of a man for oodles, so I'll pretend I never said that.&lt;br /&gt;&lt;br /&gt;Since TechCrunch can perform deep integration using Facebook Connect, when you leave a comment as a Facebook user, the end result is fluid: the only difference anonymous comments and authenticated comments is the Facebook profile picture that shows up. It's got a funny blue 'F' in the lower right corner. Can't miss it.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;SHORTER VS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Use Google Friend Connect if you've got a blog or regular static website and just want to slap on some pretty regular social networking features.&lt;br /&gt;&lt;br /&gt;Use Facebook Connect if you need or want much better integration with your current site flow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6655480189921553525?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6655480189921553525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6655480189921553525' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6655480189921553525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6655480189921553525'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/google-friend-connect-vs-facebook.html' title='Google Friend Connect vs Facebook Connect'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7169504858008891212</id><published>2008-12-03T03:04:00.002-05:00</published><updated>2008-12-03T03:07:02.907-05:00</updated><title type='text'>C'mon, Firefox, what's the deal?</title><content type='html'>Look, Firefox, I love you, man, but I've been using Chrome recently and the way you compare in speed is just BS.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I mean, I only had two tabs open and you were using 400MB -- WTF?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And, I closed you about 2 minutes ago, and only now has the firefox.exe actually gone away -- although it was fun watching the "memory countdown" so to speak.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Seriously, bro, if Chrome offered even a sliver of the add-ons you did, I might be using it on a more permanent basis.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7169504858008891212?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7169504858008891212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7169504858008891212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7169504858008891212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7169504858008891212'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/12/cmon-firefox-whats-deal.html' title='C&apos;mon, Firefox, what&apos;s the deal?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7517139500799427126</id><published>2008-11-20T19:49:00.002-05:00</published><updated>2008-11-20T20:14:51.524-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Testing file uploads in Rails.</title><content type='html'>zomg, there are like no Google hits for this. This or 'test file upload in rails.' Whatever. Same deal.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was doing it "the hard way" earlier, until I stumbled across this while looking for something else entirely...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;# fixture_file_upload uses /fixtures as its base directory&lt;/div&gt;&lt;div&gt;post :foo_bar, :file =&gt; fixture_file_upload('/files/test_file.txt', 'text/plain', :binary)&lt;/div&gt;&lt;/blockquote&gt;Automatically does the multipart stuff, so you can add in extra normal parameters (:user_id =&gt; 1, etc).&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-7517139500799427126?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7517139500799427126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7517139500799427126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7517139500799427126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7517139500799427126'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/11/testing-file-uploads-in-rails.html' title='Testing file uploads in Rails.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1961815052457554893</id><published>2008-11-19T02:53:00.004-05:00</published><updated>2008-11-19T03:09:16.305-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 8.10'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualbox'/><title type='text'>Damn, sometimes I hate software.</title><content type='html'>I burned like four hours tonight because, when upgrading to Ubuntu 8.10 through VirtualBox, I had somehow hosed my graphics. I mean, really hosed. Imagine someone cuts your monitor into puzzle-shaped pieces, then scatters the pieces everywhere, but somehow the thing still works When you glide your mouse to the edge of a puzzle piece, it suddenly appears on the opposite side of the screen.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; font-style: italic;"&gt;That&lt;/span&gt; kinda hosed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem was, things were only borked in Ubuntu -- terminal worked fine. So I rage for awhile, make sure I'm running the latest version of VirtualBox, blow away my xorg.conf file repeatedly until I'm sure that's not the problem -- even circumnavigate the globe via the jigsawed Ubuntu to re-install the VirtualBox guest additions, because I totally forgot how to mount cdroms via the command line. &gt;:(&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The culprit?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As it turns out, something caught my eye on the settings screen -- the number "9."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Video memory:&lt;span class="Apple-style-span" style="font-weight: bold; font-style: italic;"&gt; 9.&lt;/span&gt;"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thinking about it for a moment, I quickly created a new, blank virtual machine to inspect its default settings: identical, except for one area. "Video memory: &lt;span class="Apple-style-span" style="font-style: italic; font-weight: bold;"&gt;8.&lt;/span&gt;"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yeah. Guess what started working again once I modified my Ubuntu virtual machine's video memory to 8 megs instead of 9?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's no surprise my Googling was fraught with much peril and little treasure. I bet practically nobody modifies the video memory setting, much less modifying it to an uneven number. Why does VirtualBox that let you put in uneven values for memory, anyway? Seems like a booby-trap waiting to happen.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had a backup of the virtual machine from earlier this morning (a literal backup), but damn, I had spent almost 2 hours upgrading Ubuntu to 8.10, and a part of me just didn't want to let it go.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, I caught my white whale for this week.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1961815052457554893?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1961815052457554893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1961815052457554893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1961815052457554893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1961815052457554893'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/11/damn-sometimes-i-hate-software.html' title='Damn, sometimes I hate software.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5170352193009953946</id><published>2008-11-12T16:51:00.003-05:00</published><updated>2008-11-12T16:58:26.271-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='left 4 dead'/><category scheme='http://www.blogger.com/atom/ns#' term='xbox360'/><title type='text'>Left 4 Dead: Get It Now.</title><content type='html'>Seriously. &lt;a href="http://www.amazon.com/gp/product/B000QY9C90?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000QY9C90"&gt;Left 4 Dead&lt;/a&gt;. Get it now. GET IT RIGHT NOW.&lt;br /&gt;&lt;br /&gt;Do you remember, a long time ago, playing games that were fun &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;even when you were losing?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagine playing a game like that with 3 other people, with randomized levels so nobody can memorize the pattern and just blow through them without a struggle.&lt;br /&gt;&lt;br /&gt;Grab the demo if you still need to be convinced. It's only got one chapter, but I played it for like 6 hours straight. There were enough changes each play through to make it an incredible experience.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/B000QY9C90?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000QY9C90"&gt;Left 4 Dead&lt;/a&gt; -- xbox 360&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/B000PS4X7S?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000PS4X7S"&gt;Left 4 Dead&lt;/a&gt; -- PC&lt;br /&gt;&lt;br /&gt;Sorry ps3 people, ain't no party for you.&lt;br /&gt;&lt;br /&gt;Also, it's like 6 bucks off right now, so I'd pull the trigger and use the left-over cash to buy yourself a happy meal or something.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5170352193009953946?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5170352193009953946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5170352193009953946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5170352193009953946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5170352193009953946'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/11/left-4-dead-get-it-now.html' title='Left 4 Dead: Get It Now.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-3938421133563324560</id><published>2008-11-10T23:25:00.002-05:00</published><updated>2008-11-10T23:26:50.498-05:00</updated><title type='text'>"odesk test answers?" Are you serious?</title><content type='html'>I just noticed that %5 of my blog visits are for the keywords "odesk test answers" and "odesk + rails + test."&lt;br /&gt;&lt;br /&gt;What the hell, man? If you can't pass any of those tests without cheating, I think you need a bit of work to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-3938421133563324560?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/3938421133563324560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=3938421133563324560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3938421133563324560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/3938421133563324560'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/11/odesk-test-answers-are-you-serious.html' title='&quot;odesk test answers?&quot; Are you serious?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1833506485335521935</id><published>2008-11-07T23:33:00.005-05:00</published><updated>2008-11-08T00:30:35.209-05:00</updated><title type='text'>Fable 2 vs Fallout 3: it's all about the choices, baby.</title><content type='html'>(contains affiliate links.)&lt;br /&gt;&lt;br /&gt;Today I just finished &lt;a href="http://www.amazon.com/gp/product/B000FRVAD4?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000FRVAD4"&gt;Fable II (Fable 2)&lt;/a&gt;. It's a fantasy adventure where you mold your Hero; good or evil, pure or corrupt --  your morality affects your standing, while your purity affects your physical appearance. At first it seems exciting, the concept of being able to mold your Hero, and through them, the world around you. The game is about choice: do good, do evil, the world shaped through your selfless sacrifices or diabolical deeds.&lt;br /&gt;&lt;br /&gt;You're given a lot of choices to make -- some of them drastically alter the world of Albion. If you've played Fable I (Fable 1), you've probably gathered by now that there's an event in the game where a lot of time passes. This time-lapse let's you really get the breadth and weight of your actions. There's only one small problem: you don't really seem to care.&lt;br /&gt;&lt;br /&gt;First, the changes that come about from your choices aren't really all that surprising: good intentions, good results. There's no subtly here, and maybe that's intentional, in the sense that Fable II is trying to weave a "traditional" fairy tale where good is good and evil is evil. That's OK.&lt;br /&gt;&lt;br /&gt;The second problem is more grievous: you just don't care. For the life of me, I just wasn't able to care about the choices I was forced to make during the game. At first, I played the game as a noble hero, because I was fresh and inspired. Then there came a point where I was simply playing the good guy so that if I played through the game again, as the most dastardly villain the world has ever known, there would at least be fresh results.&lt;br /&gt;&lt;br /&gt;In the end, I felt as if I was just sloughing through the game to finish it: I rushed through all good/evil quests, skipping from town-to-town rather than walking there, all so that I could get to the last main event. I'm a completionist in the sense that I wanted to see all the "good" choices, even though most of them were pretty obvious.&lt;br /&gt;&lt;br /&gt;Adding insult to injury, after I started the last main event, something happened that &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;immediately&lt;/span&gt;&lt;/span&gt; made me care, for the first time, about what was going on, and I began to anticipate the next time I would be able to make a "choice." ... Except you're not able to make a choice. You have absolutely no control, and it is maddening, because at that moment, it was all I could think about. It was incredibly frustrating. You'll know what I'm talking about if you've just beaten the game, and if you haven't, you'll know it when you see it.&lt;br /&gt;&lt;br /&gt;Anyway, shortly after that, the short fight that followed, and the very anti-climatic ending that was the finale', I was done. I recall reading about new quests that can only be completed once you're done with the main plot, but I just don't care enough about the experience any more to bother. I'll play through it again, of course, 6 months from now or maybe more, for the achievements if nothing else, but it's not something I'm feeling excited about, so I set it aside the minute I was done with it and popped in Fallout 3.&lt;br /&gt;&lt;br /&gt;And God, what a difference.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/B000UU3SVI?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000UU3SVI"&gt;Fallout 3&lt;/a&gt; is a post-apocalyptic RPG by the makers of &lt;a href="http://www.amazon.com/gp/product/B000GE7O9K?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000GE7O9K"&gt;Oblivion&lt;/a&gt;, which was a generic medieval RPG. Unlike Oblivion, however, Fallout 3 is fun. =D&lt;br /&gt;&lt;br /&gt;There are choices to be made in Fallout 3, just like Fable II; this game too revolves around the concept of influencing the world around you by your actions, but the choices you make here are more immediate, meaningful, and by no stretch of the word, fun as hell.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;During the first hour, the game's introduction, you're introduced to a few characters: the love interest, the leader, the crazy bastard, the friend, the mysterious main plot... you know, the typical stuff. The characters are recognizable and easily related to, you may even get attached if you take your time.&lt;br /&gt;&lt;br /&gt;Anyway, as they're setting up the plot, The Friend gets murdered by The Crazy Bastard, by the order of The Leader. You're told this, confidentially, by The Love Interest, who is the daughter of The Leader. She of course says there's nothing you can do, you gotta escape now, before it's too late!&lt;br /&gt;&lt;br /&gt;So you're on the move, creeping through the underground vault trying to avoid The Leader and his goons, and you come across The Friend's corpse. And, shortly after, you also come across The Crazy Bastard and The Leader interrogating a frightened young lady. And here, the game gives you a choice: go inside the room, ignoring the fact that there are guards nearby looking for you and will hear any commotion, and make a mess.&lt;br /&gt;&lt;br /&gt;So, being me and no one else, I charged into the room, and put two shots in the back of The Crazy Bastard's head before he could do anything. Then I aimed at The Leader, and... paused. Because, for a moment, I wasn't sure what to do. The game was actually going to let me kill him; I knew it the moment the targeting reticule went red. But I knew if I killed him I'd upset The Love Interest.&lt;br /&gt;&lt;br /&gt;I realized at that moment the game gave me a very interesting, very personal choice: ruin my relationship with The Love Interest to avenge The Friend, or spare The Leader to spare The Love Interest. I had already killed The Crazy Bastard, but The Leader was complicit in his death. But I asked myself, "Do I really want to risk it? She might never forgive me if I do it."&lt;br /&gt;&lt;br /&gt;So I let his old crazy ass run away.&lt;br /&gt;&lt;br /&gt;There was no "good" or "evil" choice here. Picking one over the other had no apparent tangible benefits. It was all about how &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;you&lt;/span&gt;&lt;/span&gt; felt about the situation. Did I want to satisfy the thirst for vengeance and turn The Leader inside out? Did I want to spare him, if only for the sake of The Love Interest, his daughter? Hell, I could've just smacked him around until he was unconcious, but could I resist not finishing him off?&lt;br /&gt;&lt;br /&gt;I think, in my opinion, that's where Fable 2 failed and Fallout 3, so far, succeeds: the nature of the choice.&lt;br /&gt;&lt;br /&gt;In Fable 2, there's a good choice, and an evil choice, and no matter which you pick, you get a reward of some kind: morality points, purity points, gold or weapons or loot up to your eyebrows.&lt;br /&gt;&lt;br /&gt;But in Fallout 3, sometimes the choice has no benefit other than how it makes you feel.&lt;br /&gt;&lt;br /&gt;And it makes you feel good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1833506485335521935?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1833506485335521935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1833506485335521935' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1833506485335521935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1833506485335521935'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/11/fable-2-vs-fallout-3-its-all-about.html' title='Fable 2 vs Fallout 3: it&apos;s all about the choices, baby.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2885561214328284460</id><published>2008-11-06T15:29:00.002-05:00</published><updated>2008-11-06T15:29:46.462-05:00</updated><title type='text'>IE7 blows.</title><content type='html'>Sorry, just felt the need to reiterate the obvious since I've got something that works in every browser but IE again.&lt;br /&gt;&lt;br /&gt;Yay, IE!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2885561214328284460?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2885561214328284460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2885561214328284460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2885561214328284460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2885561214328284460'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/11/ie7-blows.html' title='IE7 blows.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7662640947964265680</id><published>2008-10-21T03:18:00.004-04:00</published><updated>2008-10-21T03:33:36.832-04:00</updated><title type='text'>"Go dance with the angels old man!"</title><content type='html'>&lt;a href="http://www.amazon.com/gp/product/B000P297JS?ie=UTF8&amp;amp;tag=kudoz-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000P297JS"&gt;Ace Combat 6: Fires of Liberation&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kudoz-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B000P297JS" alt="" style="border: medium none  ! important; margin: 0px ! important; display: none;" border="0" width="1" height="1" /&gt; is one of those classic games that make you scream "YES!" "NO!" "You motherfuckers, you'll pay for that!" at your TV. I can't help but get really into it, even after having it for almost a year now.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=kudoz-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=B000P297JS&amp;md=10FE9736YVPPT7A0FBG2&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The story is cliche and the dialogue classically RPG-like in the way it is delivered.&lt;br /&gt;&lt;br /&gt;But it's effin' GREAT, man.&lt;br /&gt;&lt;br /&gt;Don't bother getting the flight stick, though. No other game uses it. Too expensive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7662640947964265680?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7662640947964265680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7662640947964265680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7662640947964265680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7662640947964265680'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/10/go-dance-with-angels-old-man.html' title='&quot;Go dance with the angels old man!&quot;'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4585061085095487693</id><published>2008-10-18T02:34:00.003-04:00</published><updated>2008-10-18T02:56:01.141-04:00</updated><title type='text'>Is your site OpenID enabled? If so, don't make me register.</title><content type='html'>I made my first comment on &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt;. It's a site for questions and answers for the developer community at large.&lt;br /&gt;&lt;br /&gt;The only thing that compelled me to &lt;span style="font-weight: bold;"&gt;try&lt;/span&gt; (and succeed!) leaving a comment was their OpenID support: I am so done with creating a new user/pass for sites that I only bother with it if I feel I'll be using it a lot. Not so good for drive-by comments and contributions.&lt;br /&gt;&lt;br /&gt;However, some OpenID enabled sites demand you register and create a user/pass for that site in addition. I understand why -- account recovery if your OpenID provider vanishes -- but in my mind that negates the the value add-in for OpenID. I wouldn't be using OpenID if I thought my provider was just going to ninja-vanish on me. If stackoverflow.com had done that to me, I probably would have left without bothering. It's just one comment after all, and I only visit the site once every few weeks, max.&lt;br /&gt;&lt;br /&gt;Still, nice to know someone gets it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4585061085095487693?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4585061085095487693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4585061085095487693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4585061085095487693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4585061085095487693'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/10/is-your-site-openid-enabled-if-so-dont.html' title='Is your site OpenID enabled? If so, don&apos;t make me register.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6617998705699597772</id><published>2008-10-17T21:44:00.002-04:00</published><updated>2008-10-17T21:45:29.941-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='techcrunch'/><title type='text'>Does Steve Gilmor come with subtitles?</title><content type='html'>Does Steve Gilmor come with subtitles?&lt;br /&gt;&lt;br /&gt;http://www.techcrunchit.com/author/steve/&lt;br /&gt;&lt;br /&gt;Seriously. Homeboy needs to take a deep, deep breather and burn his little black book of euphemisms 'cuz they just ain't working.&lt;br /&gt;&lt;br /&gt;I think he's going for some kinda high-brow thing, but, uh, what comes out is generally unreadable.&lt;br /&gt;&lt;br /&gt;Does he talk like that in real life?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6617998705699597772?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6617998705699597772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6617998705699597772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6617998705699597772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6617998705699597772'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/10/does-steve-gilmor-come-with-subtitles.html' title='Does Steve Gilmor come with subtitles?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4299611254898897014</id><published>2008-10-14T18:50:00.005-04:00</published><updated>2008-10-14T19:06:56.135-04:00</updated><title type='text'>Silverlight 2: still no webcam + mic support.</title><content type='html'>An alternative workaround that is frequently suggested is using Flash, and pushing the captured data to Silverlight.&lt;br /&gt;&lt;br /&gt;In my mind, a better alternative: just use Flash.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Added bonus -- most Silverlight 2 demos don't work in Firefox, even though the plugin installs fine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 2:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Fantastic -- one of the demos crashed the entire browser. Think I will be avoiding Silverlight for a few versions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4299611254898897014?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4299611254898897014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4299611254898897014' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4299611254898897014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4299611254898897014'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/10/silverlight-2-still-no-webcam-mic.html' title='Silverlight 2: still no webcam + mic support.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5375582568136468159</id><published>2008-09-23T19:42:00.003-04:00</published><updated>2008-09-23T19:46:29.293-04:00</updated><title type='text'>Ubiquity Command: urlencode</title><content type='html'>I just hacked up this quick &lt;a href="https://wiki.mozilla.org/Labs/Ubiquity"&gt;Ubiquity&lt;/a&gt; command because I was cuttin' and pastin' URLs all over the place, and I needed some of them url encoded...&lt;br /&gt;&lt;br /&gt;&lt;a href="https://wiki.mozilla.org/Labs/Ubiquity"&gt;Ubiquity&lt;/a&gt;, by the way, is totally sweet.&lt;br /&gt;&lt;br /&gt;Run "command editor" and paste the block of Javascript below somewhere in the text field.&lt;br /&gt;&lt;br /&gt;That's all you need to do. It auto-saves.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;CmdUtils.CreateCommand({&lt;br /&gt;name: "urlencode",&lt;br /&gt;takes: {"what": noun_arb_text},&lt;br /&gt;preview: function(pblock, what) { pblock.innerHTML = CmdUtils.renderTemplate(escape(what.text)) },&lt;br /&gt;execute: function(what) { CmdUtils.setSelection(escape(what.text)); }&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5375582568136468159?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5375582568136468159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5375582568136468159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5375582568136468159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5375582568136468159'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/09/ubiquity-command-urlencode.html' title='Ubiquity Command: urlencode'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-9045531574938649291</id><published>2008-09-17T19:51:00.007-04:00</published><updated>2008-09-17T20:49:57.059-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kitchen sink'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='google app engine'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><category scheme='http://www.blogger.com/atom/ns#' term='jaiku'/><title type='text'>Jaiku: still in beta. I blame GAE.</title><content type='html'>&lt;div style="text-align: center; font-weight: bold; font-style: italic;"&gt;(this is a rambling rant about Jaiku and Google App Engine.)&lt;br /&gt;(I'm probably totally, totally wrong.)&lt;br /&gt;(but I like to hear myself talk.)&lt;br /&gt;(er, type.)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;If you've heard of &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt;, you've probably heard of &lt;a href="http://www.jaiku.com/"&gt;Jaiku&lt;/a&gt; at some point in your life, then immediately forgot about it when you realized it was invite-only. Or maybe you did some begging for invites, then tried to invite your friends on to the service, only to realize you didn't have enough invites for them all.&lt;br /&gt;&lt;br /&gt;Or maybe you were like me and just said, "fuck it, I'm not begging for invites."&lt;br /&gt;&lt;br /&gt;Whatever.&lt;br /&gt;&lt;br /&gt;Anyway, something -- I'm not sure what it was -- brought Jaiku to my attention again. This is the fourth time it's caught my eye: the first time was when it was announced as a serious, but closed, competitor to Twitter. The second time was when Google bought it, and the world was a twitter with sugary dreams of sweet sweet integration. That, of course, failed to happen, which was a major disappointment. The third time was... fuck, months ago, I think, when they announced their move over to Google App Engine. I'm sure your first thought on hearing that was, "finally, in a few months we'll see how Jaiku does in The Real World."&lt;br /&gt;&lt;br /&gt;That, much to your overwhelming surprise I'm sure, also failed to happen.&lt;br /&gt;&lt;br /&gt;Jaiku's development team  just finished up the port to Google App Engine a month or two ago, according to an official blog post. Well, team? Maybe it's just one guy working really long hours: the public perception of Jaiku's slow development + lack of blog updates makes me wonder if any one &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;person&lt;/span&gt;&lt;/span&gt; is at the helm of that bad boy, much less a team.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Anyway.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To celebrate this momentous occasion, they... uncapped invites.&lt;br /&gt;&lt;br /&gt;Yes.&lt;br /&gt;&lt;br /&gt;They uncapped invites. So now you can invite all your friends!&lt;br /&gt;&lt;br /&gt;But you can't sign up for an account by your lonesome.&lt;br /&gt;&lt;br /&gt;So, I'm going to hit you with a big WTF now: is GAE not scalable?&lt;br /&gt;&lt;br /&gt;They did about 6-8 months of development porting Jaiku over to Google App Engine, and yet they're clearly not quite ready to unleash this thing on The Public At Large. Why not? What's the missing piece of the puzzle? &lt;span style="font-weight: bold;font-size:180%;" &gt;Scalability&lt;/span&gt;? Wasn't Google App engine built for &lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;scalability&lt;/span&gt;&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;I won't say that Compete is the Definitive Source for information, but take a look at this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grapher.compete.com/jaiku.com+appspot.com?metric=uv"&gt;&lt;img src="http://grapher.compete.com/jaiku.com+appspot.com_uv_460.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The numbers (you'll see'em if you click through the image) are:&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;jaiku.com: 98,106&lt;br /&gt;appspot.com: 182,747&lt;br /&gt;&lt;br /&gt;I'm going to move with the assumption that Jaiku is the single biggest GAE user. It's convienent for me to do so. (Am I wrong? Man, who knows. I think it's a safe assumption to make, but if you know otherwise let me know.)&lt;br /&gt;&lt;br /&gt;So, looking at those paltry numbers (I'd have put Twitter on there, but it TOTALLY fucks up the graph) I have to ask, can GAE scale? I'm really grasping for a reason as to why Jaiku hasn't finally opened its doors for one and all yet. If you mention Jaiku you will inevitably be hit with a deluge of comments in the form of: "goddamn it, it's been X-months/years and they haven't added a single feature / fixed this outstanding bug / stopped sucking!" I think it's reasonable to extrapulate from that either they're "done" with the user experience, for now, or that it's hit the point of "good enough" and at the moment they're not really interested in fucking with it. I mean, it's not really reasonable, but I'm saying it is because I don't want to have to add a bunch of conditionals to every fucking sentance I make here.&lt;br /&gt;&lt;br /&gt;They've been bought by Google. They've moved to Google technologies. &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;They're ready, right?&lt;/span&gt;&lt;/span&gt; Why aren't they opening their doors and screaming "COME GET SOME!" to the Internet at large? Getting ready for a marketing push, maybe? Preparing some ninja-style corporate espionage against Twitter?&lt;br /&gt;&lt;br /&gt;Or is the ultimate answer something much simpler? Maybe moving Jaiku over to Google App Engine -- the database-like bits of it, specifically -- has surfaced some critical flaws. Knowing this, they can't just throw open the doors, because the moment they do there will be the usual flood of users going, "Google product? Must have!" It'd be total embarrassment for Google to have the same kind of uptime problems Twitter suffered, you know, what with them being the mighty infallible Google and all.&lt;br /&gt;&lt;br /&gt;Saying that GAE can't scale for Jaiku seems like a bit of a stretch, but the architecture of a messaging system (Twitter-like microblogging, etc)  is very different from the architecture of a standard website; if you've been following the finally resolved up-and-down saga of Twitter then you're sure to know that by now. Different strokes, different folks, or something punny like that.&lt;br /&gt;&lt;br /&gt;Now, we all know that Google's BigTable database (the same database that powers GAE sites) can scale, otherwise Google wouldn't exist as we know it. It scales quite nicely, actually, for it's problem domain. But does it scale well for Jaiku's problem domain: messaging?&lt;br /&gt;&lt;br /&gt;Short version: Did Google try to shove the square peg into the round circle and leverage BigTable in a way that can't scale gracefully for Jaiku's messaging needs?&lt;br /&gt;&lt;br /&gt;Well, I just got bored writing this, so now's a good time to kill this post:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;KUNG-FU CHOP OF DEATH!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Sidenote: Blogger's rich editor &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;totally&lt;/span&gt;&lt;/span&gt; blows. Someone replace this thing, STAT.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-9045531574938649291?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/9045531574938649291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=9045531574938649291' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9045531574938649291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/9045531574938649291'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/09/jaiku-still-in-beta-i-blame-gae.html' title='Jaiku: still in beta. I blame GAE.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-139736633534678440</id><published>2008-09-12T00:26:00.002-04:00</published><updated>2008-09-12T00:32:13.780-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='capistrano'/><title type='text'>Capistrano + Git: fatal: 'origin': unable to chdir or not a git archive</title><content type='html'>Getting that error?&lt;br /&gt;&lt;br /&gt;Short answer: you fucked up, then Capistrano fucked up right behind you.&lt;br /&gt;&lt;br /&gt;SSH into your deploy target, go into shared, and then frag the &lt;span style="font-weight: bold;"&gt;shared_cache &lt;/span&gt;directory.&lt;br /&gt;&lt;br /&gt;Then, &lt;span style="font-weight: bold;"&gt;cap deploy:cold&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;It normally happens when you try to set your repository as a local filesystem path. Capistrano populates &lt;span style="font-weight: bold;"&gt;shared_cache&lt;/span&gt; with an empty Git repo, and then tries to pull in your repository, which it can't reach... but it doesn't frag &lt;span style="font-weight: bold;"&gt;shared_cache&lt;/span&gt;, so the next time Capistrano looks, it's there, and goes, "Hey, we've already built the repository cache, let's just call git fetch and update it!"&lt;br /&gt;&lt;br /&gt;Good luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-139736633534678440?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/139736633534678440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=139736633534678440' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/139736633534678440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/139736633534678440'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/09/capistrano-git-fatal-origin-unable-to.html' title='Capistrano + Git: fatal: &apos;origin&apos;: unable to chdir or not a git archive'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4606723848121145986</id><published>2008-09-12T00:22:00.002-04:00</published><updated>2008-09-12T00:26:18.982-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='host key verification.'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='capistrano'/><title type='text'>Capistrano + Git: Host key verification failed.</title><content type='html'>Getting 'Host Key verification' failed when you're trying to do this? You might be trying to deploy source in a Git repo, and the Git repo is accessed via SSH.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;cap deploy:cold&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Do this: ssh into your target machine (the one codes getting deployed on), and then ssh into the Git repo machine -- or just do a 'git clone' if that's not possible. Accept the key, and then you're golden.&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4606723848121145986?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4606723848121145986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4606723848121145986' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4606723848121145986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4606723848121145986'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/09/capistrano-git-host-key-verification.html' title='Capistrano + Git: Host key verification failed.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-18146183913536209</id><published>2008-09-12T00:13:00.004-04:00</published><updated>2008-09-12T00:22:25.608-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm_passphrase'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='scm_password'/><category scheme='http://www.blogger.com/atom/ns#' term='scm_user'/><category scheme='http://www.blogger.com/atom/ns#' term='capistrano'/><title type='text'>Deploying Git over SSH (username, password) with Capistrano</title><content type='html'>This one bit me.&lt;br /&gt;&lt;br /&gt;Hard.&lt;br /&gt;&lt;br /&gt;If your Git repo is accessed via SSH using a username and password instead of a public key, you're probably having problems getting it to work. Notably, the password prompt isn't prompting you for your goddamn password.&lt;br /&gt;&lt;br /&gt;Do this in your deploy file:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;default_run_options[:pty] = true&lt;br /&gt;set :scm_password, Proc.new { Capistrano::CLI.password_prompt "SCM Password: "}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Using Capistrano 2.5.&lt;br /&gt;&lt;br /&gt;default_run_topions[:pty] will fuck up your output, but it's necessary for reasons I don't fully grasp and after about 3 hours don't care to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-18146183913536209?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/18146183913536209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=18146183913536209' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/18146183913536209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/18146183913536209'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/09/deploying-git-over-ssh-username.html' title='Deploying Git over SSH (username, password) with Capistrano'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1856902417948372532</id><published>2008-08-22T19:32:00.003-04:00</published><updated>2008-08-22T19:41:06.035-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='map.resources'/><category scheme='http://www.blogger.com/atom/ns#' term='has_one'/><category scheme='http://www.blogger.com/atom/ns#' term='form_for'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='named_routes'/><title type='text'>map.resources + has_one + form_for = surprise, mofo!</title><content type='html'>If you've got a route like&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;map.resources :cars, :has_one =&gt; :driver&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You're probably expecting to use form_for like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;form_for([@car, @driver])&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That won't work. It'll complain about not being able to find the function, 'car_driver&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;_path' instead of 'car_driver_path'&lt;br /&gt;&lt;br /&gt;Fix:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;form_for(@driver, :url =&gt; car_driver_path(@car))&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Hopefully in Rails 2.1.1 this will be fixed using a different, less crazy syntax:&lt;br /&gt;&lt;br /&gt;http://rails.lighthouseapp.com/projects/8994/tickets/461-fixed-polymorphic_url-to-be-able-to-handle-singleton-resources&lt;br /&gt;&lt;br /&gt;That is all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1856902417948372532?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1856902417948372532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1856902417948372532' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1856902417948372532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1856902417948372532'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/08/mapresources-hasone-formfor-surprise.html' title='map.resources + has_one + form_for = surprise, mofo!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-598810184086952372</id><published>2008-08-08T00:44:00.003-04:00</published><updated>2008-08-08T00:46:29.660-04:00</updated><title type='text'>The Grind.</title><content type='html'>Back to working full time again. Let some bills pile up, and now it's time to ninja-fu my way out of them.&lt;br /&gt;&lt;br /&gt;I'm angling for some more Rails-based jobs than ASP.NET jobs, which means a slight pay-hit until I can amass a treasure-trove of my RoR proficiencies.&lt;br /&gt;&lt;br /&gt;Not that I don't have plenty already that many, but they're mostly firewalled / intranet style. Need some public, grade-A consumer-facing sites to make this happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-598810184086952372?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/598810184086952372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=598810184086952372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/598810184086952372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/598810184086952372'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/08/grind.html' title='The Grind.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6439661331940459843</id><published>2008-07-24T22:53:00.002-04:00</published><updated>2008-07-24T22:57:42.188-04:00</updated><title type='text'>Winner!</title><content type='html'>Recently had to decide between Silverlight vs Flash for a project.&lt;br /&gt;&lt;br /&gt;Silverlight pros:&lt;br /&gt;&lt;br /&gt;* Fast.&lt;br /&gt;* 2.0 would support IronRuby&lt;br /&gt;* Easy&lt;br /&gt;* Already have development tools&lt;br /&gt;&lt;br /&gt;Flash &amp;amp; Flex pros:&lt;br /&gt;&lt;br /&gt;* Installed everywhere.&lt;br /&gt;* Tons of resources&lt;br /&gt;* Lots of preexisting stuff I can look at.&lt;br /&gt;* Similar to JavaScript&lt;br /&gt;&lt;br /&gt;Since I already had the MS tools and Flex builder would have cost me some extra change, I was leaning to Silverlight -- until I found out it doesn't support Webcam / Audio!&lt;br /&gt;&lt;br /&gt;When deciding on which major technology to use, always determine that all prospective contenders support your required features!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6439661331940459843?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6439661331940459843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6439661331940459843' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6439661331940459843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6439661331940459843'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/07/winner.html' title='Winner!'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7122293126250926514</id><published>2008-06-25T19:24:00.004-04:00</published><updated>2008-06-25T19:26:50.806-04:00</updated><title type='text'>SproutCore?</title><content type='html'>I am thoroughly unimpressed with &lt;a href="http://www.sproutcore.com"&gt;SproutCore&lt;/a&gt;, but this is only based on the very rough demo application they host.&lt;br /&gt;&lt;br /&gt;I tend to judge a platform's ceiling by the farthest someone has taken it... so, any real life examples of SproutCore out there in the wild that don't suck?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7122293126250926514?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7122293126250926514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7122293126250926514' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7122293126250926514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7122293126250926514'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/06/sproutcore.html' title='SproutCore?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5651014436175908762</id><published>2008-05-25T16:18:00.005-04:00</published><updated>2008-05-25T17:00:09.152-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinionated'/><category scheme='http://www.blogger.com/atom/ns#' term='google gears'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe air'/><title type='text'>Google Gears vs Adobe AIR: the way I see it.</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;a href="http://gears.google.com/"&gt;Google Gears&lt;/a&gt;: &lt;/span&gt;easily add offline support to &lt;span style="font-weight: bold;"&gt;WEB PAGES&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Good scenario: user browsing your site, internet connection drops, Google Gears can be used to save all the data until the connection is re-established and can be uploaded to the server. The website mostly functions as the user expects it to, with only minimal degradation of functionality.&lt;br /&gt;&lt;br /&gt;Bad scenario: &lt;strike&gt;user is offline, using your site, and their browser crashes... as far as I understand it, there's no way for them to get &lt;span style="font-style: italic;"&gt;back&lt;/span&gt; to the offline version of the website without being online. They're basically 'stuck' until they can re-establish a connection.&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; Google Gear's LocalServer works at a lower level than I thought, so you can actually hit the offline version of a website without actually having to visit the online version first.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/products/air/"&gt;&lt;span style="font-weight: bold;"&gt;Adobe AIR&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;: easily add value to existing web-sites with &lt;span style="font-weight: bold;"&gt;desktop application + integration&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Good scenario: user is browsing a site that lets him chat with other users. However, he has to restart his browser for some reason (FireFox 2 is being a memory-pig again, or he just installed a cool new add-in). He launches the Adobe AIR application that lets him continue chatting with his friends even as the browser is closed. He can also leave the application open to chat with his friends so he has one less browser window / tab to keep an eye on, get updates to his friend's statuses on his desktop, etc.&lt;br /&gt;&lt;br /&gt;Bad scenario: user sees some exciting new features on your chat website, enjoys using them, but they haven't been added to the Adobe AIR application yet, since an Adobe AIR application is an application that requires updates, bug fixes, and new feature integration separate from your website.&lt;br /&gt;&lt;br /&gt;That's how I see it, anyway.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5651014436175908762?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5651014436175908762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5651014436175908762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5651014436175908762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5651014436175908762'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/05/google-gears-vs-adobe-air-way-i-see-it.html' title='Google Gears vs Adobe AIR: the way I see it.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6276474743981387789</id><published>2008-05-21T17:29:00.002-04:00</published><updated>2008-05-21T17:32:15.808-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amazon mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon mp3 downloader'/><title type='text'>Ugh. Amazon's POS MP3 downloader</title><content type='html'>Amazon's mp3 downloader crashed.&lt;br /&gt;&lt;br /&gt;Again.&lt;br /&gt;&lt;br /&gt;So far it's crashed every time I've bought an album.&lt;br /&gt;&lt;br /&gt;And, every time, I have to email customer service, get them to reactivate the download, and then hope the Amazon MP3 player doesn't crash this time.&lt;br /&gt;&lt;br /&gt;I think this is pretty much my last purchase from the Amazon MP3 store for a long, long time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6276474743981387789?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6276474743981387789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6276474743981387789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6276474743981387789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6276474743981387789'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/05/ugh-amazons-pos-mp3-downloader.html' title='Ugh. Amazon&apos;s POS MP3 downloader'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2871572188472909413</id><published>2008-05-08T14:18:00.003-04:00</published><updated>2008-05-08T14:21:08.243-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><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'>undefined method 'time_zone=' error?</title><content type='html'>&lt;blockquote style="font-family: arial;"&gt;undefined method 'time_zone='&lt;/blockquote&gt;&lt;br /&gt;Got that error?&lt;br /&gt;&lt;br /&gt;Run this in your console:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;gem sources -r &lt;a href="http://gems.rubyonrails.org/" rel="nofollow"&gt;http://gems.rubyonrails.org/&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;That's for bleeding edge developer gems. It was probably put in your gem repository list when you upgraded to Rails 2.0 and then forgot about until now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2871572188472909413?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2871572188472909413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2871572188472909413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2871572188472909413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2871572188472909413'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/05/undefined-method-timezone-error.html' title='undefined method &apos;time_zone=&apos; error?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-2633886239167323934</id><published>2008-05-03T17:10:00.003-04:00</published><updated>2008-05-03T17:12:19.875-04:00</updated><title type='text'>ExtJS alternatives?</title><content type='html'>Now that there's a &lt;a href="http://it.slashdot.org/article.pl?sid=08/04/22/138203"&gt;big kerfluffle&lt;/a&gt; about &lt;a href="http://extjs.com/"&gt;ExtJS&lt;/a&gt;, one question:&lt;br /&gt;&lt;br /&gt;What are people using now? I've heard some people mention &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt; but also mention that it has really bad documentation.&lt;br /&gt;&lt;br /&gt;Suggestions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-2633886239167323934?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/2633886239167323934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=2633886239167323934' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2633886239167323934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/2633886239167323934'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/05/extjs-alternatives.html' title='ExtJS alternatives?'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7021805255126499600</id><published>2008-04-16T13:37:00.002-04:00</published><updated>2008-04-16T14:11:11.542-04:00</updated><title type='text'>The opposite of sweet.</title><content type='html'>&lt;div style="text-align: center;"&gt;** RANT ON **&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-size:85%;" &gt;(if your a client of mine, wouldn't recommend reading this -- this could be about you!)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Ugh. Heading into "bitter client" territory again.  Happens a lot, mostly because I'm the "guru" -- and you only hire a guru when you don't have one. If you have a company without gurus, you tend to have problems: a company I began working with had no Subversion or source control system at all (!). That changed pretty quickly due to necessity + there was no way I was going to do the "hey stop editing files on the ftp server so I can get your changes!" dance I've read about at &lt;a href="http://www.thedailywtf.com/"&gt;TheDailyWTF&lt;/a&gt;. Not *&lt;span style="font-weight: bold;"&gt;even&lt;/span&gt;* if they were willing to pay for me to sit around and twiddle my thumbs.&lt;br /&gt;&lt;br /&gt;Another more serious problem I just noticed was that they don't have any kind of QA system in place. Oooh, yeah, I had a cloud full of "?!?!" Metal Gear Solid-style over my head when I realized one of the designers was testing a product. Bug reports were sporadic, didn't include steps to reproduce, and some bugs were missed entirely (but I fixed those anyway). All the bugs tend to be pretty minor (formatting issues, form validations) because I've got a keen eye and typically kill the "big" bugs as I'm writing the code. But, nobody writes bug-free code. That's why you need QA -- a bunch of motherfuckers that try to wreck your shit, and when they do, can give you a very detailed process on how they did it.&lt;br /&gt;&lt;br /&gt;You ever get told there's an "error?"&lt;br /&gt;&lt;br /&gt;Yeah.&lt;br /&gt;&lt;br /&gt;"Error."&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img182.imageshack.us/img182/4117/errorlargegv6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://img182.imageshack.us/img182/4117/errorlargegv6.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(I've always wanted to use this image!)&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Anyway, I can't blame them too much. It's the typical growing pains of a software company -- one that has been working on small projects for most of its lifetime, then deciding to branch out into mid-sized projects.&lt;br /&gt;&lt;br /&gt;But.&lt;br /&gt;&lt;br /&gt;One thing that seriously annoys me is how clients are handled. For awhile (I don't know if they still are) they were pretty hands off with clients, meaning they weren't pushed for solid answers, or made to walk through the entirety of the site, or whatever causes a client to, the day before the site goes into production, go, "hey, this is all wrong, what were you doing?!"&lt;br /&gt;&lt;br /&gt;This only affects me because that shit rolls downhill, so all of the sudden it's "hey man SUPER EMERGENCY #24241, we have stuff to do that should have been done a week ago but the client never bothered t o peek at the site until just now and we didn't really want to press the issue but anyone now you have to GO GO GO GADGET RANGERS."&lt;br /&gt;&lt;br /&gt;Man. I never dreamed I'd be making that many relatively untested changes to a system that was due to go into production the next day.&lt;br /&gt;&lt;br /&gt;I should have introduced them to weekly cycles and feature freezes. If you make any significant changes, deployment to production is pushed back a cycle -- that's enough time for QA, and for the client to make more outrageous demands in the meantime. Make sure the customers know about it, so you can finger them as the delay when it happens (and it will).&lt;br /&gt;&lt;br /&gt;Anyway, RANT / OVER.&lt;br /&gt;&lt;/span&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-7021805255126499600?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7021805255126499600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7021805255126499600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7021805255126499600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7021805255126499600'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/04/opposite-of-sweet.html' title='The opposite of sweet.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-1408662153781221553</id><published>2008-04-01T17:02:00.004-04:00</published><updated>2008-04-01T17:07:22.802-04:00</updated><title type='text'>Just remembered why I hate CSS.</title><content type='html'>Read this, immediately remembered why I hate the current state of CSS:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alistapart.com/articles/multicolumnlists"&gt;CSS Swag: Multi Column Lists&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What's funny about that article is that the solutions get progressively worse the farther down you go, instead of better.&lt;br /&gt;&lt;br /&gt;Sometimes I just want to grab Web browsers by the neck and scream, "PUT THE ELEMENT HERE, RIGHT HERE AND NO WHERE ELSE YOU JACKASS."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-1408662153781221553?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/1408662153781221553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=1408662153781221553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1408662153781221553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/1408662153781221553'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/04/just-remembered-why-i-hate-css.html' title='Just remembered why I hate CSS.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4865897880251182569</id><published>2008-03-24T17:54:00.007-04:00</published><updated>2008-03-24T19:18:04.437-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Assorted bitches about ASP.NET and Ruby on Rails.</title><content type='html'>&lt;span style="color: rgb(255, 0, 0);font-size:180%;" &gt;&lt;span style="font-size:100%;"&gt;(all text belong is my opinion, not yours. Keep your goddamn hands off my opinion if you know what's good for you, buddy.)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;ASP.NET is my wife, Rails my mistress&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Little background: people consider me a .NET guru. I'm not, really. I'm just not as stupid as most of the ASP.NET developers you'll encounter in certain environments.&lt;br /&gt;&lt;br /&gt;You can get any old average joe to start a new project and fuck it up from the get-go, but it takes a special breed of programmer to go back and fix the fucked-up project without trashing the parts of it that works. So it stands to reason that most of the contracts I get are dealing with fixing the sins of mysterious "precursor" developers.&lt;br /&gt;&lt;br /&gt;The Precursors are a race of highly advanced developers, who shun the trivialities of modern day development as we understand them.&lt;br /&gt;&lt;br /&gt;For instance, here is some world-revolutionizing code I found buried deep within the bowels of a project I inherited:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/* the following code has been anonymized; seeing it in it's true form might be too much for your eyes. */&lt;br /&gt;&lt;br /&gt;public string IsValid() {&lt;br /&gt;/* ... snip ... */&lt;br /&gt;string is_false;&lt;br /&gt;if ((bool)data["is_false"])&lt;br /&gt;   is_false = "0";&lt;br /&gt;else&lt;br /&gt;  is_false = "1";&lt;br /&gt;return is_false;&lt;br /&gt;}&lt;br /&gt;/* The only consumer of IsValid is buried deep, deep within another function. Here is the relevant bits */&lt;br /&gt;&lt;br /&gt;bool is_valid = false;&lt;br /&gt;string result = IsValid();&lt;br /&gt;if (result == "0")&lt;br /&gt;  is_valid = false;&lt;br /&gt;else&lt;br /&gt;  is_valid = true;&lt;/blockquote&gt;Zen.&lt;br /&gt;&lt;br /&gt;Now, imagine an entire project architected more-or-less in the same fashion, and you'll know what most of my work-life is like.&lt;br /&gt;&lt;br /&gt;That's half the problem. The other half of the problem is that &lt;span style="font-weight: bold;"&gt;I've used Ruby on Rails.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Don't get me wrong. I like ASP.NET. We get along fine. But I &lt;span style="font-weight: bold;"&gt;love&lt;/span&gt; Rails. The "run away to France with her" kind of love.&lt;br /&gt;&lt;br /&gt;Have you ever been sitting there, hacking away in ASP.NET, watching this block of C# code get longer and longer... then, for a moment -- just a brief, fragment of a moment -- think about how you would have done it in Ruby. That, friend, is a moment of utter infuriation, a moment in which you realize that Ruby + Rails would have been 2 lines of code, max (4 if you have a brain-exploison) and you're on your 20th or 30th line of query-string manipulating twisted logic because the people who created ASP.NET haven't actually used it for any extended period of time outside of the "PetShop" scenario.&lt;br /&gt;&lt;br /&gt;That's the only way I can explain why some of the ASP.NET framework is the way it is: they designed first, used second. Designed &lt;span style="font-style: italic;"&gt;for&lt;/span&gt; programmers &lt;span style="font-style: italic;"&gt;by&lt;/span&gt; someone else.&lt;br /&gt;&lt;br /&gt;ASP.NET: "&lt;span style="font-weight: bold;"&gt;Making the easy things hard, and the hard things possible.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Yeah, OK. Whatever.&lt;br /&gt;&lt;br /&gt;Don't get me wrong. ASP.NET isn't awful. A lot of sites run ASP.NET. Like, uh, MySpace. I just find that when you know what you want to do, you can't just go for it. There's always some stumbling block in your way. It's like being in front of your destination, but walking 2 blocks to the left, taking one block forward, then walking the two blocks to the right to get there. Uncool.&lt;br /&gt;&lt;br /&gt;But, that's my opinion. Your mileage may vary, and probably does. I get 45/48 miles to the gallon, though! WOO HOO!&lt;br /&gt;&lt;br /&gt;By the way:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;CodeSmith, what the fuck?&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.codesmith.com"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;CodeSmith&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; is apparently some kind of code generation utility. People make templates for it and crap -- shit I've never really cared about until some developer I was working with but not monitoring closely enough ("He's a big boy, what's the worst that could happen?") decided he was going to use a proprietary solution for our project's ORM stuff.&lt;br /&gt;&lt;br /&gt;Specifically he used .netTiers, which is free, but since .netTiers can only be used via CodeSmith,&lt;br /&gt;it is essentially proprietary.&lt;br /&gt;&lt;br /&gt;I only discover this a month or two later when a million thousand bugs crop up because the developer has left but forgot to update the DAL / etc before he left.  Yeah, that's totally my bad. Whatever, though, right? All I have to do is run the generation utility. I download .netTiers, find this CodeSmith thing and then realize it's a closed-source application we didn't have a license for.&lt;br /&gt;&lt;br /&gt;Part of that is my bad -- he was jumping up and down going ".netTiers is the BEST!" and I was like, "whatever dude, just get it done." In retrospect, considering the damage he's done, if I could go back and change it all I'd start by throwing my car at him if I thought it would go the distance.&lt;br /&gt;&lt;br /&gt;Anyway, CodeSmith has a 30 day trial -- no big deal, we only need to regenerate once for now, and we can migrate to a free solution later: the .netTiers crap is way too convoluted for a project this size anyway.&lt;br /&gt;&lt;br /&gt;What happened next &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;totally blew my mind.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;OK, OK, wait, alright, first the program hung for about 5 minutes before spitting out a raw exception on what is easily the most base and obvious error you'd expect an application to catch, and display nicely, but the mind blowing happens right after.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BUT RIGHT AFTER THAT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The program's generation suddenly stops, politely informing me that my 30 day trial only works with sample databases.&lt;br /&gt;&lt;br /&gt;Yes, you heard that right...&lt;br /&gt;&lt;br /&gt;Someone went to all the effort and dedication to make an application run off a 30 day trial, but then restricted the 30 day trial to sample databases, so actually trying it out is impossible.&lt;br /&gt;&lt;br /&gt;How. Useless. Is. That.&lt;br /&gt;&lt;br /&gt;It took me a few minutes to figure out why they did this: essentially it appears that people use CodeSmith because the guy before them used CodeSmith and the guy before THAT guy used CodeSmith -- generational crap, basically. I've read stories about it and stuff but never walked face-first into it before until now.&lt;br /&gt;&lt;br /&gt;For those of you slow on the draw, or not really sure of what I'm talking about:&lt;br /&gt;&lt;br /&gt;Imagine downloading a game demo. After installing it, you eagerly double click the icon.&lt;br /&gt;However, instead of being plunged into &lt;span style="font-size:180%;"&gt;ZOMBIE SMASHING MAYHEM&lt;/span&gt;, the splash screen politely asks you to buy the full game if you're really interested in zombie fun, and then starts playing &lt;span style="font-weight: bold;"&gt;a low-resolution video of other people playing the game.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yeah, it's that stupid.&lt;br /&gt;&lt;br /&gt;Anyway, I just bucked up and spent 20 minutes tweaking the generated files by hand. We'll be ripping out all the .netTiers stuff and replacing it with SubSonic or w/e at some point in the future no doubt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4865897880251182569?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4865897880251182569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4865897880251182569' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4865897880251182569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4865897880251182569'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/03/assorted-bitches-about-aspnet-and-ruby.html' title='Assorted bitches about ASP.NET and Ruby on Rails.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-6023567670116902785</id><published>2008-03-17T18:30:00.003-04:00</published><updated>2008-03-17T18:44:09.064-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom'/><category scheme='http://www.blogger.com/atom/ns#' term='webfeed'/><category scheme='http://www.blogger.com/atom/ns#' term='feed'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>RSS vs Atom</title><content type='html'>So, who won?&lt;br /&gt;&lt;br /&gt;And what about Media RSS? It looks useful, but is there broad support for consuming it?&lt;br /&gt;&lt;br /&gt;Man, Google has never failed me more. Seems like no one is talking about Media RSS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-6023567670116902785?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/6023567670116902785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=6023567670116902785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6023567670116902785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/6023567670116902785'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/03/rss-vs-atom.html' title='RSS vs Atom'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-711428765213643273</id><published>2008-03-16T17:09:00.004-04:00</published><updated>2008-03-16T17:32:12.037-04:00</updated><title type='text'>My six hours is your eight -- or, why my working hours are better than yours. :3</title><content type='html'>Snazzy title, eh?&lt;br /&gt;&lt;br /&gt;So, just a few months ago I had someone quizzically ask me why I was only billing 30 hours a week -- while their salaried employees clocked a steady 9 to 5, 40hrs/wk. Wasn't I being unproductive by almost &lt;span style="font-weight: bold;"&gt;10 hours less&lt;/span&gt;?!&lt;br /&gt;&lt;br /&gt;Well, as the title states, that's because my six hour workday is equivalent to your office's eight hour workday.&lt;br /&gt;&lt;br /&gt;Let's answer this question with some math.&lt;br /&gt;&lt;br /&gt;First, your employees have lunch breaks, right? How long is that? 30-45 minutes?&lt;br /&gt;&lt;br /&gt;So, really, right from jump your employees are only working &lt;span style="font-weight: bold;"&gt;7:15&lt;/span&gt; a day instead of 8.&lt;br /&gt;&lt;br /&gt;But they clock in at 9 and leave at 5, right? If they're not overachievers (nothing wrong with you guys xD), that means they came in at 9:00AM and left at 5:00PM. So, how long did it take them to get up and running, getting setup, etc, etc?&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;5, 10 minutes? Likewise, they have to get ready before they go -- that's another 5, 10 minutes, to shut down their computers, clean up their desk, put away their things.&lt;br /&gt;&lt;br /&gt;So, we're down to about &lt;span style="font-weight: bold;"&gt;7&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;hours &lt;/span&gt;of work in an 8 hour workday.&lt;br /&gt;&lt;br /&gt;Except it's not a straight &lt;span style="font-weight: bold;"&gt;7&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;hours &lt;/span&gt;of work, is it?&lt;br /&gt;&lt;br /&gt;Your workers take frequent breaks throughout the day. Sometimes they get up and go to the water cooler and talk for 5 or 10 minutes.&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; Sometimes they just zone in-and-out throughout the day because you won't stop bothering them (stop bothering them, seriously, they'll do their TPS report later). What about when they take breaks to stretch and clear their head? Or when they need something from a co-worker that's busy with something else?&lt;br /&gt;&lt;br /&gt;Before you know it, your fabled 8 hour workday is really &lt;span style="font-weight: bold;"&gt;6 hours of work&lt;/span&gt; &lt;span style="font-style: italic;"&gt;and &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;2 hours of interruptions, breaks, lunch, and snacks.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Now, consider 6 hours of work for a contractor -- 6 hours of uninterrupted work. Well, it is interrupted, by lunch, dinner, and assorted breaks, but we're not billing you for that, are we? I don't think you'd be too happy with seeing "LUNCH BREAK  (BRK/LNCH)-- 1 HOUR" on your weekly invoice anyway.&lt;br /&gt;&lt;br /&gt;When the invoice hits your inbox and it says your contractor "only" worked 6 hours a day (30hrs/wk remember?) that means we're working more-or-less the same amount of time your salaried employees do, except it probably cost you less.&lt;br /&gt;&lt;br /&gt;So, there you go!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;PS.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;The numbers might be slightly exaggerated. That's because I'm terrible at math.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-711428765213643273?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/711428765213643273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=711428765213643273' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/711428765213643273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/711428765213643273'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/03/my-six-hours-is-your-eight-or-why-my.html' title='My six hours is your eight -- or, why my working hours are better than yours. :3'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-5278793786639120607</id><published>2008-03-15T20:23:00.003-04:00</published><updated>2008-03-15T20:24:32.803-04:00</updated><title type='text'>ATTN: AMAZON.COM</title><content type='html'>Get with the program already and let me pre-order mp3 releases and other digital downloads.&lt;br /&gt;&lt;br /&gt;I can't put them in a wishlist, I can't "favorite" them somehow so I get alerted when they're released. It's totally not cool. I want this techno album that's not available until the 18th, but I keep forgetting it exists. ;(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-5278793786639120607?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/5278793786639120607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=5278793786639120607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5278793786639120607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/5278793786639120607'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/03/attn-amazoncom.html' title='ATTN: AMAZON.COM'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7111180139995414796</id><published>2008-03-12T20:51:00.004-04:00</published><updated>2008-03-12T21:51:06.549-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby rails aptana radrails netbeans'/><title type='text'>Rails IDEs: NetBeans vs Apatana RadRails, take 2</title><content type='html'>If you're like me, you stopped using Aptana RadRails right around the point they went closed source and started rolling with NetBeans instead, which at the time was an arguably superior IDE that was also free, cash-wise. I guess most of us figured that RadRails wouldn't be getting any serious love after it's acquisition / whatever.&lt;br /&gt;&lt;br /&gt;Well, let's time-travel to March 11th, 2008, where, suprisingly, Aptana RadRails 1.0 was released.&lt;br /&gt;&lt;br /&gt;This is completely subjective opinionated review of NetBeans + Ruby vs Aptana RadRails, free version vs free version. I don't particularly care about what's a part of Eclipse or what's all Aptana, FYI, so take that in mind. In fact, I'm writing it up as I use it on a project right now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Some stuff I like about &lt;a href="http://www.aptana.com/"&gt;&lt;span style="font-weight: bold;"&gt;Aptana RadRails&lt;/span&gt;&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;* Faster than NetBeans. Waaaay faster. Loads faster, runs faster.&lt;/li&gt;&lt;li&gt;* Less memory usage than NetBeans.&lt;/li&gt;&lt;li&gt;* Faster, "locks up" less than NetBeans. Also, no "Mystery of the Disappearing Cursor / Caret" issues.&lt;/li&gt;&lt;li&gt;* Visual unit test results.&lt;/li&gt;&lt;li&gt;* Immediate window during debugging! Wah-hoo!&lt;/li&gt;&lt;li&gt;* Error checking puts a red 'X' next to files that have errors in them. Baffo!&lt;/li&gt;&lt;li&gt;* Subversion interface is better than NetBeans by a long mile. It's Subclipse, but whatever, it rocks.&lt;/li&gt;&lt;li&gt;* Sweet toolbar menu that lets you jump to view / test / model / controller associated with a file at the click of a button.&lt;/li&gt;&lt;li&gt;* "Outline" view is a bit better than NetBeans.&lt;/li&gt;&lt;li&gt;* Tag matching in HTML files works better than it does in NetBeans, which often just gives up without warning.&lt;/li&gt;&lt;li&gt;* Love the Servers view.&lt;/li&gt;&lt;li&gt;* Love the Rails Console stuff.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Some stuff I hate about &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://www.aptana.com/"&gt;Aptana RadRails&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;* &lt;/span&gt;Migrations suck. NetBeans gives you a killer database migrations context menu where you can select the version number for quick up/down migrations.&lt;/li&gt;&lt;li&gt;* No clear way to import an existing Rails project (I only figured it out because I had used Aptana RadRails at one point in the past).&lt;/li&gt;&lt;li&gt;* Immediate window during debugging needs some serious, serious polish. Seriously.&lt;/li&gt;&lt;li&gt;* Have to press a button and wait like 20 seconds before the help text for a rake task appears. Would rather seem that text inline or somewhere easy to glance over.&lt;/li&gt;&lt;li&gt;* Have no idea how the Rails Plugin tab is supposed to work. Looks pretty, though.&lt;/li&gt;&lt;li&gt;* By default, Ruby Explorer view shows active gems... clutters up the UI quite a bit when you're dealing with a non-trivial project.&lt;/li&gt;&lt;li&gt;* NetBeans has way better string editing support. Highlight a string in NetBeans and press " and the entire selection will be surrounded by quotation marks (foo bar --&gt; "foo bar"). Highlight inside of a string and press # and you'll get insta interpolation ("foo bar" --&gt; "foo #{bar}").&lt;/li&gt;&lt;li&gt;* Some syntax highlighting isn't as nice as it is in NetBeans. Navigate to the end of a paraenthesis or an "end" statement; both do highlighting in NetBeans, but Aptana only handles the former. That's a pain when you're trying to sync up "end" statements after a long night of work.&lt;/li&gt;&lt;li&gt;* Doesn't open up files generated by script/generate by default, which is annoying, because why wouldn't I be ready to edit the files I just generated?!&lt;/li&gt;&lt;li&gt;* Still a really annoying issue of certain lines being highlighted in gray for no apparent reason.&lt;/li&gt;&lt;li&gt;* In general, colorization inside of Aptana RadRails sucks. Out of the box, NetBeans is much better at this. NetBeans is easily the best if you go for the optional ruby colorization plugin recently offered. I'm poking through syntax coloring options right now for RadRails 1.0 and it doesn't seem like there's any way to extensively customize it into something less sucky.&lt;/li&gt;&lt;li&gt;* Error checking is hit-or-miss. Doesn't seem to refresh fast enough -- if I make a modification to a file that causes an error and quickly fix it, occasionally the error tag never goes away -- or it changes to report an error on perfectly valid syntax.&lt;/li&gt;&lt;li&gt;* I just got a freakin' exception as it tried to perform code completion ("Content Assist"). Man, 3rdRail did that shit too. &lt;span style="font-style: italic; font-weight: bold;"&gt;SWALLOW YOUR EXCEPTIONS&lt;/span&gt;. Log them somewhere or something. I was busy &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;coding something&lt;/span&gt;&lt;/span&gt; when you the exception popped up. Not cool.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;That's about it.&lt;br /&gt;&lt;br /&gt;RadRails is OK, but I think it needs polish in general. As I understand it RadRails 1.0 was a one-man mission; not trying to harsh on the guy's work, just spittin' it as I see it.&lt;br /&gt;&lt;br /&gt;I've gotten so used to NetBeans 6.0 and its creature comforts that I find coding in Aptana RadRails to be a real style-cramping exercise (I just finished up what I was doing in RadRails so I could switch back to NetBeans just now).&lt;br /&gt;&lt;br /&gt;Your mileage may vary.&lt;br /&gt;&lt;br /&gt;If you're using NetBeans 6 for Rails development, seriously consider getting the "Extra Ruby Color Themes." The Dark Pastels theme is a winner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7111180139995414796?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7111180139995414796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7111180139995414796' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7111180139995414796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7111180139995414796'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/03/rails-ides-netbeans-vs-apatana-radrails.html' title='Rails IDEs: NetBeans vs Apatana RadRails, take 2'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4490324287862881366</id><published>2008-02-15T16:20:00.002-05:00</published><updated>2008-02-15T16:35:09.968-05:00</updated><title type='text'>Jangl needs some work.</title><content type='html'>&lt;a href="http://www.jangl.com/"&gt;Jangl&lt;/a&gt; is a site / service for free web calls without divulging your personal phone number.&lt;br /&gt;&lt;br /&gt;Just tried to use a site that partnered with Jangl to facilitate free but anonymous phone calls, was not impressed.&lt;br /&gt;&lt;br /&gt;I didn't even get past the setup -- hooking up with Jangl requires &lt;span style="font-weight: bold;"&gt;you&lt;/span&gt; to call&lt;span style="font-weight: bold;"&gt; their&lt;/span&gt; number, which is a &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;super wtf&lt;/span&gt;&lt;/span&gt; in and of itself -- it's the only phone-based authorization system I've ever seen where you have to initiate the process. It also introduces a number of errors into the process, which is why I never got past the setup.&lt;br /&gt;&lt;br /&gt;If you own a mobile phone you'll notice that sometimes your number shows up on caller ID / etc as missing the "1" in front of it, etc, if you're making a call to a number in the same country.  This completely breaks Jangl's setup process, which tries to identify the phone you're calling them with using "1-555-555-5555" while your phone shows up as "555-555-5555" if you're both in the same country. That is why most phone verification systems call or text you -- easy work around, same result.&lt;br /&gt;&lt;br /&gt;I've only encountered one other system that worked like Jangl does, and that was my credit card company -- it is a very bad one, if you're wondering.&lt;br /&gt;&lt;br /&gt;Also, OH MY GOD WHAT IS THAT MUSIC ON THEIR HOME PAGE?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, rant /off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4490324287862881366?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4490324287862881366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4490324287862881366' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4490324287862881366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4490324287862881366'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/02/jangl-needs-some-work.html' title='Jangl needs some work.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-7373916132887827528</id><published>2008-02-12T15:11:00.000-05:00</published><updated>2008-02-12T16:46:20.034-05:00</updated><title type='text'>ActiveRecord + Legacy DB + Ruby script: what you need to know</title><content type='html'>Some things you should know when you're going to be using ActiveRecord in a generic Ruby script:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make sure to &lt;span style="font-weight: bold;"&gt;require 'rubygems'&lt;/span&gt; &lt;-- I forget that part a lot for some reason.&lt;/li&gt;&lt;li&gt;You MUST set &lt;span style="font-weight: bold;"&gt;ActiveRecord::Base#logger&lt;/span&gt; to an instance of the any Logger class. ActiveRecord won't take care of setting &lt;span style="font-weight: bold;"&gt;ActiveRecord::Base#logger&lt;/span&gt; to an empty dummy class -- you'll get a bunch of Nil-based errors if you forget this.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;ActiveRecord::Base#establish_connection&lt;/span&gt; --&gt; takes the same parameters you'll find in a database.yml.&lt;/li&gt;&lt;li&gt;If you want to mess with SQL Server, make sure to grab the latest adapter: &lt;span style="font-weight: bold;"&gt;gem install activerecord-sqlserver-adapter.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If your legacy table is a_details, the ActiveRecord model will be &lt;span style="font-weight: bold;"&gt;ADetail&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;If you want to access the column RelationID, it is &lt;span style="font-weight: bold;"&gt;ADetail#RelationID&lt;/span&gt; &lt;-- easy.&lt;/li&gt;&lt;li&gt;If your legacy DB has a wonky naming scheme for primary keys (and it will), you need to use &lt;span style="font-weight: bold;"&gt;set_primary_key&lt;/span&gt; in your ActiveRecord model.&lt;/li&gt;&lt;/ol&gt;That's it. Who said you can't talk to legacy databases with Rails?&lt;br /&gt;&lt;br /&gt;Happy sailing, yo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt;&lt;br /&gt;For the LOVE OF GOD don't forget &lt;a href="http://www.gotapi.com"&gt;gotapi&lt;/a&gt; -- it is a big bucket of win.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-7373916132887827528?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/7373916132887827528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=7373916132887827528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7373916132887827528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/7373916132887827528'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/02/activerecord-legacy-db-ruby-script-what.html' title='ActiveRecord + Legacy DB + Ruby script: what you need to know'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13762456.post-4867458558851724028</id><published>2008-02-01T20:06:00.000-05:00</published><updated>2008-02-01T20:21:56.084-05:00</updated><title type='text'>Attack of the Social Networks.</title><content type='html'>I never really was a fan of social networking, but a few weeks ago I just couldn't resist it anymore.&lt;br /&gt;&lt;br /&gt;I actually got a &lt;a href="http://www.facebook.com/profile.php?id=1073612504"&gt;Facebook &lt;/a&gt;and a &lt;a href="http://pownce.com/strangely_addictive"&gt;Pownce&lt;/a&gt; account. Also have a &lt;a href="http://linkedin.com/Arron_Washington"&gt;LinkedIn&lt;/a&gt; account as well.&lt;br /&gt;&lt;br /&gt;What happened? No, freakin', idea. It was just a strange compulsion I got one day. "HEY WHY NOT?" is how it went, or something like that. I think I have enough accounts to quell myself, though...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13762456-4867458558851724028?l=geekninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://geekninja.blogspot.com/feeds/4867458558851724028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13762456&amp;postID=4867458558851724028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4867458558851724028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13762456/posts/default/4867458558851724028'/><link rel='alternate' type='text/html' href='http://geekninja.blogspot.com/2008/02/attack-of-social-networks.html' title='Attack of the Social Networks.'/><author><name>Radical Ed</name><uri>http://www.blogger.com/profile/01417447499799468996</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_AHQVJOUROvU/S7440OTYPXI/AAAAAAAAAEs/OJHDJOnJOtw/S220/2010-04-08+16.01.33+(1).jpg'/></author><thr:total>0</thr:total></entry></feed>
