こんにちは。強です。
本業は農業です。
農業って機械がどんどん増えていくんです。肉体労働を機械に置き換えたいですからね。
そうすると機械を置いておく場所が足りなくなるんです。もう7年くらい前になりますが、農業用倉庫の確認申請から建築、完了申請までほぼ一人で設計施工したことがあります。※合法です。
その時は建築素人でしたが、なんとか完成させました。
で、今回もう1棟計画したいなぁとおもいまして。1棟建ててますからね。もう素人ではありません。無資格だけど。
設計はすべてjw-cadで行いました。その時はwindowsでしたが今回はlinuxになってます。
まずはwineでjw-cadの環境を整えました。
でsns的にyoutubuネタとして優秀なのでは?と思いました。でよく圧縮された設計工程をタイムラプスでみせるなんてのがあるではないですか。blenderとかcadとかphotshopとか。
でも動画を全部キャプチャしておくなんてのは無精の私には難しいなって思いました。
なら、変更履歴を全部バックアップとってあとで動画にすればよい。という結論になりました。
まず監視スクリプトを作ります。
mkdir -p ~/bin
nano ~/bin/jww-history-watch.sh
#!/usr/bin/env bash
set -u
BASE="/home/tuyomori/Dropbox/建築設計/家"
# 元ファイル名 -> 履歴保存先ディレクトリ
declare -A DEST=(
["配置図.jww"]="00_配置図"
["平面.jww"]="01_平面図"
["基礎伏図.jww"]="02_基礎伏図"
["基礎リスト.jww"]="03_基礎リスト"
["立面図.jww"]="04_立面図"
["矩計図.jww"]="05_矩計図"
)
# 履歴フォルダが無ければ作る
for dir in "${DEST[@]}"; do
mkdir -p "$BASE/$dir"
done
if ! command -v inotifywait >/dev/null 2>&1; then
echo "エラー: inotifywait がありません。"
echo "sudo apt install inotify-tools を実行してください。"
exit 1
fi
# 同じ内容を何度も保存した場合の重複防止
declare -A LAST_HASH=()
save_history() {
local filename="$1"
local src="$BASE/$filename"
local dest_dir="${DEST[$filename]:-}"
# 対応表にないJWWは無視
[[ -n "$dest_dir" ]] || return 0
[[ -f "$src" ]] || return 0
# Wine/Dropbox側の書き込み終了を少し待つ
sleep 0.15
[[ -f "$src" ]] || return 0
local hash
hash=$(sha256sum "$src" 2>/dev/null | awk '{print $1}') || return 0
# 前回と中身が同じなら保存しない
if [[ "${LAST_HASH[$filename]:-}" == "$hash" ]]; then
return 0
fi
LAST_HASH[$filename]="$hash"
local stamp host stem dst
stamp=$(date '+%Y-%m-%d_%H-%M-%S_%3N')
host=$(hostname -s)
stem="${filename%.jww}"
dst="$BASE/$dest_dir/${stamp}_${host}_${stem}.jww"
cp -p -- "$src" "$dst"
echo "履歴保存: $filename -> $dst"
}
# 「家」直下だけ監視する。
# 履歴フォルダはサブディレクトリなので監視されない。
inotifywait -m -q \
-e close_write -e moved_to \
--format '%e|%f' \
"$BASE" |
while IFS='|' read -r event filename; do
[[ "$filename" == *.jww ]] || continue
save_history "$filename"
done
保存して
chmod +x ~/bin/jww-history-watch.sh
inotifywait がまだなければ、
sudo apt install inotify-tools
次にJw_cad起動用ラッパーを作ります。
nano ~/bin/jww-launch.sh
#!/usr/bin/env bash
set -u
WATCHER="/home/tuyomori/bin/jww-history-watch.sh"
# 履歴監視開始
"$WATCHER" &
WATCH_PID=$!
cleanup() {
if kill -0 "$WATCH_PID" 2>/dev/null; then
kill "$WATCH_PID" 2>/dev/null || true
wait "$WATCH_PID" 2>/dev/null || true
fi
}
# Jw_cad終了時や異常終了時にも監視を止める
trap cleanup EXIT INT TERM
# 現在使えているJw_cad起動コマンド
env GTK_IM_MODULE=ibus \
QT_IM_MODULE=ibus \
XMODIFIERS=@im=ibus \
WINEPREFIX="/home/tuyomori/.wine" \
wine-stable C:\\\\users\\\\Public\\\\Desktop\\\\Jw_cad.lnk
実行権限
chmod +x ~/bin/jww-launch.sh
普段デスクトップのアイコンから起動してるので、
nano ~/Desktop/Jw_cad.desktop
Exec=/home/tuyomori/bin/jww-launch.sh
フローはこんな感じになる。
Jw_cad起動
↓
家/ の監視開始
↓
平面.jww を Ctrl+S
↓
01_平面図/
2026-09-06_13-24-31_123_IStDXi-M1B6_平面.jww
↓
また保存
↓
さらに履歴追加
↓
Jw_cad終了
↓
監視も終了
inotifywaitについては先人たちが詳しく解説してくれています。
ありがとうございます。
これで保存するたびに履歴が新しいファイルで作成されていきます。
普段2つのPCで開発も設計も行ったり来たりするので、dropboxの同期フォルダにファイルをつくりますが、増えてきたらローカルにアーカイブする運用とします。
今回は動画の素材という意味でスナップショットを大量に保存していこうと思いますが、普通ならマスターファイル一本とbakファイルだけで問題ありません。
このスクリプトを動かして、
「おぉ、Ctrl+Sしたら勝手に新しいファイルが増えてる」
と確認していて、ふと思いました。
これ、Jw_cadに限らずGitのcommitとcommitの間を埋めるような使い方もできるのでは?
Gitはcommitした時点の履歴はきれいに残りますが、その間にCtrl+Sを何十回していても、その中間状態までは通常残しません。
一方、この方法ならCtrl+Sを自動チェックポイントのように扱えます。
もちろん全部残せば無駄な履歴も大量に増えますし、ソースコードならGitの方が圧倒的に適しています。
それでも、CAD、Blender、画像編集、音楽制作など、Gitで差分管理しにくい成果物では「保存するだけでスナップショットが残る」という仕組みが便利な場面もありそうです。
作りませんけど。
今回はあくまで、Jw_cadの設計工程を後からタイムラプス化するための素材収集として使ってみます。