Archive for the '/dev/random' Category

Coding Horror Knocked Down: A Tale of Back-ups

Some time today an issue at Coding Horror’s web host took the site down. It appears it might have been due to the loss of the database, and it also appears that while the hosting company said they were making data back-ups, in fact they weren’t. That’s brutal.

I feel for Jeff Atwood et al. in that, if only because I know from experience how much that sucks. When we were first launching DreamBank an issue at our host took out our entire production database as well. Heroic recovery efforts on the part of one of our developers recovered the lost data, with absolutely no help from the web host.

We promptly switched hosts because, in our instance, it was a case of professional negligence and stupidity rather than just run-of-the-mill incompetence, but that’s not the take-away from these events. That kind of thing can happen anywhere, for a thousand different reasons.

The take-away is this: we only own the data that we physically have possession of. Whether it’s back-ups of your website’s source, your database tables, or all the information you’re storing out there on “the cloud” in Google docs and Gmail, if you don’t have a current copy of it you don’t really own it. You’re just renting on someone else’s good graces.

We at DreamBank learned that the hard way. Jeff’s learning that the hard way today. Ma.gnolia learned that the hard way too (though it’s probably more accurate to say we all re-learned it). But maybe you don’t have to. Learn from our mistakes . Back up your data yourself, today.

And on that note I’m going to go back up my laptop, which hasn’t been backed up in three days, and dump the database powering this blog.

No Comments »

chris on December 11th 2009 in /dev/random

Redfin on VC Questions

Frankly, in years of reading TechCrunch (and much of that against my better judgement), this is the best post TC has ever posted: Good Question! The Eight Best Questions We Got While Raising Venture Capital.

VCs are good at asking questions. They are unimplicated in your dumb decisions, unmoved by your original sense of mission and far less concerned than you that a blunder could bankrupt you. They re-imagine your business in terms of all the other businesses they’ve seen, pulling the arms off one doll and the head off another to create a perfect money-making Frankenstein. And since the stakes are high, the whole philosophical exercise tends to result in action.

Here are the questions VCs asked Redfin that changed how we think about our business.

I love question #1.

No Comments »

chris on November 18th 2009 in /dev/random

Fix for uGallery

On a current project I’m working on, we’re using uGallery to implement an image carousel. Despite the JS code being a bit rough it’s very easy to integrate and the output is quite elegant. I like it a lot.

Unfortunately the current version of uGallery (1.1) has a minor bug. If you’re displaying fewer thumbnails whose width will exceed the interior of the thumbnail viewport, the horizontal scrolling goes wonky. This wee patch fixes that issue.

In uGallery.js wrap the margin calculation and style assignment in this conditional:

    // Only bother to scroll the content if its area is greater than the viewport
    if ( contentWidth > viewWidth ) {
        var margin = -Math.round( ( e.clientX / viewWidth ) * movableWidth ) + 20;
        thumbs.css( {"margin-left": margin+"px"} );
    }

No Comments »

chris on September 23rd 2009 in /dev/random

Handy DataMapper uninstall script

gem list '\A(?:(?:d[mo])[_-]|data_?(?:mapper|objects)|extlib)' --no-versions | xargs sudo gem uninstall -aIx

