カウンタ復旧
2004-12-15
以前から壊れていた日記のカウンタを復旧させた。 tDiary のカウンタは、データが1週間分バックアップされるようになっているけど、気がついたときには1週間が過ぎていて戻せないようになっていたのだ。
カウンタのデータは PStore というバイナリ形式で保存されているので、手で復旧させるには少し大変だった。 以下、その手順。かなりやっつけなので、真似するときは慎重に。
- 以下のスクリプトで counter.log を正しいデータに復旧
#!/usr/bin/env ruby
all = yesterday = 0
ARGF.each do |line|
m = /^(.*) : (\d+),(\d+),(\d+)/.match(line)
date, today = m[1], m[3].to_i
all += today
puts "#{date} : #{all},#{today},#{yesterday}"
yesterday = today
end
- misc/plugin/counter.rb を適当なディレクトリにコピー
- cache/counter/counter.dat を同じディレクトリにコピー
- コピーした counter.rb を以下のように修正(元のファイルは修正しないこと)
@@ -138,8 +138,6 @@
=end
-if ["latest", "month", "day"].include?(@mode) and
- ENV['REQUEST_METHOD'] == 'GET'
require 'date'
require 'pstore'
@@ -155,6 +153,10 @@
@ignore_cookie = false
end
+ def repair(all, today, yesterday)
+ @all, @today, @yesterday = all, today, yesterday
+ end
+
def up(now, cache_path, cgi, log)
if @newestday
if now == @newestday
- 380行目以降のクラス外のメソッドもすべてコメントアウトする
- 以下の内容で repair-counter.rb を作成する
#!/usr/bin/env ruby
require 'pstore'
require 'counter'
db = PStore.new('counter.dat')
db.transaction do
db['countdata'].repair(*ARGV) if ARGV.size == 3
puts "all: #{db['countdata'].all}"
puts "today: #{db['countdata'].today}"
puts "yesterday: #{db['countdata'].yesterday}"
end
- コマンドラインで repair-counter.rb 10000 150 100 を実行(数字は戻したい値を入力。counter.log を参考に。)
- 更新された counter.dat を元の場所にコピーする。
うちの環境はこれで戻っているけど、無茶しているのは間違いない。 ともかく、tDiaryGroph-FlashStyle の表示が綺麗になって(自己)満足。
※ 繰り返しますが、真似するときは慎重にお願いします。壊れても責任はもてません。