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