A Year with a SSD 2

Posted by jcnnghm Wed, 02 Mar 2011 21:35:00 GMT

A little more than one year ago I purchased a 256GB Crucial SSD drive, the CT256M225, from Newegg for $639.

Setting the drive up initially was a snap. I installed Windows 7 on the drive, which automatically detected it and enabled TRIM support. Not really knowing much about SSD drives, I did some research into the optimal settings, and at every turn, found that Windows had automatically detected and enabled the correct setting. There was literally zero configuration required on my end.

Obviously, $639 at nearly $2.50/gigabyte is a rather steep price to pay, so my chief concern was reliability. After a year of 24-7 uptime and heavy usage seven days a week, logging 8,768 hours powered on and just 6 reboots, I can safely say that concerns about modern SSD reliability are unfounded. The excellent CrystalDiskInfo reports that the drive is still 67% healthy.

Crystal Disk Info

Everything I've learned about SSD's suggest that their failure modes are not catastrophic like spinning-disk drives, but that blocks will transition to read only. Given the time I've been running the drive, I suspect it will last another two years without serious issue. Economically, this means the drive will cost me just a bit over $200/year.

From a performance standpoint, transitioning to a SSD drive has yielded the single greatest performance improvement I've experienced for any hardware upgrade, ever. I think that the upgrade was worth every cent, and was happy with it immediately, though I was somewhat concerned that the drive would only last a year. Now knowing that it will almost certainly last three years, I feel that it was a bargain.

If you don't have a SSD yet, you should seriously consider one. I was looking to get a second CT256M225 for my development virtual machine, but found that it's since been discontinued. Fortunately, it's been replaced by the C300 series which sports 355MB/215MB read/write performance compared to the 250MB/200MB offered by the CT256M225, at a reduced price of about $475. That's $165 less than I paid a year ago, about $1.85/gigabyte. Crucial is also offering 128GB drives, and 64GB drives for about $240 and $140 respectively.

If this trend continues, in another year the price per gigabyte could be as low as $1.20, yielding a $300 256GB drive, or a 512GB drive for right around $600.

I've had a great experience running my entire system, operating system and software off the 256GB drive, with a 2TB spinning disk used for large file and virtual machine image storage. If you're budget constrained, I think it would be well worth the $140 to pick up a 64GB SSD for your operating system and critical applications. I think even this usage would provide substantial, noticeable performance improvements.

How I Learned to Love Monitor Arms

Posted by jcnnghm Sun, 07 Feb 2010 17:08:00 GMT


My Desk


Moved out of the way


Pushed Away from the side


The Arm Structure


Sleek Appearance


Beefy MX Arm


All the stuff that's not on my desk anymore


Windows Monitor Settings

I recently added a 30" LG Monitor to my 3-monitor setup. Originally, I had intended to replace my 24" Viewsonic widescreen, but when I started considering it seriously, I began to see the utility in having a forth monitor, instead of just a larger third.

I was initially unsure of how I would accomplish this, but I had seen a 3M Monitor Arm in Office Depot, so I thought I'd buy it and try it out. Unfortunately, the 3M arm didn't have the lift that I really wanted, so I returned that arm and started searching online for other options. I came across the Ergotron Single Desk Mount Arm and the Ergotron Dual LX Monitor Arm. My thought was that I'd be able to purchase a dual arm, and mount both monitors on the left side of my desk on the arms, one above the other.

Once the dual arm arrived, I was able to get it setup in about 30 minutes. I was somewhat surprised at the ease of the setup. I had to unmount the other monitors from their stands, attach the monitor arms, secure the base to my desk with the desk clamp, and route the wires through the arms. The hardest part was removing the stands from the existing arms, and that wasn't very difficult. I did have to adjust the tension of each arm because of the weight of the monitors. All in all, I was very impressed with the ease of the setup process.

