出力方法-演習編

Problem2: アクセス回数をテキストで表示してみよう

アクセスする毎にテキストで表示される数字が一つづつ増えて行く CGI を作成してください。 html である必要はありません。いろいろ工夫してみてください。

⇒ ヒント

Hint

  1. アクセス回数をファイルに保存しておき、アクセスがあったときに、その値に1を足した値を表示し、その1を足された値を新たに保存するとよいでしょう
  2. サーバーにアップロードする前に、手許で実験を繰り返してみるとよいでしょう
  3. ファイルの中身の読み込み: テキストファイル count.txt の内容を、n に一括して写し取るには
    f = File.open("count.txt","r")
    n = f.read(23)
    f.close
    
    • ここで、f はファイルを扱うために取り付けた取っ手のようなもの(ファイルハンドル)
    • ,"r"は動作を指定するオプション(r,rb,w,wb,a などがある)で、文章読み出し,"r"の場合に限り省略可能です
    • f.read(23) でファイルから中身を、23バイト(=英文23文字)を上限として、読み出します。23以外の整数でも同様。(23)を省略すると、ファイルサイズの大きなファイルでも、全部一気に読み出します。
    • 大容量のファイルを読み出す場合は、メモリー等を節約するため、f.readを避け、f.getsで1行づつ取り出して処理します。whileを使うと、連続して取り出すことができます。下記は、f.readと同じ内容です。
      n = ""
      while line = f.gets do
      n += line
      end
    • f.close でファイルの取り扱いを完了します。これをつけないと、ファイルに取っ手がついたままになり、ファイルを読み込み終わる前に、他の動作を並行してやってしまうかもしれません
  4. ファイルへの文章の書き込み: テキストファイル count.txt に、n を上書きして書き込むには
    f = File.open("count.txt","w")
    f.print n
    f.close
    
  5. 数字と文字列は区別されます。2 は数字扱いですが、"で囲った "2" は文字列として扱われます。1 + 23になりますが、"1" + "2""12"になります。1 + "2" については、足し算が定義されていないので、例外(=エラー)が発生します。
  6. 整数と文字列を相互に変換することができます。nを整数とするとき、n.to_sは文字列になります。sを文字列とするとき、s.to_iは整数になります。"3".to_iは整数の3"あ".to_iは整数の0になります。数字以外の文字をムリ繰り整数化すると、みんな0になります。

北大教育用サーバーを使う場合の注意

⇒ 答え

Solution

おそらく、最もシンプルな答えは、数字だけ表示させることにして、

#!/usr/local/bin/ruby
file = "count.txt"
f = File.open(file,"r")
n = f.read
f.close
n = n.to_i + 1
f = File.open(file,"w")
f.print n
f.close
print <<EOS
Content-Disposition: filename="access_count.txt"
Content-type:        text/plain

EOS
print n

数字だけでは物足りないという場合、文章をつけることもできます。

#!/usr/local/bin/ruby -Ks
file = "count.txt"
f = File.open(file,"r")
n = f.read
f.close
n = n.to_i + 1
f = File.open(file,"w")
f.print n
f.close
print <<EOS
Content-Disposition: filename="you_are_happy_#{ n }th_visitor.txt"
Content-type:        text/plain

あなたは#{ n }人目の訪問者です!
EOS

最初に数字のファイルが無くても、begin 〜 rescue 〜 end の構文で、例外(=エラー)の発生による中断を回避することができます。 ⇒ begin

#!/usr/local/bin/ruby -Ks
file = "count.txt"
begin
  f = File.open(file,"r")
  n = f.read
  f.close
rescue
  n = 0
end
n = n.to_i + 1
f = File.open(file,"w")
f.print n
f.close
print <<EOS
Content-Disposition: filename="you_are_happy_#{ n }th_visitor.txt"
Content-type:        text/plain

あなたは#{ n }人目の訪問者です!
EOS

参考:ファイルの読み書きの記述をかなり省略して縮めることができます。

#!/usr/local/bin/ruby -Ks
file = "count.txt"
n = open(file){|f| f.read } rescue 0
Process.waitall if RUBY_VERSION.to_f >= 1.7
n = n.to_i + 1
open(file,"w"){|f| f.print n } rescue 1
print <<EOS
Content-Disposition: filename="you_are_happy_#{ n }th_visitor.txt"
Content-type:        text/plain

あなたは#{ n }人目の訪問者です!
EOS

⇒ 次の問題に進む

以上です。

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