ちょっと先の未来クイズ第1問

現在何人がHPを見てますよ

ってプログラムがあるじゃないですかあれはどのように動いているのでしょうか?
調べても完成品をダウンロードしてねっと言うページはいくつか見かけたのですが、ソースの参考例が見つからなくて困っています

どういった原理で動いているのでしょうか?

A 回答 (2件)

その問題を聞いて自分が考えたのは、速さ = 距離 / 時間 でした。


言い換えると、瞬間アクセス数 = 一定時間のアクセス数 / 時間 とやっているのではないかと推測しました。

実際に検索してみると、
http://www.ziyu.net/counter.htmだと、"今現在(正確には過去90秒間)"と書いていますので、自分の推測は正しいことが裏付けられました。

また、一定時間に一定数しか処理を受け付けないようなCGIはファイルにアクセスがあったときのタイムスタンプを書いておき、それを比べることで行います。たとえば、こんな手順です。
1. タイムスタンプを入れたファイルを読み書きロックした状態で開く
2. 一定時間に入っているタイムスタンプだけをタイムスタンプの配列に取り込む
3. 配列の長さが一定数を超えるなら、一定数 - 1に変更
4. 現在の時刻のタイムスタンプを配列の先頭に追加
5. ファイルの先頭にseekして、truncateした上で、配列をファイルに書き戻し、ファイルを閉じる
6. 3で配列の長さが一定数を超えていたら、処理の受け入れを拒否、そうでない場合は許可

あとはこの組み合わせですね。
上記の3の処理を省き、6の処理で配列の長さを返すようにすれば、一定時間に何人アクセスしているかがわかります。つまり、一定時間以内にアクセスした人のタイムスタンプを書いておくファイルを作り、それをCGIが実行されるたびに新しくしつつ、ファイルに入っているタイムスタンプの数を表示するということです。この一定の時間として1分など適当な時間を使えば、「現在 (というか過去1分以内だけど) ○人がアクセスしています」というのはすぐできると思います。

質問をされている方は以前C言語でCGIを作りたいという話をされていたので一応書きますが、
ファイルのロックはシステムコールの呼び出しが必要になりますし、現時刻の取得についてもマイクロ秒単位の時刻がほしいならシステムコールの呼び出しになりますので、書き方はOSによって異なります。
Unixだとそれぞれ、flock、gettimeofday (あるいは秒単位ならtime)について使い方を調べておくと良いでしょう。

まあ、がんばって。

この回答への補足

1さんの作り方が本当だとしたら私が作りたがっていたプログラムとはちょっと違うようです
現在ログインしている人数≠現在ページを見ている人数ってわけではないので寸ね。
同様のプログラムだと思ってたのですが...

しかしこのプログラムはプログラムで面白いですね。

1さんのプログラムは時間単位のアクセスカウンターの製造法だと思います。
HPの防衛上必ず作らなきゃいけないプログラムですね

手順1のタイムスタンプはどうやってスタンプを押せるんだという原理が分かりません
しかしいろいろ考えてみます。

ありがとうございました。

追伸 flockってPEALの関数だと思ったらCでも使えるんですね

補足日時:2012/12/19 04:47
    • good
    • 0
この回答へのお礼

あーーー思いついた

ページを見るだけで取得できる情報あった
IPアドレスとリモートホスト

これを使えばスタンプできるじゃんか
問題はスタンプを消す方法

1さんのやり方だと単位時間当たりに再書き込みだけど
ページを見ていないならスタンプからIPアドレスとか消すことができればいけるね

チャットにログインしていればチャットメンバーの名前をかくのもいけるはず
作りたいプログラムの3っつのヒントをいただきありがとうございました

お礼日時:2012/12/19 07:16

その「完成品をダウンロード」したら、ソースコードも付いてないですか?


というか、現在配布されているもののほとんどは、PHP,Perl等のスクリプト言語で「完成品=ソースコード」ですが。

C言語でCGIやっている人は少ないので、「C言語のソースコード」を見つけて解決しようとは思わないことです。

この回答への補足

完成品のソースコードはC言語ですら解読が難しいのです
それっぽいソースコードは見つけられる事もあるのですがよく見てみると全然別の目的で書かれたプログラムだって事があってなかなか難しいです。

特定の目的のみかかれたものならまだ解読できたのですけどね
それならPealでかかれても多少解読できなくはないのですがそれでも難しくて...

補足日時:2012/12/19 04:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!