[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