/ / 最新

swk's log - mhc-unroll

2005-07-18

* mhc-unroll [tech][f901is][mhc]

f901is のスケジューラに Outlook から転送すると,繰り返しスケジュールの終了指定が消えてしまって困っていたのだが [2005-07-10-1],なんとか対策を講じてみた.

当初は,

mhc2ol をいじって単発スケジュールに展開するのが一番楽なのかな.めんどくさそう.ていうか ruby わからん.

とか考えていたのだが,やはり ruby 分からなさすぎなので,以下のように計画変更.

1. スケジュールデータベースをまるごとコピーして (rsync)
2. このコピーされたデータベースをいじって繰り返しスケジュールを複数の単発スケジュールに展開し
3. それを mhc2ol に食わせる

これなら ruby 知らなくてよし.

実は東京からの帰りの新幹線の中で書き上げられるだろうとたかをくくっていたのだが,意外と手間取った.むう.

というわけで展開スクリプト mhc-unroll.pl はこんな感じ. (なんか forbidden になるので suffix を .txt にしてます)

% mhc-unroll.pl -s /home/hoge/Mail/schedule/ -d /home/hoge/Mail/schedule_unroll/

とかして,schedule/ から schedule_unroll/ に展開される.一応 .ol_sync は保存するようにしてあるけど,これでいいのかはよく分からない.

とりあえず自分が必要な機能しか作ってないのでかなり不完全.具体的には,

  • X-SC-Cond は,「曜日」と「何週目か」しか実装してない
  • 「何週目か」のうち,last は実装してない
  • X-SC-*** ヘッダが複数行に渡っている場合を考慮していない

あたりがちょっと問題ありそう.まあ必要になったら直そうかなと.


展開のロジックは,MHC 本体がスケジュールを表示する際とは違ったやり方になっている.MHC では,1 ヵ月とかの一定の短い期間の展開ができればよいので,期間内の日を 1 日ずつ iteration しながら,各スケジュールの日付条件を評価していく.この方式は汎用性は極めて高いが,展開する期間が長い場合には無駄が多そうな気がしたので,各スケジュールについて期間内の月を 1 月ずつ iteration しながら,該当する日付をリストアップしていくことにした.実際にどっちが速いのかは比べてないので分からない.

実行時間は,MHC 母艦である UNIX 機 (suite) だと数秒 (もちろんデータ量によるけど).ところが,mhc2ol を動かす Windows 機 (caprice) 上の Cygwin だと 60 秒くらいかかる (rsync も含む).ぐはー.UNIX 機のディスクを SMB/CIFS 経由でアクセスするのが死ぬほど遅いらしい.ちなみに NAS (etude) にデータを置いて試しても似たようなものだったので, SMB/CIFS サーバ側のせいではなさそう.

で,どうも SMB/CIFS 経由の write が特に遅いようだったので,UNIX 機を展開元,Windows 機を展開先として mhc-unroll を走らせることにしたら, 60 秒が 15 秒に縮んだ.ついでにこのおかげで mhc2ol 自体の実行時間も,今まで 40 秒くらいかかってたのが 20 秒くらいに縮んだ (mhc2ol も Cygwin 上で実行している).

んー,Cygwin に頼り過ぎるのも考えものなのかな.


さてこれのテスト中に「mhc2ol はデフォルトでは,現在の 3 ヶ月前から 3 ヶ月後までの範囲のデータしか outlook に export しない」という事実を初めて知った.というかそれを知らずに,自分のコードのバグだと思って無駄に悩んだ.

mhc2ol の引数に 20050101-20051231 などと指定すると,その範囲が export されるようになる.絶対日時じゃ不便でしかたないので,こんな感じにするのがよい.

% mhc2ol -r /home/hoge/schedule_unrolled/ -i -H -m `date +%Y%m%d --date "3 months ago"`-`date +%Y%m%d --date "2 year"`'

ここの真似です.べーんり.

ついでにメモ.FreeBSD の /bin/date には --date オプションはなくて,代わりに -v を使う.

% date -v-3m +%Y%m%d
% date -v+2y +%Y%m%d

なお,恐ろしいことに +%Y%m%d とかの指定の後ろに -v が (というか他のオプションも全部) 来てはいけないという仕様になっているので注意.要するに +%Y%m%d 部はオプションじゃないってことなんだな.誰だこんな仕様にしたやつは.

最終更新時間: 2009-01-04 15:31


Shingo W. Kagami - swk(at)kagami.org