Ruby で CGI > 送受信_環境変数 ENV > 問題
アクセス回数を、数字画像を連結された一つの画像として表示させる CGI は作成しました。数字画像を、アドレスに付加した情報からコントロールできるようにしてみてください。
例:6桁表示 | http://〜略〜/count.cgi?6 | ⇒ |
できれば、枠もつけてみてください
例:枠幅5,桁数6 | http://〜略〜/count.cgi?waku=5;kata=6 | ⇒ |
♪
ENV['QUERY_STRING']
"%03d" % count
の部分の 3 を 6 に書き換えると6桁になります"
で挟まれた部分には、#{ }
を使って代入ができます
keta = 6 "%0#{keta}d" |
は、"%06d" と、同じです |
convert -frame 64x32+8+4 -mattecolor teal count.gif count2.gif
|
str = "keta=5;waku=6"
if /\bketa=(\d+)\b/ =~ str then
puts $1
end
if /正規表現/オプション =~ 文字列 then 動作 end
という形でよく使います=~
の結果は true にならないので、動作しません\b
は単語境界、\d
は任意の数字一文字、\d+
は一文字以上からなる任意の数字を表します=~ str.to_s
の様にムリ繰り文字列に直した方が安全ですstr = "keta=5;waku=6" h = Hash.new for q in str.split(/[;&]/) do key,value = q.split(/=/,2) h[key] = value end
♪
画像連結式カウンターのプログラムを下記の様の書き直すだけで完成
#!/usr/local/bin/ruby keta = 3 qs = ENV['QUERY_STRING'].to_i keta = qs if qs > 0 CounterIMG = "count.gif" CountLOG = "count.txt" Fonts = Dir.glob("font/*.*").sort count = File.open(CountLOG){|f| f.read.to_i } rescue 0 count += 1 a = ["convert","+append"] for n in ("%0#{ keta }d" % count).split(//) do a += [ Fonts[n.to_i] ] end a += [CounterIMG] system(*a) Process.waitall File.open(CountLOG,"w"){|f| f.print count } print <<EOS Content-Disposition: filename="#{ ("%0#{ keta }d" % count) }.gif" Content-type: image/gif Content-Length: #{ File.size( CounterIMG ) } EOS f = File.open( CounterIMG ,"rb") STDOUT.binmode while line = f.gets do print line end f.close
.to_i
は、self(=くっ付けられたやつ)を整数にします。数字以外を表す文字列や、空っぽ( nil )の場合は、0 になります。さらに枠もつけてみると、(http://〜略〜/count.cgi?waku=5;keta=6 のように枠の太さと桁数を入力)
#!/usr/local/bin/ruby keta = 3 if /\bketa=(\d+)\b/ =~ ENV['QUERY_STRING'].to_s then k = $1.to_i keta = k if k > 0 end waku = 0 if /\bwaku=(\d+)\b/ =~ ENV['QUERY_STRING'].to_s then k = $1.to_i waku = k if k > 0 futi = [(waku+1)/3,5].min end CounterIMG = "count.gif" CountLOG = "count.txt" Fonts = Dir.glob("font/*.*").sort count = File.open(CountLOG){|f| f.read.to_i } rescue 0 count += 1 a = ["convert","+append"] for n in ("%0#{ keta }d" % count).split(//) do a += [ Fonts[n.to_i] ] end a += [CounterIMG] system(*a) Process.waitall `convert -frame #{ waku }x#{ waku }+#{ futi }+#{ futi } \ -mattecolor #aaf #{ CounterIMG } #{ CounterIMG }` if waku > 0 Process.waitall File.open(CountLOG,"w"){|f| f.print count } print <<EOS Content-Disposition: filename="#{ ("%0#{ keta }d" % count) }.gif" Content-type: image/gif Content-Length: #{ File.size( CounterIMG ) } EOS f = File.open( CounterIMG ,"rb") STDOUT.binmode while line = f.gets do print line end f.close
[(waku+1)/3,5].min
は、waku+1
を3で割った商と、5を比べて、小さい方の整数。稜線の幅の上限を 5 にしました。7/2
は3
になります。3.5
にはなりません。7.0/2
は 3.5
になります。\
を置くと、「続きとして次の行がそのまま繋がる」意味になります。1行の表現が長過ぎてみづらいときに使います。さらに枠の色も指定できるようにします。枠の幅/色 という形として、(http://〜略〜/count.cgi?waku=5/f80;keta=6)
#!/usr/local/bin/ruby
keta = 3
if /\bketa=(\d+)\b/ =~ ENV['QUERY_STRING'].to_s then
k = $1.to_i
keta = k if k > 0
end
waku = 0
if /\bwaku=(\d+)\b/ =~ ENV['QUERY_STRING'].to_s then
k = $1.to_i
waku = k if k > 0
futi = [(waku+1)/3,5].min
end
mattecolor = "#aaf"
if /\bwaku=\d+\/([0-9a-f]{3,9})\b/ =~ ENV['QUERY_STRING'].to_s then
mattecolor = "#" + $1
elsif /\bwaku=\d+\/([A-Za-z]+)\b/ =~ ENV['QUERY_STRING'].to_s then
mattecolor = $1
end
CounterIMG = "count.gif"
CountLOG = "count.txt"
Fonts = Dir.glob("font/*.*").sort
count = File.open(CountLOG){|f| f.read.to_i } rescue 0
count += 1
a = ["convert","+append"]
for n in ("%0#{ keta }d" % count).split(//) do
a += [ Fonts[n.to_i] ]
end
a += [CounterIMG]
system(*a)
Process.waitall
`convert -frame #{ waku }x#{ waku }+#{ futi }+#{ futi } \
-mattecolor #{ mattecolor } #{ CounterIMG } #{ CounterIMG }` if waku > 0
Process.waitall
File.open(CountLOG,"w"){|f| f.print count }
print <<EOS
Content-Disposition: filename="#{ ("%0#{ keta }d" % count) }.gif"
Content-type: image/gif
Content-Length: #{ File.size( CounterIMG ) }
EOS
f = File.open( CounterIMG ,"rb")
STDOUT.binmode
while line = f.gets do
print line
end
f.close
以上です。