Kiwi ran out of disk space and memory (perhaps running out of disk space resulted in no room for the swap file to grow?) around 1 am PST this morning. Upgraded both and brought back online around 6:45pm PST.

Web sites (except Gallery and Wiki) and mail were down. Everything should be back to normal now.

Our camera’s clock got reset and we didn’t notice until we had shot nearly two hundred photos. Doh! Even after we figured out the offset required to correct the problem, it turned out to be a bit involved to apply it. I ended up writing a Ruby script to do it. Then I was able to correct both the filesystem dates as well as the embedded EXIF timestamps for all the images with the following command:

camera_date.rb “18 Jan 2005 23:31:12″ “14 Sep 2009 11:31:12″ *.PEF

The first time stamp is the incorrect time stamp of one of the images, and the second is the correct time stamp for that particular image. This offset is then applied to all the specified files (*.PEF). The Ruby script is below. It requires that ExifTool be installed.

#!/usr/bin/env ruby
 
require 'time'
 
# 2009-10-17 LHN: Adjust file modification time and EXIF fields of files.
# Used to correct files that were recorded on a camera that had it's clock
# accidentally reset.
 
# Requires ExifTool (http://www.sno.phy.queensu.ca/~phil/exiftool)
 
def help_message
  puts <<HEREDOC
 
Camera Date rev 2009-10-18
 
Camera Date is intended to correct images take on cameras whose clocks were
accidentally reset. It will update the following pieces of information:
  * filesystem timestamp
  * EXIF fields DateTimeOriginal, CreateDate, ModifyDate, Date
 
Syntax is camera_date.rb bad_date good_date file ...
 
bad_date is the date of an image as recorded by the camera
good_date is the correct date for that image
 
bad_date and good_date are used to calculate an ofset that can then be applied
to all specified files.
 
dates are specified in RFC8288 format and must be surrounded by quotes.
 
Example:
camera_date.rb "18 Jan 2005 22:10:03" "14 Sep 2009 10:10:03" IMGP7843.PEF IMGP7845.PEF
 
HEREDOC
  exit
end
 
help_message unless ARGV.length >= 3
 
begin
  INPUT_DATE = Time.parse(ARGV[0])
  OUTPUT_DATE = Time.parse(ARGV[1])
  OFFSET_TOTAL_SECS = OUTPUT_DATE.to_i - INPUT_DATE.to_i
  puts "#{INPUT_DATE} => #{OUTPUT_DATE}"
  puts "Offset in seconds is #{OFFSET_TOTAL_SECS}" 
 
  ARGV[2 .. -1].each{ |entry| 
    mtime = File.stat(entry).mtime
    newtime = mtime + OFFSET_TOTAL_SECS
    puts "#{entry}: #{mtime} -> #{newtime}"
    system("exiftool \"-AllDates=#{newtime.strftime("%Y:%m:%d %H:%M:%S")}\" \"-Date=#{newtime.strftime("%Y:%m:%d")}\" #{entry}")
    system("touch -c -t#{newtime.strftime("%Y%m%d%H%M.%S")} #{entry}")
  }
  puts "Done."
rescue StandardError => e
  puts e
  help_message
end