作者: TAMURA.KENICHI
日時: 2002/2/20(00:30)
たむらです。
これは、 slashdot.jp の日記に書いてたんだけどネタ提供のため及び続
きが未実装なため、こちらで広げようかと。

AdjustClock という Win32 なソフトウェアがある。 
<URL:http://homepage1.nifty.com/redwing/software/software.html>
Delphi で作られたこのソフトは、<URL:http://www2.crl.go.jp/cgi-bin/JST.cgi> 
から日本標準時間を取得して時刻合わせをしてくれるのだ。 
普通こういう用途には、 ntp が使われるのだけど企業内で Proxy が ntp
 通してくれないところでも、 HTTP は大丈夫なので結構便利そう。 
# もっとも精度はかなり落ちると思われる。 README には 3 秒程度 ?と 

で、 Unix は作者さんが知らないというので、 Ruby で実装してみること
にした。

まず時間の文字列取得は net/httpだね。ということで 

require 'parsedate.rb' 
require 'net/http' 

$TARGET_ADDR = 'www2.crl.go.jp' 
$TARGET_PATH = '/cgi-bin/JST.cgi' 

$PROXY_ADDR = 'proxy.qrl.mei.co.jp' 
$PROXY_PORT = 8080 
$PROXY_ACCOUNT = '' 
$PROXY_PASS = '' 
$PROXY_AUTH = $PROXY_ACCOUNT.size == 0 ? nil : 
              ['Proxy-Authorization' => 
              sprintf("Basic %s",["#{proxy_account}:#{proxy_password}"]
               .pack('m').strip) ] 

proxy = Net::HTTP::Proxy($PROXY_ADDR, $PROXY_PORT) 
proxy.start($TARGET_ADDR, 80 ) {|http| 
    response , = http.get($TARGET_PATH, $PROXY_AUTH) 
    
    response.body.split(/\n/).each do |l| 
        if /\s+Standard.+Date.parse\(\"(.+)\"/ === l then 
            # [2002, 1, 11, 21, 10, 41] 
            tt = ParseDate::parsedate($1)[0 .. 5] 
            
            p tt 
            p Time.gm(tt[0],tt[1],tt[2],tt[3],tt[4],tt[5]).to_i 
            
            break 
        end 
    end 
} 

あとは、OS依存な時刻設定部だ。 


tDiary はじめました。 http://tamura.tdiary.net
たむら mailto:sgs02516@...