After a day of using the arms, I was so impressed that I ordered a second set for the monitor on the right side of my desk, and the Mx Desk Mount LCD Arm for the center 30" panel. The setup of the 30" monitor was a little more difficult than the smaller panels, but that's largely a function of the size and weight of the display. The desk clamp for the MX arm is larger than the other, and seemed very secure to me. The MX Arm is very solidly constructed, and has no problems whatsoever keeping the large display in place. I wouldn't attempt to use it with a smaller display, it really is designed for heavy displays, and the smaller arms do a fine job.

The cable management system of the arms is very well designed, and actually seems to work. I upgraded all of my DVI cables and power cables during this process to either 10 or 15ft so that the monitors positions could be easily adjusted, so the cables are rather large and inflexible, yet the cable management system still worked fine.

While I originally wanted the arms only to allow the two displays to be elevated, as soon as I got them installed I realized that I had needed these arms for some time, I just didn't know I needed them. For starters, they make dusting my desk significantly easier, as the monitors can be easily repositioned out of the way. Additionally, the appearance of my desk is cleaner than it was before, with the arms really improving the visual aesthetics of my work area; it looks much cooler and more high-tech now, and that counts for something. The arms have also made it easier to reconfigure the display configuration for specific situations. I'll occasionally shift one of the monitors to landscape view, and the arms allow any of the monitors, even the 30" display, to be transitioned.

From a productivity standpoint, I've got 4,096,000 reasons to be happy with this upgrade. The 2560x1600 resolution of the large display allows me to display either 2 or 4 files, plus the filesystem tree, in my IDE simultaneously. This has greatly enhanced my coding productivity. WIth the other three display, two 1600x1200, and a 1680x1050 display, I have a total of 9.7 million pixels to work with. In the upper left I usually keep my email, iTunes, and my project management software open. On the right hand side I usually have a web browser open with the stuff I'm working on. In the lower left I usually have a bunch of SSH windows open, tailing files, running irb, cucumber and autospec. In the center I'll keep my IDE or anything I'm actively working on. This allows me to keep everything I'm currently working on open and on top, so that I can reference things without having to move or change any windows. In particular, it's nice having autospec always running on my project so I can glance over and see any regressions.

All in all, I'm extremely happy with the monitor arms. I estimate the upgrade cost about $600, and my only regret is that I didn't make the investment sooner.

Headless Selenium Screenshots with Cucumber 3

Posted by jcnnghm Wed, 30 Dec 2009 11:24:00 GMT

 I was finally able to get Selenium integrated with Webrat and Cucumber on my Linux development server.  I followed this excellent guide to setting up the selenium server to run headless.  This enables me to run my tests without actually seeing the Firefox window.  This does, unfortunately, make debugging a bit more difficult.

Because of that, I created a Cucumber step to save a screenshot of the webpage in the tmp/screenshots folder.  This includes the entire page, not just the viewable portion.  Not only does this simplify debugging, but it also makes it trivially difficult to capture a large number of screenshots from the testing framework to compile visual reports.  I believe that making sure everything looks right is as much a part of testing as making sure it actually works.


Then /^I save a screenshot with filename "([^\"]*)"$/ do |filename|
  selenium.capture_entire_page_screenshot(File.expand_path("tmp/screenshots/#{filename}.png"), "")

Set Restriction Info with Facebooker 1

Posted by jcnnghm Tue, 22 Sep 2009 11:03:00 GMT

I’ve been working on a Facebook App and I was trying find out exactly how to go about setting content restrictions with Facebooker. While the documentation for the Admin.setRestricitionInfo API call is pretty clear, the Facebooker documentation is less clear.  It looked to me at first glance that the Facebooker::Admin.set_restriction_info method would have to be called with every request.  This seemed terribly innefecient to me, so I tried some other methods out until I found something that worked. In config/initializers, I created a facebook_permissions.rb file, and inserted the following code:

Facebooker::Admin.new(Facebooker::Session.create).set_restriction_info(‘type’ => ‘alcohol’)

This code will run every time your server starts, updating your application restriction settings.  Run the following command from script/console to double-check that the restrictions are being set correctly:


Programatically Selecting a Restaurant?

Posted by jcnnghm Tue, 13 Jan 2009 00:28:00 GMT

