トップ «前の日記(2009-03-16(月)) 最新 次の日記(2009-03-18(水))» 編集

とた日記


2009-03-17(火) 晴 安静時心拍数 54 [長年日記]

_ HTTPで荒っぽい時刻合わせ

サービスを動かしている計算機の時刻がずれると芳しくないことがしばしばありますが、社内にNTP serverがなく、ファイアウォールはHTTP, HTTPSしか越えられません。そこで、HTTPで時刻取得できないかと探してみたところ見つけたのがNICT 公開 NTP サービスです。JSONP形式が使えるということで、以下のようなコードを雑に書いてみました。

#!/usr/local/bin/ruby
 
require 'date'
require 'timeout'
require 'open-uri'
require 'rubygems'
require 'json'
 
begin
  s = ''
  it = Time.now.to_i
  timeout(10) do
    open("http://ntp-a1.nict.go.jp/cgi-bin/jsont?#{it}", :proxy => "http://proxy.example.co.jp:8080/") do |f|
      s = f.read
    end
  end
  json = nil
  if /jsont\(\s*(.*)\s*\)/m =~ s
    json = $1
  else
    exit
  end
  st = JSON.parse(json)["st"]
  stime = Time.at(st)
  p "it:  " + Time.at(it).to_s
  p "st:  " + stime.to_s
  p "now: " + Time.now.to_s
 
  ptime = "#{stime.strftime("%Y%m%d%H%M.%S")}"
  io = IO.popen("/bin/date #{ptime}")
  p io.gets.strip
 
rescue => e
  p "hoge"
end

取得できる情報がJSONPなので、そのままJSON.parseするとエラーになってしまいます。余分な"jsont("と")"を消してからJSON.parse食わせるとすんなりといきました。当然、精度は保証できませんが、ずれても数秒レベルでしょう。