アクセスカウンタ表示プラグイン
counter.rb
機能
いわゆる「アクセスカウンタ」ですがtDiaryに特化してあり機能も豊富です。以下のような機能があります。
- アクセス数を「全て」「今日」「昨日」の3種類に分けて表示ができる それぞれ別々に表示できます。もちろん表示しなくてもOK。
- 訪問間隔指定 ある訪問者が一定期間に再度訪れたとしても、カウントアップしません。一定期間後にアクセスがあった場合には再度カウントアップされます(Cookie使用)。
- GET/POSTリクエストのみのカウント アンテナからのHEADリクエストはカウントアップしません。
- Cookie機能のない同一クライアントからの連続アクセスはカウントアップしない 短時間での連続アクセスでCookie機能を持たないツール(一括ダウンロードツール等)からのアクセスであってもカウントアップしません。
- 初期値の指定が可能(「全て」のみ) 「全て」の場合のみ初期値を指定可能です。他のアクセスカウンタから乗り換える場合等に使用できます。
- アクセスカウンタ用の数字に画像・テキスト(CSS使用)のどちらも使うことができる 通常、アクセスカウンタというと画像がメインですが、本プラグインでは画像は当然のことながら、テキスト+CSSのみを出力することもできます。テキスト+CSSの方は画像に比べ転送量が圧倒的に少ないですし、また、上手に使えば画像以上にクールなカウンタを作ることもできると思います。
- 一日のアクセス数をログとしてファイルに残す
- カウントアップ制限 指定したUser-Agent、Remote-Addrをカウントアップの対象外として指定できます。なお、デフォルトでtDiaryプラグインのtlinkからのアクセスはカウントアップしないようになっています。
- キリ番機能 「全て」「今日」のカウントがキリ番の際に、いつもの日記とは違う、何か特別なメッセージを表示することができます。もちろん、カウンタ機能を一切使わずにキリ番機能のみを使うこともできます。
- データのバックアップ/自動リストア機能 カウンタデータファイルを1週間分バックアップし、データファイルが壊れた場合でも1つ前に自動で復旧します。
- 各種の設定をtDiaryの設定ファイルから指定できます。自分自身でtdiary.confを記述する必要がありません。
使う場所
ヘッダ、もしくはフッタ
利用方法
最初に、アクセスカウンタ設定画面から各種の設定を行ってください。 以下はヘッダやフッタなどで使用するプラグインです。
counter(figure = 0, filetype = "", init_num = 0)-
今までの全ての訪問者数を表示する
- figure: 表示桁数。表示桁数にカウンタ値が満たない場合は前0をつける。表示桁数からカウンタ値が溢れた場合はカウンタ値はそのまま表示される。未指定時は0桁、つまり前0なし。
- filetype: ファイル種別(拡張子)。jpg, gif, png等。未指定時は、""(画像は使わない、CSSで外見を変える)。 画像ファイルを使う場合は、数字.拡張子というファイル(例えば0.png, 1.png ... 9.png)をテーマディレクトリに置いてください。
- init_num: 初期値。未指定時は0。 この引数は1.1.0までとの互換性を維持するために残してありますが、非推奨です。そのかわりに@options["counter.init_num"]を使ってください。
counter_today(figure = 0, filetype = "")counter_yesterday(figure = 0, filetype = "")-
本日、昨日の訪問者数を表示する
- figure: 表示桁数。表示桁数にカウンタ値が満たない場合は前0をつける。表示桁数からカウンタ値が溢れた場合はカウンタ値はそのまま表示される。未指定時は0桁、つまり前0なし。
- filetype: ファイル種別(拡張子)。jpg, gif, png等。未指定時は、""(画像は使わない、CSSで外見を変える)。
例: <%= counter %> <%= counter 3, "png" %> <%= counter 3, "jpg", 30 %> <%= counter_today 5 %> <%= counter_yesterday 0, "png" %> 結果: <span class="counter"><span class="counter-0"><span class="counter-3"><span class="counter-num-1">1</span></span><span class="counter-4"><span class="counter-num-7">7</span></span></span> <span class="counter"><img src="theme/0.png" alt="0" /><img src="theme/1.png" alt="1" /><img src="theme/7.png" alt="7" /></span> <span class="counter"><img src="theme/1.jpg" alt="1" /><img src="theme/4.jpg" alt="4" /><img src="theme/7.jpg" alt="7" /></span> <span class="counter-today"><span class="counter-0"><span class="counter-num-0">0</span></span><span class="counter-1"><span class="counter-num-0">0</span></span><span class="counter-2"><span class="counter-num-0">0</span></span><span class="counter-3"><span class="counter-num-1">1</span></span><span class="counter-4"><span class="counter-num-7">7</span></span></span> <span class="counter-yesterday"><img src="theme/1.png" alt="1" /><img src="theme/7.png" alt="7" /></span>
kiriban- キリ番機能はアクセス数が一定の数字になった時に日記上にメッセージを表示する機能です。このプラグインを呼び出したところに、アクセスカウンタの設定画面から設定したメッセージを表示します。設定画面では「全て」「今日」の2種類のカウンタメッセージを指定できます。
例: <%= kiriban %>
kiriban?kiriban_today?- それぞれ「全て」「今日」のキリ番の場合にtrueを返す。kiriban機能をさらに細かく自分自身でプログラミングしたい場合に利用してください。ほとんどの場合は使用する必要がありません。
スタイルシート(CSS)について
アクセスカウンタは画像を使ったものが多いですが、本プラグインではスタイルシートでの使用も考慮しています。これを使うことで、画像ファイルを新たに用意する必要がありません。かなりフレキシブルに指定できるようになっていますが、そのかわりちょっと複雑です。
- counter: 対象文字列全体(全て)
- counter-today: 対象文字列全体(今日)
- counter-yesterday: 対象文字列全体(昨日)
- counter-0, ... : 1桁分(左から)
- counter-num-0, ... 9: 数字
以下に、CSSの簡単な例を示します。
span.counter{
margin: 10pt;
padding:5pt;
border: 1pt outset red;
}
span.counter-today{
margin: 10pt;
border: 1pt inset white;
}
span.counter-yesterday{
margin: 10pt;
padding:5pt;
border: 2pt dotted yellow;
}
span.counter-0, span.counter-1, span.counter-2, span.counter-3, span.counter-4{
margin: 0pt;
padding: 1pt 2pt 1pt 2pt;
border: 1pt outset gray;
}
span.counter-0{ background-color: #ffffe6; }
span.counter-1{ background-color: #ffe6e6; }
span.counter-2{ background-color: #e6ffff; }
span.counter-3{ background-color: #e6e6ff; }
span.counter-4{ background-color: #e6ffe6; }
span.counter-num-0{ color: #c8a040; }
span.counter-num-1{ color: #c07038; }
span.counter-num-2{ color: #a04848; }
span.counter-num-3{ color: #8f4259; }
span.counter-num-4{ color: #504068; }
span.counter-num-5{ color: #385070; }
span.counter-num-6{ color: #407088; }
span.counter-num-7{ color: #3b816e; }
span.counter-num-8{ color: #488860; }
span.counter-num-9{ color: #dd0000; }
画像のファイル名を変えたい場合
counter.rbはデフォルトでは、0.jpg, 1.jpg ... 9.jpg(filetype = "jpg"の場合)のように、数字.拡張子という形でファイル名が生成されますが、以下のようにするとファイル名の規則自体を変更することができます。
counter{|num| "hoge_" + num + ".jpg"}
counter(3){|num| "fuga_" + num + ".png"}
その他の情報
訪問間隔の指定について
counter.rbは、指定した期間、繰り返し訪問してくるユーザをカウントアップしないようになっています。 ある訪問者は、最初にアクセスがあってから6時間はカウントアップされず、6時間を超えるとまた新しい訪問者としてカウントアップされます。
ちなみに、ユーザの使用するブラウザがCookieを使用することができない(Cookieを使わない指定にしている)場合は、日記をリロードするたびにカウントアップしてしまいます。
もう一つ、「カウントアップしない連続アクセス間隔の指定」というものもあります。 こちらは、Cookieを使用することができないクライアント向けの指定です。
どちらも似ている機能ですが微妙に違います。ここで、その違いを(私自身が忘れないためにも(^^;))整理しておきたいと思います。
#どちらも設定画面から指定できます。
- 訪問間隔(@options["counter.timer"])
-
- 提供機能
- 最初のアクセスがあってから、ある期間を超えたら再度カウントアップされる(その間のアクセスはカウントアップされない)
- Cookieを使用
- 長所
- クライアント(ブラウザ)を特定できる
- サーバ側で情報を保持しない
- 短所
- Cookieを使用することのできない(あるいはCookie機能をOFFにしている)クライアントからのアクセスを毎回カウントしてしまう 実際、いくつかの一括ダウンロードツールの中にはCookieを使用しないものがあるようです。一括ダウンロードツールでアクセスされると、そのアクセス数だけカウントアップしてしまいます。
- 提供機能
- カウントアップしない連続アクセス間隔(@options["counter.deny_same_src_interval"])
-
- 提供機能
- 「前回からのアクセス時間」を元にしていて、指定した時間より短い間隔で繰り返しアクセスがあってもカウントしない(場合によっては全くカウントしなくなる)
- tDiary側で情報を保持(キーはUser-Agent, Remote-Addrの2つから抽出したhash値)
- 長所
- クライアントを選ばない Cookie使用することのできない(あるいはCookie機能をOFFにしている)クライアントからのアクセスも対象にできます。
- 短所
- 実際は違うクライアントからのアクセスなのに同じクライアントと判断してカウントしない場合がある
- User-Agent, Remote-Addrの2つをキーとしているため、Proxy(あるいはNAT)経由でアクセスしてきた場合に実際は違うクライアントなのに同じクライアントと判断してカウントしなくなってしまいます。例えば、ある企業から二人がアクセスしてきたとしてもそれを1アクセスと数えてしまいます。
- 情報をサーバ側に保持するため、アクセス数が多いとサーバに負荷がかかる。
- 実際は違うクライアントからのアクセスなのに同じクライアントと判断してカウントしない場合がある
- 提供機能
実装上は、Cookieが指定してあるかどうかという方が優先度が高いです。その方がより確実にクライアントを限定できるからです。 そこで、あくまでも訪問間隔(@options["counter.timer"])がメインの機能として本来のカウントアップさせたくない期間を設定し、カウントアップしない連続アクセス間隔(@options["counter.deny_same_src_interval"])はCookieを使うことのできないクライアントの連続アクセスに対応するだけと考え、短めに設定することを推奨します。
カウントアップしないユーザエージェント
設定画面から、カウントアップしないHTTP_USER_AGENTを指定できます。各項目は正規表現を使うことができます。よく知られている自動巡回ツールなどは事前に用意されていますので、ここでは追加で指定します。wgetのように日記を丸ごと取得するツールや、GETでアクセスしに来るアンテナ等を指定すると良いでしょう(HEADリクエストのものは元々カウントされませんので、ここでは指定する必要ありません)。
また、@options['bot']もカウントしません。
キリ番機能について
キリ番機能とは、アクセス数が一定の数字になった時に日記上に何らかのアクション(何らかのメッセージや画像を表示する)を起こす機能です。
設定画面では、「全て」「今日」のキリ番を指定することができます。
例えば、「全て」「今日」のキリ番メッセージをそれぞれ以下のように記述します。
「全て」のキリ番メッセージ
<div style="font-size:large;color:green;text-align:center;line-height: 1.3;"> おめでとうございます!<BR> あなたは記念すべき<%= counter %>人目のお客様です!<BR> 是非、キリ番をゲットされたことをツッコミに残してくださいね! </div>
「今日」のキリ番メッセージ
<div style="font-size:large;color:green;text-align:center;line-height: 1.3;"> あなたは本日<%= counter_today %>人目のお客様です! </div>
通常時(キリ番で無いとき)のメッセージ
こんにちわ!ようこそいらっしゃいました!
こうしておくと、「全て」でキリ番になった時は、<%= kiriban %>と記述したところに
おめでとうございます! あなたは記念すべき1000人目のお客様です! 是非、キリ番をゲットされたことをツッコミに残してくださいね!
と表示され、「今日」でキリ番になった時は、
あなたは本日10人目のお客様です!
と表示され、それ以外の通常の時は、
こんにちわ!ようこそいらっしゃいました!
と表示されます。
なお、「全て」「今日」がともにキリ番だった時は、「全て」が優先されます。
自分でキリ番プラグインを作る
上の例と同じ内容のものを自分でプラグイン化してみます。ファイル名は、kiriban.rbとしその中に以下のコードを記述します。
def kiriban2
if kiriban?
%Q[
<div style="font-size:large;color:green;text-align:center;line-height: 1.3;">
おめでとうございます!<BR>
あなたは記念すべき#{counter}人目のお客様です!<BR>
是非、キリ番をゲットされたことをツッコミに残してくださいね!
</div>
]
elsif kiriban_today?
%Q[
<div style="font-size:large;color:green;text-align:center;line-height: 1.3;">
あなたは本日#{counter_today}人目のお客様です!
</div>
]
else
%Q[
こんにちわ!ようこそいらっしゃいました!
]
end
end
次に、このファイルをpluginディレクトリに置きます。
最後に、以下のコードをtDiaryの「設定」画面のヘッダのお好みの場所に追加します。
<%= kiriban2 %>
出力結果は上の例と同じです。
キリ番機能の注意点
キリ番機能は、「キリ番時には、1ユーザが1回しか見ることができず、次にアクセスがあったらカウントアップしてしまう」という仕様にしています。
本プラグインでは、元々、一定期間の同一クライアントからのアクセスはカウントしません。したがって、そのままだと、あるタイミングで複数のユーザがキリ番をゲットしてしまうことになります。 これでは困りますので、キリ番の時のみ、次にアクセスがあったタイミングで強制的に(たとえ、一定期間の同一クライアントからのアクセスだとしても)カウントアップさせてしまいます。
こうすることで、1つのキリ番は1ユーザしかゲットできなくなります。
カウンタのデータファイル
カウンタのデータファイルは、{@data_path}/cache/counter/counter2.dat, counter2_access.datに保存されます。カウンタをクリアしたい場合などはこのファイルを削除してください。
バックアップ・リストアについて
本プラグインは1日ごとに新たなバックアップファイルを作成します。 {@data_path}/cache/counter/counter2.dat.N というファイルです。Nは曜日に該当する数字(0-6)です。したがってファイルは最大7つ作られます。 このバックアップファイルは「最新のデータファイルより1つ前の状態」になっていますので、何らかの障害でcounter2.datが壊れてしまった場合は、一番新しい日付のファイル(最後の数字が一番大きいファイルではなく、ファイルのls -lの結果が一番新しいファイルです)をcounter2.datにリネームしてあげればほぼ最新の状態に復旧できます(実際には最新-1になるのですが)。もし、そのファイルでもエラーが出る場合は、さらに1つ前のデータ...という具合に過去にさかのぼってcounter2.datにリネームしてみてください。 あるいは、このファイルはテキストファイルなので、直接内容を編集することもできます。counter.logの一番下の値(これが昨日のアクセス数になっています)を見て、counter2.dat自体を書き換えると良いでしょう。
counter2.datの書式は以下のような1行のみのシンプルなテキストファイルです。
@newestday = Date.parse('2006-01-23'); @all = 413718; @today = 98; @yesterday = 487
- @newestday: そのデータの日付
- @all: 「全て」のカウント数
- @today: 「本日」のカウント数
- @yesterday: 「昨日」のカウント数。
自動リストアについて
version1.6より、データファイルが壊れた場合は、「バックアップファイルについて」で述べたリストア作業(リネーム)を1回だけ自動で行うようになりました。
- 1つ前の状態のバックファイルをバックアップする(counter2.dat.N.bakというファイルを作る)
- 最新のデータファイルより1つ前の状態のバックアップファイルを最新のデータファイルに上書きコピーする(リストア)
- コピーしたcounter2.datがさらに壊れていた場合は、全てのカウンタ値を0にして日記の表示だけは行えるようにする
おそらくこれでほぼ手動でエラーを直す必要は無くなるはずですが、特に(3)まで行ってしまった場合はバックアップで述べたように手動でリストアしてください。
ChangeLog
- 2006-01-26 2.0に合わせて記述を変更した。
キーワード:
参照:[tDiary関係]