Rubyで作る簡単なアクセスカウンタ(コマンドライン版)。

Rubyの入門が終わったので早速実践です(早!!

最初のテーマはやっぱりアクセスカウンタでしょ!簡単で応用範囲も広い!!

Apacheの設定が終わってないので、コマンドライン用でいきまっす。

プログラムの流れ
リクエストを受け取る
 ↓
ファイルを読み込む
 ↓
文字列を数値に直して1足す。
 ↓
(数値を文字列にして)ファイルを書き込む
 ↓
カウンタ表示

PerlPHPでも同じ流れです。で、早速コーディング!

counter.rb
fp = open("count.txt", "r")
count = fp.gets.to_i + 1
fp.close

fp = open("count.txt", "w")
fp.print count
fp.close

print count

count.txtを用意して、早速、実行〜

$ ruby counter.rb
1

なんだかRubyっぽくない気がするけど、最初のプログラムなのでこんなもん。ファイルロック、HTTPヘッダorSSI、多重カウント防止、アクセス解析等を付ければ立派なWebアプリに成長するでしょう(やる気無し)。Rubyにはまりそう〜。

rewindを覚えた。

rewind

counter.rb
open("count.txt", "r+") { |file|
	count = file.gets.to_i + 1
	file.rewind
	file.print count
	file.close
	
	print count
}

あ〜スッキリ。fpはファイルポインタなので、file(オブジェクト)に命名変更しました。

感想

Rubyはやっぱりオブジェクト指向Awkっぽい。PerlPHPを手本としながら、Awkオブジェクト指向に仕立てました!って感じ。こう感じるのは僕だけかなぁ・・・。そんなわけで、do〜endより{〜}の方を積極的に使っていきたいと思います(邪道?

気になったのでワンライナしてみた。

いつものプログラムの行数を計る奴。

Awk
$ find -type f -exec wc {} \; | awk '{sum += $1}; END{print sum}'

ステキ。

Ruby
$ find -type f -exec wc {} \; | ruby -ane 'BEGIN{$sum = 0}; $sum += $F[0].to_i; END{puts $sum}'

やっぱり、オブジェクト指向Awkですね。相当似てますね。ワンライナなら断然awkの方が簡単。