(Via Dan Kubb and gist: 31187.

No Comments »

chris on September 2nd 2009 in /dev/random

TextMate, ImageMagick and “Command not found”

Two days ago I did a clean install of Snow Leopard, TextMate and all the associated goodies. All was going well until I tried running my spec’s that referenced Rmagick from within TextMate. They started returning the following error:

sh: convert: command not found

This was fixed by opening TextMate’s preferences, Advanced -> Shell Variables and adding a new variable:

Variable: PATH
Value: see below.

For the curious, my $PATH is currently:

/usr/local/bin:/usr/local/sbin:/usr/bin:/opt/local/bin:/usr/local/mysql/bin:/opt/local/sbin:/bin:/usr/sbin:/sbin:/usr/X11/bin

No Comments »

chris on September 2nd 2009 in /dev/random

Merb, merb_datamapper gem, and “was no found”

I just killed a bunch of time tracking down the cause of this issue that was occurring while trying to run a merb app:

FATAL: The gem merb_datamapper (>= 0, runtime), [] was not found

This message is in fact incorrect. Merb can find the gem just fine, as running with –verbose indicates, it just can’t load it.

After much mucking about it turns out the problem was the Addressable gem being updated to v2.1. Removing addressable-2.1.0 fixed everything.

(If you run into similar issues and think this might help, please note the date on this post. Version numbers may have changed significantly since this writing.)

No Comments »

chris on June 19th 2009 in /dev/random

How To Make Fake Mars Dust

It amuses me to no end that not only has NASA figured out how to create fake Mars dust (aka: dust on Earth that has the same consistency and texture as the stuff on Mars), but that they actually have a legitimate need to do so:

But now Spirit faces a new and tricky challenge—its wheels have partly sunk into a patch of soft soil. The rover’s controllers have put a halt to driving operations while they try to figure out how to get it unstuck.

“Spirit is in a very difficult situation,” John Callas, project manager for the rovers at the NASA Jet Propulsion Laboratory (JPL) in Pasadena, Calif., said in a statement yesterday. “We are proceeding methodically and cautiously. It may be weeks before we try moving Spirit again.” A JPL spokesperson said today that the rover’s condition had not changed.

Incidentally, the recipe via MarsRovers:

Recipe for rover sandbox testing (to duplicate Spirit’s sandtrap): 1part Diatomaceous Earth + 1part Fire Clay (used for pottery)

No Comments »

chris on June 15th 2009 in /dev/random

Better Range Intersection in Ruby

A little while ago I posted a solution for finding intersections between timespans (“Detecting DateTime Timespan Overlap In Ruby”). It works but, as Dan Kubb pointed out to me, it doesn’t use the most graceful means of determining intersections between Range instances, particularly for very large ranges.

Not content to leave it at that, Dan of course provides a better solution, complete with tests:

#!/usr/bin/env ruby

class Range
  def intersection(other)
    raise ArgumentError, 'value must be a Range' unless other.kind_of?(Range)

    min, max = first, exclude_end? ? max : last
    other_min, other_max = other.first, other.exclude_end? ? other.max : other.last

    new_min = self === other_min ? other_min : other === min ? min : nil
    new_max = self === other_max ? other_max : other === max ? max : nil

    new_min && new_max ? new_min..new_max : nil
  end

  alias_method :&, :intersection
end

if __FILE__ == $0
  range = 5..10

  tests = {
    1..4   => nil,     # before
    11..15 => nil,     # after
    1..6   => 5..6,    # overlap_begin
    9..15  => 9..10,   # overlap_end
    1..5   => 5..5,    # overlap_begin_edge
    10..15 => 10..10,  # overlap_end_edge
    5..10  => 5..10,   # overlap_all
    6..9   => 6..9,    # overlap_inner

    1...5  => nil,     # before       (exclusive range)
    1...7  => 5..6,    # overlap_begin      (exclusive range)
    1...6  => 5..5,    # overlap_begin_edge (exclusive range)
    5...11 => 5..10,   # overlap_all  (exclusive range)
    6...10 => 6..9,    # overlap_inner      (exclusive range)
  }

  tests.each do |other, expected|
    result = range.intersection(other)
    result_status = ( result == expected ) ? "passed" : "failed"
    puts "#{range.inspect} #{other.inspect} result #{result_status}: #{result.inspect} (#{expected.inspect})"
  end
end

I like it.

No Comments »

chris on June 6th 2009 in /dev/random

Amazon S3 Buckets and “Access Denied”

DreamBank uses Amazon S3 as it’s data and media storage backup. Recently I enabled logging on our S3 buckets and was immediately refused access to any of the content contained within; nothing but “403 Access Denied” errors. Bit of a problem, that.

Thanks to some sound guidance from the folks at Cloudberry Lab (who make CloudBerry S3 Explorer – that’s my plug for their freeware Windows S3 app since they were so helpful) I now have full access to our buckets again.

The solution: turns out the permissions on the buckets were munged* when I enabled logging, giving access to no one. Resetting the access to “owner/owner” did the trick. This was accomplished by connecting to S3 through Transmit and tweaking the perms like any other file directory.

(*that’s as close to a technical description as I can get. I have no idea what really went wrong.)

No Comments »

chris on June 6th 2009 in /dev/random

Merb, Safari and “Cannot decode raw data”

Today I was attempting to get Merb to output a comma-delimited file of data dumped from the database. In config/init.rb I’d added:

Merb.add_mime_type( :csv, :to_csv, %w[application/csv], "Content-Encoding" => "gzip")

but I kept getting this error from Safari: cannot decode raw data.

Turns out the gzip encoding was mucking up the data. Using this line instead produced the desired outcome:

Merb.add_mime_type( :csv, :to_csv, %w[application/csv] )

No Comments »

chris on April 30th 2009 in /dev/random