アクセスカウンタの表示を整えてみた。気軽にtableタグのalign属性をしたら表示がエライことに。なんか結構スタイルシートが複雑なので迂闊にいじれんなこりゃぁ。
微調整してたらカウンタ数もえらいことに⊂⌒~⊃。Д。)⊃
ところでアクセスカウンタのファイルのロック部分が高校の時のままだったのでコレにも手を加えてみた。...んですが微妙にはまってしまい時間食ったのでメモ。
以下、修正前:高校時のオレが書いてたソース(一部抜粋
1 open(DATA,"<$datefile");
2 データの読みとり処理
3 close(DATA);
(略)
4 open(DATA,">$datefile");
5 flock(DATA,2);
6 データの書き込み処理
7 flock(DATA,8);
8 close(DATA);
WEB関係の情報ページで有名なとほほさんのこちらのページにも書いてあるように、これだと2箇所間違いがあります。
1.closeすれば自動的にロック解除されるのでflock(DATA,8);は不要。
2.open(DATA,">$datefile");とすると一回ファイルの内容がふっとぶので4~5の間に他の誰かが1のステップを実行するとファイルが壊れる。
そんなわけでとほほさんのページではopen(DATA, "+< $datefile");みたいな感じで読み書き両用モードにすればいいとあります。なので実際にこんな感じで実装!!がなんか動きがおかしい⊂⌒~⊃。Д。)⊃ Whyィィィ?
...よく考えたら確かに簡単なカウンタはこれでokなんだけど、ココのblogみたく人があんまりこなくてしかも日付別にしたいとかっていう場合、桁数が減ってしまう場合もあるわけですな。例えばデータファイルに【アクセス総数,今日のアクセス数,昨日のアクセス数,日付データ】という1行のcsv形式で保存していたとしよう(というかココのアクセスカウンターの仕様がこんな感じだったりします)
【ヤバイ例】
1000,100,103,2004-03-17(3月17日は100アクセス達成
↓(次の日、やっぱり100には届きませんでした)
1093,93,100,2004-03-187(3月187日?
んまぁこんな感じで桁数が減ってしまった場合、単純に読み書き両用でやってるとファイルのハジッコにゴミが残ってしまうわけです。そこでこのゴミをtruncate関数を使って取り除きます。
以下書き込む際の実装例
seek(DATA, 0, 0);
print DATA "データ";
truncate(DATA, tell(DATA));
close(DATA);
んむ、これでOK。(*´Д`)b
書き込む前にtruncate(DATA, 0);で一回ファイルの中身を真っ白にしてもよさげですが参考リンクを見た感じtruncate(DATA, tell(DATA));でデータを書き込んだ後にゴミを取り除いたほうが動作がはやいっぽい。