«前の日記(2002-02-10(Sun)) 最新 次の日記(2002-02-12(Tue))» 編集

これ日記なん?


2002-02-11(Mon) [長年日記]

_ コードを

かけばどうにかなるらしい。でも、tdiaryのデータってMarshalですよね?ということは、
  • プログラミングRubyによれば、Marshalって元のクラスの定義がわからないとロードできないらしい。あれ?網道編だったっけ?
  • rubyのバージョンが違ったらバイナリフォーマットが違う可能性?ローカルで生成しても通用しなかったりして...。
とりあえず、コードを覗いてみることにしよう。でも、tDiaryハッカーがささっと作ってくれそうな気もする...。甘いか。

_ 自力解決

とりあえずやってみた。もし試される奇特な方がいたら自己責任でよろしこ。添削希望です。もっとエレガントなやつ。
#!/usr/local/bin/ruby -KE
#----------------------------------------------------------------------
require 'pp'
require '/home/kog/tmp/tdiary-1.3.3/tdiary.rb'
 
def transaction( filename, diaries = {}, mode = 'r' )
  begin
    PStore::new( filename ).transaction do |db|
      begin
        case mode
        when 'r'
          diaries.update( db['diary'] )
        when 'w'
         db['diary'] = diaries
        end
      rescue PStore::Error
      end
    end
  end
  return diaries
end
 
bkup = {}
add = {}
merge = {}
bkup = transaction('/home/kog/200202', bkup)
add = transaction('/home/kog/200202.add', add)
add.sort.each do |key, data|
  unless bkup.has_key?(key)
    bkup[key] = data
  end
end
merge = transaction('/home/kog/merge', bkup, 'w')
pp merge.sort
バックアップファイルが 200202, 追加したいのが2000202.add, マージ結果がmergeです。unless.has_keyでチェックしてるのは追加したいファイルには本文だけ手動リストアしたので無視したかったから。ホントに単純にマージするだけなら、eachする必要もなくって、
merge = {}
merge = transaction('/home/kog/200202', merge)
merge = transaction('/home/kog/200202.add', merge)
merge = transaction('/home/kog/merge', merge, 'w')
でいいのではないかと。あ、CGIじゃないすよ、これ。ふつーのrubyスクリプトです。FreeBSD4.5-stable, ruby 1.6.5 (2001-09-19) [i386-freebsd4]で実行しました。

_ デュアルディスプレイ

にしてみたのだ。G450DualHeadなので。いやー結構広くて快適ですなあ。これで1枚が1024*768でも広さは2倍だし。