![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.1ベストアンサー
- 回答日時:
その問題を聞いて自分が考えたのは、速さ = 距離 / 時間 でした。
言い換えると、瞬間アクセス数 = 一定時間のアクセス数 / 時間 とやっているのではないかと推測しました。
実際に検索してみると、
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でも使えるんですね
あーーー思いついた
ページを見るだけで取得できる情報あった
IPアドレスとリモートホスト
これを使えばスタンプできるじゃんか
問題はスタンプを消す方法
1さんのやり方だと単位時間当たりに再書き込みだけど
ページを見ていないならスタンプからIPアドレスとか消すことができればいけるね
チャットにログインしていればチャットメンバーの名前をかくのもいけるはず
作りたいプログラムの3っつのヒントをいただきありがとうございました
No.2
- 回答日時:
その「完成品をダウンロード」したら、ソースコードも付いてないですか?
というか、現在配布されているもののほとんどは、PHP,Perl等のスクリプト言語で「完成品=ソースコード」ですが。
C言語でCGIやっている人は少ないので、「C言語のソースコード」を見つけて解決しようとは思わないことです。
この回答への補足
完成品のソースコードはC言語ですら解読が難しいのです
それっぽいソースコードは見つけられる事もあるのですがよく見てみると全然別の目的で書かれたプログラムだって事があってなかなか難しいです。
特定の目的のみかかれたものならまだ解読できたのですけどね
それならPealでかかれても多少解読できなくはないのですがそれでも難しくて...
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DXFファイルをVBで取り込み、図...
-
datagridviewでドラッグ操作が...
-
Excel VBAで画像解析
-
perl 特定の文字列をdatファイ...
-
ファイル入力のデータを構造体...
-
テキストファイルを後ろから読...
-
バイナリ出力
-
VBAでテキストファイルを複数開...
-
ファイルの読みこみ方法とファ...
-
VBAでテキストファイルの改行を...
-
エクセルのプロパティーでセキ...
-
ファイルのアクセス回数について
-
エクセルvbaでdocuworksprinter...
-
エクセルで複数のコメントのサ...
-
カンマ区切りのCSVファイルから...
-
エクセルのハイパーリンクがコ...
-
Excelのハイパーリンクについて...
-
Excel 相対パス
-
アクセス クエリを別のファイ...
-
VBA 最新のフォルダ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでテキストファイルの改行を...
-
DXFファイルをVBで取り込み、図...
-
バイト型のデータを16進表記で...
-
Cで2次元配列にCSVファイルを...
-
VBAでテキストファイルを複数開...
-
テキストファイルを後ろから読...
-
ファイル内の(&H0A)を(&H0D0A)...
-
RGBのバイナリデータをCImageに...
-
VBScriptの配列は、要素数を指...
-
ファイル入力のデータを構造体...
-
awk getlineをもう一度ファイル...
-
インデックスが配列の境界外で...
-
[VBS] 16進数でバイナリファイ...
-
CSVファイルによる検索の高速化
-
Mscomm を使用してバイナリでデ...
-
バイナリファイルの一部分をカ...
-
Unicodeのファイル読み込みがう...
-
グレースケール画像の画素値を得る
-
バイナリファイルでOutOfMemory...
-
ファイルをメモリに出力する方法
おすすめ情報