出力方法-演習編

Problem4: アクセス回数を連結画像で表示してみよう

アクセス回数を、数字画像を連結された一つの画像として表示させる CGI を作成してください。 テキストで表示させるカウンターを少し変えるだけです。

⇒ ヒント

Hint

⇒ 答え

Solution

#!/usr/local/bin/ruby
CounterIMG = "count.gif"               # 出来上がり数字画像のファイル名(拡張子は .gif)
CountLOG   = "count.txt"               # 数え上げた数字を記録したファイル
Fonts = Dir.glob("font/*.*").sort      # font ディレクトリの中の数字画像の配列
count = File.open(CountLOG){|f| f.read.to_i } rescue 0 # カウント数を読み込んで、文字列から整数に変換
count += 1
a = ["convert","+append"]              # "-append" にすると、縦連結
for n in ("%03d" % count).split(//) do # 4桁表示にする場合は、%03d を %04d に書き直す
  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="#{ ("%03d" % count) }.gif"
Content-type:   image/gif
Content-Length: #{ File.size( CounterIMG ) }

EOS
f = File.open( CounterIMG ,"rb")       # 画像ファイルを開く
STDOUT.binmode                         # サーバーによっては、標準出力をバイナリーモードに変更
while line = f.gets do                 # データを1行づつ読み込み変数lineに写し取る
  print line                           # 画像データを出力
end
f.close                                # 画像ファイルを閉じる

ファイルの配置。()内は、北大教育用サーバー内でのモード。

■親ディレクトリ/
┣このCGI   (755)
┣count.gif (766)
┣count.txt (766)
┗■font/   (711)
 ┣ 0.gif
 ┣ 1.gif
 :
 ┗ 9.gif

または、Location で画像ファイルに飛ばします。

#!/usr/local/bin/ruby
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 ("%03d" % 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-type:   image/gif
Content-Length: #{ File.size( CounterIMG ) }
Location:       #{ CounterIMG }

EOS

以上です。

Last updated 05.Sep.2006 [ Home ] [ Up ] [ 質問メール ]
Copyright © 2005-2006 Shigeru Konno All Rights Reserved..