[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[mhc:00177] 小ネタ
ダイエー優勝のときは、福岡を離れていたりして、間が悪い乃村です。
小ネタ。
★ My Meeting 2000
meeting2000 って知ってますか?
ruby で書かれた meeting の時間調整サーバです。
イベントでときどき使うのですが、
自分の予定表と付き合わせながら、これに入力するのって、
視線を動かすのが嫌いな僕としては、すごく疲れるんですよね。。
そこで、meeting200 が吐く入力フォームに自分の予定を並べて見せる
プロキシをでっちあげてみました。以下 Navigator での設定。
## 基本的に貰ってきた html に任意の Filter を通す proxy なの
## で、特定の単語を伏せ字にするような使用も考えられますね。
あ、それと一切認証してないので、他人からつながれるとスケジュー
ル丸見えです。:-)
1. 適当な proxy.pac を書いて、これを Navigator の proxy 設定
に指定します。file:/home/nom/proxy.pac とでも。
function FindProxyForURL(url, host)
{
// 例えば、meeting2000.hoge.hoge.com:8080 のときは
// localhost:33333 で動いている My meeting 2000 Proxy を通す。
if (dnsDomainIs(host, "meeting2000.hoge.hoge.com") &&
shExpMatch(url, "*meeting2000.hoge.hoge.com:8080*"))
return "PROXY localhost:33333; DIRECT"
// ここからは普段使っている Proxy があれば、それ用の設定
// にしておく。この例では、普段の Proxy なし。
return "DIRECT";
}
2. 以下の script を localhost で動かす。
#!/usr/local/bin/ruby
require 'socket'
require 'mhc-schedule'
require 'kconv'
Thread .abort_on_exception = true
$DEBUG = false
$mhc_db = MhcScheduleDB .new
wSock = TCPserver .open(33333)
addr = wSock .addr
addr .shift
printf("server is on %d\n", addr .join(":")) if $DEBUG
def proxy(cSock)
sSock = nil
th1 = nil
filter = false
th2 = Thread .start {
Thread .stop if !sSock
while line = sSock .gets
print "S> #{line}" if $DEBUG
if line =~ /Content-Length:/i
next
end
if line =~ /Server:\s*Meeting2000/
filter = true
end
if filter
begin
cSock .write(filter_proc(line))
rescue
end
else
begin
cSock .write(line)
rescue
end
end
end
th1 .exit
cSock .close
}
th1 = Thread .start {
buf = ''
while line = cSock .gets
print "C> #{line}" if $DEBUG
if line =~ /^(get|post)\s*http:\/\/(.*)\s*(HTTP.*)/i
command = $1
http_ver = $3
host, trail = $2 .split('/', 2)
host, port = host .split(':', 2)
trail = '/' + trail
port = 80 if !port
print "sSock => open(#{host}, #{port})\n" if $DEBUG
sSock = TCPSocket .open(host, port)
line = "#{command} #{trail} #{http_ver}\r\n"
th2 .run
end
buf += line
if sSock
if buf =~ /^get/i
print "> #{buf}" if $DEBUG
end
begin
sSock .write(buf)
rescue
end
buf = ''
end
end
th2 .exit
sSock .close
}
end
W_TO_COLOR = ['red', nil, nil, nil, nil, nil, 'blue']
def c_str(c, *arg)
if c .is_a?(String)
color = c
elsif c .is_a?(Integer)
color = W_TO_COLOR[c]
else
color = nil
end
if color
return "<font color=#{color}>" + arg .join + "</font>"
else
return arg .join
end
end
def filter_proc(line)
ret = ''
if line =~ /type\s*=\s*checkbox.*(\d{4})-(\d\d)-(\d\d)-check/i
date = MhcDate .new($1 .to_i, $2 .to_i, $3 .to_i)
ret += c_str(date .w, line)
$mhc_db .search1(date) .each{|sch|
if sch .in_category?('Holiday')
c = 'red'
else
c = 'green'
end
ret += c_str(c, Kconv::toeuc("<dd>#{sch .time_as_string} #{sch .subject}</dd>"))
}
else
ret = line
end
return ret
end
while true
s = wSock .accept
print s, " is accepted\n" if $DEBUG
proxy(s)
end