I’ve been working quite a bit on the BarsAnnapolis.com site lately.  We’ve been getting ready to launch a new website, similiar to that site, featuring Annapolis-area restaurants.  I finally completed the actual site-work today, it’s all set and ready to go.  Instead of displaying bar speacials, the site will attempt to infer and display the optimal place and the optimal dish to have right now.

Of particular interest was the algorithm to accomplish this.  I ended up weighing a whole host of things, including current weather conditions, temperature, time of day, and season, to come up with reasonable weights for each venue.  The results are interesting, and seem to be pretty accurate so far.

Slow Runt 3

Posted by jcnnghm Tue, 03 Jun 2008 12:52:00 GMT

While unit testing some code that I’ve been working on that uses the excellent runt library, I ran into a bit of code that was quite slow. When calling the include? method of the Runt::DIMonth class with a negative value for the week of the month argument (i.e. DIMonth.new(-1,6).include?(date)) it took over 120 seconds to execute my unit tests.

I replaced the method max_day_of_month (Runt::TExprUtils), as listed below:

def max_day_of_month(date)
  result = 1
  next_month = nil
    next_month = Date.new(date.year+1,1,1)
    next_month = Date.new(date.year,date.mon+1,1)
  date.step(next_month,1){ |d| result=d.day unless d.day < result }

with the following code:

def max_day_of_month(date)
  month = date.month
  year = date.year
  if month == 2
    !year.nil? && (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) ?  29 : 28
  elsif month <= 7
    month % 2 == 0 ? 30 : 31
     month % 2 == 0 ? 31 : 30

The same unit tests can now be performed in under two seconds. I didn’t write the algorithm, it’s taken verbatim from the Rails ActiveSupport::CoreExtensions::Time::Calculations::ClassMethods module daysinmonth method. That method appears to be the cause of the issue.

Multi Bit Shift Launch

Posted by jcnnghm Mon, 25 Feb 2008 12:54:00 GMT

I was finally able to launch my new product, Multi Bit Shift, a Flex multiple file upload applet complete with a Rails plugin to ease the integration. I learned a lot from this project, since this is the first that I have made use of project management software, in particular FogBugz, which I would highly recommend.

In particular, I learned that I grossly underestimated the amount of time required to produce proper documentation, the MBS website, and the product screencasts. Proper documentation is really what separates real, professional products from amateur contributions, so it is absolutely vital to dedicate whatever time is necessary to make sure everything is both well and thoroughly documented.

The website, and to a lesser extent the screencasts were also quite time consuming. I had my company, Compucated Solutions produce the design and integrate it with software that I wrote to manage the site. I am very pleased with the design and presentation at this point, but I must admit that I did spend considerable time writing and formatting content, as well as coding up the necessary software bits. I look at this kind of as an investment though, because when I go to release software in the future I have a very flexible engine that I can now quickly roll products out on.

The screencasts were also quite time consuming. I ultimately settled on the TechSmith’s Camtasia Studio product, as recommended by Jeff Atwood to produce the video. I am quite pleased by the results although I would like to be able to set the background color of the video files, and perhaps tweak the appearance a bit. While the software was a little pricey at $299 considering there are lots of competitors and viable alternatives, I ultimately settled on this particular product because it does what it does so very well. If you need to produce screencasts, seriously consider Camtasia, it is worth the premium. If you don’t need to produce screencasts, I suggest that you reconsider because they are a really excellent way to quickly convey complex information.

Besides just creating the screencasts, I also decided to make use of Amazon’s Simple Storage Service to host them. While I probably have ample bandwidth to host the screencasts on my equipment, I ultimately came to the conclusion that the users would have a better user experience if they were hosted by someone else. I have to say that, at this point, I am extremely impressed by the Amazon S3 service. It’s fast, reliable, flexible, easy to use, and inexpensive. I’m currently using the Firefox S3Fox plugin to manage the storage space. It really doesn’t get much easier.

All said and done, I believe I spent just as much, or even more time, documenting and launching this software than I actually did on the design and coding. In the future, I believe I’ll have to give much more thought in the product planning stages to the actual launch requirements (like a website, screencasts, docs, etc…) and the time required for their production.