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食わせるとすんなりといきました。当然、精度は保証できませんが、ずれても数秒レベルでしょう。
[ツッコミを入れる]