起動したらファイルが文字通り無くなっているのだ。どうしてこうなるのかさっぱり分からぬ。HDDか、エディタ(xyzzy)周りか、Dropboxか、それともOS(WindowsXP)の何かが壊れたか…。
たまたまtmpファイルが残っていたので、(限定的ながら)メモの内容はサルベージできた。
一回一回のメモだけ見れば大したことは書いてないのだが、後から見返したときに貴重な資料になったりする。また電話や口頭だけで交わされた連絡や問い合わせの内容もちらっとメモっておくだけで、後から思い出すのに役立ったりする。
読み返すと自分の変遷(成長、もしくは退化…)も分かって興味深かったりする。それはそれで面白い。
二日ほど立て続けに同じ現象が起こったので流石に看過できぬ。仕事で使うツール(DBや資料など)は別途サーバに保存しているのでそれほど心配してないのだが、Changelogメモはあくまでパーソナルなものなので自衛するしかあるまい。
ぶっちゃけ業績はさっぱりで、おかげさまで未だに冷や飯食らい。PCなんざXPのサポート期限ぎりぎりまで更新されまい。下手するとサポート切れても使う可能性がある。いや、中小零細企業の実状なんて意外とそんなモンなんですよ。
悲しいことですが(´・ω・`)
---
思い立ったが吉日。
Python3でサクッと…言うほどスマートには行かなかったけど…スクリプトを書いてみた。
一応機能としては、
・現在書き込みしているChangelogメモファイルを、指定したバックアップ用フォルダへまるっとコピペする
・一定時間毎に動作する
・何かあったら適当にダイアログを出して止まる
といったところ。非常にシンプルであるが、この程度のユーティリティにあまり便利機能をつけてもあまり意味が無い気がするし、まずは一刻も早く動くものが必要だ。
あとはプログラムの中身を見てもらえれば分かるが、Changelogメモファイルファイルの命名規則と、ディレクトリ構成は(大体)こんな感じ。
・Changelogメモファイル名: その年の最初の稼働日(yymmdd、西暦は下二桁のみ)にハイフン(-)をつけ、拡張子として".clm"を付ける
・Changelogメモを置くディレクトリは"CLM"
・バックアップファイルは、"C:\home\bkup"フォルダに格納する
そんなこんなで、形になった。Windows向けに書いたけど、ちょっと直せばLinuxでも使えると思う。Macは(゚⊿゚)シラネ
# 現在(今年)のCLMをバックアップする
# このスクリプトバックアップ対象ファイルはと同じディレクトリに置くこと
# 引数として、バックアップ間隔を秒単位で指定する
# このスクリプトバックアップ対象ファイルはと同じディレクトリに置くこと
# 引数として、バックアップ間隔を秒単位で指定する
import os, sys, re, time
import shutil
import tkinter as tk
import tkinter.messagebox as tkmbx
from traceback import format_exc
BKUP_DIR = "C:\\home\\bkup"
INTENDED_FILE = ["{}01\d\d[-].clm$".format(time.strftime("%y"))] # バックアップ対象ファイルは複数設定可能
def error_dialog(msg):
ed = tk.Tk()
ed.withdraw()
tkmbx.showinfo("ERROR", "backup process failed.\n\nErr: {}".format(msg))
def init():
match_file = []
if not "CLM" in os.getcwd(): # カレントディレクトリが"CLM"でなければエラー
error_dialog("wrong directry.")
sys.exit(1)
for ifile in INTENDED_FILE:
for f in (f for f in os.listdir() if re.match(ifile, f)):
match_file.append(f)
if len(match_file) == 0: # ファイルが見つからなければエラー
error_dialog("not exist.")
sys.exit(1)
return match_file
def backup(match_file):
for src in match_file:
shutil.copy2(os.path.join('.', src), BKUP_DIR) # バックアップディレクトリへコピー
if __name__ == '__main__':
try:
if len(sys.argv) <= 1: # 引数が無いとエラーを吐いて終了する
error_dialog("This program require one argument.")
sys.exit(1)
else:
if not sys.argv[1].isdigit(): # 引数は数字でなければならない
error_dialog("Invalid argument.")
sys.exit(1)
else:
interval = float(sys.argv[1])
match_file = init()
while True:
time.sleep(interval) # 引数で設定された秒数スリープする
backup(match_file)
except:
error_dialog(format_exc()) # 何かしらエラーや例外が起こったら内容を吐いて終了
ひとまずバックアップ対象のファイル名は、Changelogメモファイルの命名規則に則ったファイルを正規表現で自動的に探せるようにした。ファイル名を直接書いてもいいけど、毎年新しいファイルに変えるので書き換えるのが面倒だ。
バックアップ対象を記したINTENDED_FILEはリストになっているので複数指定できるようになっている。
面倒だったのであーもすーも無くひたすらshutil.copy2を実行するようにしたが、タイムスタンプを見て更新されている時だけコピーするような形にした方がスマートだったか。そのうち手直しするつもりではある。これはこれでいいっちゃいいんだけど。
定期実行の部分はWindowsに標準装備されているタスクスケジューラを用いようと思っていたのだが、このスクリプトを指定すると「パスが見つからないよ~ん」と言われて設定できなかった。これまた訳ワカメ。
ちょうどtimeモジュールをインポートしてるので、そやつのsleep関数を用いて一定間隔でバックアップを実行するようにした。
てっきりosモジュールにファイルをコピーする関数があるのかと思いきや、そんなものは無い。そういう場合はShutilモジュールをインポートせねばならぬ。shutilモジュールも真面目に使った事が無かったのでちょっと手間取った(;^ω^)
こいつは拡張子をpywとする。多分Pythonのインストール時に拡張子pywはpythonwに関連付けられると思う。もしされてなければ今すぐしとけ(偉そう)。
"python"で実行すると余計なDOS窓風ウィンドウが一瞬開くのだが、pythonwは開かない。とくにGUIの必要が無いバックグラウンドで働くスクリプトならpythonwを使った方がスマートだ(そんな気がする)。
ただ、引数として秒数を指定してやらねばならない。アイコンをダブルクリックして起動させる方法をとると引数が入ってないのでエラーとなる(そうなるようにしたのは自分ですがね)。
しかし心配ご無用。そういう場合はショートカットを一旦作り、プロパティで引数を指定してやればいい。
このショートカットをダブルクリックすればちゃんと起動する。当然画面上には何も起こらない。PCをシャットダウンするまで指定した秒数毎にバックアップをし続ける。健気じゃのう。
---
エラーに関しては、tkinterのメッセージボックスで表示させるようにした。
オリジナルのエラーの他、例外を捕捉してbacktraceをまるっと表示させられるように細工した。
(あえて)コマンドラインから起動し、わざとC-cでキーボード割り込みを起こしてみたら、果たせるかな思惑通りコマンドラインに放り出されるはずのtracebackがメッセージボックスに印字されて出てきた。
メッセージボックスのタイトルが”ERROR"というのはいささか分かりにくいな。せめて"CLM BACKUP ERROR"とでもしとけば良かった。後でやっとこう。
---
こいつはバックアップ間隔を引数で与えてやらなければならない。しかしコマンドラインからいちいち起動するのは面倒くさい。それにどうせなら自動起動させたい。
てな訳でもう一工夫。
と言っても大したことはなく、スクリプトのショートカットを作ればいい。
作ったらそのプロパティを開き、「リンク先」欄でスクリプトが指定してある後ろにスペースで区切って引数を書き込む。ちょうどDOS窓で実行するときに引数を指定するような感覚だ。
するとスクリプトをダブルクリックすればちゃんとエラーを吐かずに動き出してくれた。
---
最後にこいつをOSのスタートアップに登録して自動的に動き出すようにした。これでPCが稼動してる間中、勝手にバックアップしてくれて安心ライフが送れるようになったという訳だ。
多分来年の最初の稼働日にエラーダイアログが出ることが予想されるが、まあその時は新しくその年のChangelogメモファイルを作れば良いだけさ。
下手するとバックアップスクリプトが動いていることすら忘れてしまうかもしれないwwwww
縁の下の力持ちとはそういうものなんさ。
リアル世界でも電脳世界でも、縁の下の力持ちってやつあ有難いものでござんす。
追記)スクリプト、改良しました。 →こちらです。

"定期的にファイルをバックアップするスクリプトを作ってみた @Python3"へのコメントを書く