Thanks to a friend (who bravely rode as part of our team, the dot-com bombs, in the 24-hour electricross earlier this year), an 80gb FusionIO io-Drive (a superfast PCI Express-based SSD-like storage device) has landed in my lap. Here is a picture which interprets that statement literally:

After some firmware upgrade issues (this is apparently a very early unit) I have one thing to say about this drive – it is incredibly fucking fast. How fast? I’ll use my 150gb WD Raptor and the benchmarking tool HD Tune Pro 3.50 for comparison. Obvious note: the WD is in use and has a formatted partition but neither applies to the io-Drive; I’m sure this affects the WD’s benchmarks but they are fair enough for me.
Update: When you initialize an io-Drive, you choose from three performance options, with each modifying the ratio of storage to performance. For my original write up, I used the maximize performance option. This cut storage capacity in half, which makes it probably not the best benchmark in the world when the database I want to store on it is larger than the 40gb it provides. The middle tier is 56gb or so. Anyway, the options do change the results but not by much. Off the top of my head, I’d say there’s maybe a 10% spread between the three of them.
Read/Write Benchmark
The “benchmark” tests are just raw reads and writes from what I understand. This means that I cannot provide a write test for the WD, as I don’t want to overwrite it. You can see which drive is which in the top left corner of each screenshot.


Notice how sexy? No less than 400MB/sec throughput at all times and 0.1ms access time. How does the Raptor fare?

Terrible by every measure of comparison and delivers diminishing returns to boot.
Random Access
This is probably the most important benchmark when it comes to the thing for which I’ll be using this drive (MySQL.) And as the previous screenshots have already made painfully obvious, the io-Drive pummels the Raptor.


The Raptor is surprisingly awful. And it’s not that the difference between the drives is so surprising, but that I (and most people) probably have no idea what we’re missing in terms of normal hard disks vs SSDs. It’s akin to upgrading directly from an Apple IIe to some fast quad core machine these days, the difference seems that large.
Tomorrow I’ll install this wonderful device into the camelcamelcamel database server. It will replace a SAS RAID and will assuredly be faster, though I wonder how to solve the redundancy / backup issue…at least with the RAID, it has a battery backup in case the power suddenly goes out (and the UPS fails too for whatever reason). For now I guess I will just place the MySQL data on the io-Drive, cp it to its old RAID hourly, and see what happens.
Barring catastrophe, this could drastically increase the peformance of the DB server. Maybe the CPU use will even go up when it no longer has to wait 9-25ms between accesses!
Update
On second thought, I have decided to test other drives in my system to see how much of an impact being the OS drive had on the Raptor’s results. Here are the results for a 1tb WD drive.
Read Benchmark
Again, I’m only doing read here due to wanting to keep my data intact.

Interestingly we see that this drive has a higher transfer rate than the Raptor but is slower on accesses.
Random Access
If there’s one word to describe the 1tb WD drive it is consistent.

Conclusion
Being in use had a huge impact on the Raptor and/or it was a lot slower than the other WD drive. Irrespective to this is the fact that the io-Drive still brutalizes them both; just the access time differences alone are enough to make one weep.
Miscellaneous Screenshots
Interesting hardware requirements for a hard drive.

This drive was apparently quite old (a whole year!) and had probably never had its firmware updated.

Here are the aforementioned storage:performance ratio formatting options.

For some reason the key used to set the cookie expiration in Rails changed as of 2.3. Now you set it like this:
ActionController::Base.session = {
:expire_after => 1.day()
}
I set this in both config/environments/production.rb and in config/environment.rb just in case it matters, and it seems to work: cookies are now being set with an expiration date, where before they were not.
My dad gave me a ChatSack base model for my birthday last month. Here are some pics!

Don’t know what a ChatSack is? Do yourself a favor and read the Great Outdoor Fight.
Mr. Cryptomail himself blessed us with a starfield simulation that goes down mighty fine with a tall glass of Cosmic Shovel. Check it out over here; I recommend hitting F11 and sitting back for a flight through the cosmos.
Apologies to IE users, but for as hard as I try to avoid doing things that aren’t supported in the big browsers, this was too cool to pass up. I hear there is some kind of IE plugin that adds the canvas element though!
I’m really glad I spent that weekend-or-whatever-it-was turning the Camel Greasemonkey scripts into a Firefox add-on, because today Lifehacker finally gave up some love for my precious Camel farm.
Their review of that add-on is here. Seems pretty positive, right?
I just released a Firefox add-on for the Camel farm, which adds price history charts to the sites of Amazon, Best Buy, and Newegg, and makes it easy to create Camel price watches directly from the product pages of those retailers.
http://blog.camelcamelcamel.com/470/the-camelizer-our-new-firefox-add-on.html
When trying to generate an OAuth request token, I kept getting a 401 Unauthorized error with moomerman’s twitter_oauth gem. So I decided to switch to John Nunemaker’s Twitter gem.
This brought about another problem: even if I specified that my Twitter application was web-based and set a callback URL in the app. settings, Twitter kept using the OAuth PIN-based authentication method; I wanted the callback! The fix involved adding the
auth_callback parameter to the Twitter::OAuth class, which then gets sent along with the get_request_token() call.
Here’s the monkey-patch:
module Twitter
class OAuth
def initialize(ctoken, csecret, options={})
@ctoken, @csecret, @consumer_options = ctoken, csecret, options
if options[:sign_in]
@consumer_options[:authorize_path] = '/oauth/authenticate'
end
end
def request_token
@request_token ||= consumer.get_request_token(@consumer_options)
end
end
end
I’ll go ahead and slap the old “it works for me” disclaimer on this one. =]
A WIFIGHT! chat room viewer and game archive browser. You can even page through turns! Not bad for an evening of coding :]




We recently moved from a warehouse in Emeryville to a warehouse juuuuust across the border in Oakland. Naturally, the first thing I did was write a poorly worded letter to the city, vaguely detailing our litter and pothole problems near the new ‘haus. The next morning (this morning, in fact) I received a reply:
Thank you for contacting the Public Works Agency Call Center regarding the email below. Our street cleaning crew is at the location cleaning up litters and the service request for that is registered as XXXXXX. Your service request for pothole repair on the YYYY block of Hollis street is registered as ZZZZZZ. Please contact us at (510) 615-5566 if you have further questions.
Who knew complaining to the right people about a problem would help fix it? Here’s hoping they actually come down and do the work, and that it stays clean! My theory is that people dump more garbage where there is already a pile, so maybe cleaning it up will resolve the situation.
Afternoon update: the sidewalks are clean and the potholes have been fixed, not even 24 hours after my complaint! How long until the picture below returns to its garbage dump-y state?

