Ruby で CGI > 送受信_環境変数 ENV > 問題
cookie を利用して、同じ閲覧者の連続したアクセスでカウントアップしない画像カウンターを作ってみてください
♪
ENV['REMOTE_ADDR']
を読み取って、一時的にサーバーに記録し、一定時間、同一のipアドレスからのアクセスではカウントアップしないという方法もあります。ただ、最近は「プライバシーの保護」などの観点から、ネットワークのブロック毎にipアドレスの値が、同じ値になるように仮面を被ってしまったり、閲覧者が無線アクセスポイントなどを利用していると、同じ閲覧者ののアクセスでも移動や回線の都合で途中からipアドレスが変わってしまうなど、ipアドレスを手がかりにする方法は、あまりあてにならなくなってきています。♪
たとえば、こんなのでどうでしょう?
#!/usr/local/bin/ruby
countimg = "count.gif"
countlog = "count.txt"
Fonts = Dir.glob("font/*.*").sort
begin
f = File.open( countlog, "r")
count = f.gets.to_i
f.close
rescue
count = 0
end
cookie = nil
unless /\bMYCOUNT=(\d+)\b/ =~ ENV['HTTP_COOKIE'].to_s && $1.to_i == count then
count += 1
cookie = "Set-Cookie: MYCOUNT=#{ count }; "
cookie += ( Time.now + 60*60*12 ).gmtime.strftime("expires=%a, %d-%b-%Y %H:%M:%S %Z; ")
cookie += "path=/; "
cookie += "\n"
File.open( countlog, "w").print count
a = ["convert","+append"]
for n in ("%03d" % count).split(//) do
a += [ Fonts[n.to_i] ]
end
a += [countimg]
r = system(*a) rescue false
countimg = Fonts[0] unless r # カウンター画像の生成に失敗した場合の対策
Process.waitall
end
countimg = Fonts[0] unless FileTest.file?(countimg) # カウンター画像が存在しなかった場合の対策
print <<EOS
Content-Disposition: filename="#{ ("%03d" % count) }.gif"
Content-type: image/gif
Content-Length: #{ File.size( countimg ) }
#{ cookie }
EOS
f = File.open( countimg ,"rb")
STDOUT.binmode
while line = f.gets do
print line
end
f.close
$1
は直前の正規表現でマッチした部分の最初の括弧( )
内の内容を表します"\n"
は改行(LF)ですSet-Cookie:
から書き始め、改行で終わることとし、cookie を送信しない場合は、内容を nil
としました#{ nil }
は何も無い空文字列として扱われます ⇒ "nil" にはならないProcess.waitall
は、ruby1.6以前では使えません ⇒ 古い ruby の場合は、その行を削除以上です。