カウンタ復旧
以前から壊れていた日記のカウンタを復旧させた。 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 の表示が綺麗になって(自己)満足。
※ 繰り返しますが、真似するときは慎重にお願いします。壊れても責任はもてません。