Ruby (5) カウンターの改良

懸案だった、Ruby のカウンターを改良しました。Ruby で作ったカウンターは合計6か所で運用していたのですが、リセットされたのはおそらく1つだけだったのではないかと思います。まずは新たな版をこちらに1つ追加しました。

前回、ログも残したいと書いたのですが、とりあえず io.flock という機能を使って、多重に開けないように対策しました。前回公開したものを除き、それ以外のカウンターは新しい版に順次入れ替える予定です。

前回、Ruby カウンターを書いたのが、2016年。Aptana Studio 3 で開発し、Apache Server でテストしていました。今使っている PC にはどちらもインストールされていません。今は Aptana Studio 3 より、Visual Studio Code (VSCode) のほうが使いやすいかもしれないと思い、今回は VSCode で開発しました。VSCode からもローカルサーバーを起動する方法があるのですが、CGI で Ruby を起動してブラウザと Ajax 通信するような拡張機能を見つけられなかったので、テストは実環境で行いました。

CGI ファイル(今回は counter02.rb)のモードを実行可能にする必要があるのですが、前回どうやったのか覚えていません。chmod というコマンドを使ったような気もするのですが、Windows の FTP コマンドには chmod がないとのことで、調べた結果、ファイル エクスプローラーのパス入力に FTP サイトのアドレスを入力し、アップロードしたファイルのプロパティで実行可能にするという方法を取りました。

関連項目

Ruby (4) カウンター問題の原因と対策

前回、Ruby で作成したアクセスカウンターがリセットしてしまった件について書きました。その後、ソースを読んで原因について考えました。カウンタは count1.dat などのテキストファイルに格納されていて、読み込む際にエラーが起きるとファイルの内容は無視して変数 count に必ず1を設定しています。そのためオープン/読み込み/クローズのいずれかでエラーが起きリセットしてしまっている可能性が非常に高いと思います。

おそらく複数のサイトから同時にアクセスがあった場合にこのようなことが起きると推測できます。時間を置いて再度チャレンジすればうまくいく可能性が上がるでしょう。

対策としては、上記のようにリトライしてみるということと、同様の問題が起きたときのためにエラーログを残すことの両方を実現する予定です。

リトライでは乱数を使用して100ms単位でスリープしたのち再度読み込むようにしたいと思います。

エラーログについては、rescue => e とすると e にエラーの内容を獲得できるので、これと日時の情報をログファイルに書き込むようにしたいと思います。

それから、カウンタ用ファイルへの書き込みの際はファイルのロックもエラー処理も行っていませんでしたが、こちらも読み込みの際と同様の処理を追加したいと思います。

(つづく)

関連項目

Ruby (3) カウンターがリセット!

3年ぶりの Ruby に関する投稿になります。3年前に作成したアクセスカウンターが順調に動いていた(と思う)のですが、この度、その一つがリセットしていることに気づきました。5月10日現在で 3146 までいっていたはずが、本日 27 に戻っていたのです。

Counter

不正アクセス?とも一瞬思いましたが、大抵そんなはずはなく、カウンターにそもそも不具合があった可能性が高いのではと考えています。カウンターの値はサーバーにあるテキストファイルに保存しているので、何らかの理由でそれが読めず、0 をカウントアップして書き込んでしまったので、リセットしたのではないかと推測できます。

ただ確証はありません。対策としては、同じ事態が起きたときに状況を把握できるようなログを残すこと、同じ問題を起こしにくくすることが挙げられます。

もうすっかり Ruby を忘れてしまっているので、思い出しながら直していこうと思います。ちょっと時間はかかるかもしれません。

(つづく)

関連項目