Obsidian ユニークノートクリエイターは重複しそうになると番号を増やす
Obsidian とは、 Markdown ファイルに焦点を当てたメモツールです。
ユニークノートクリエイター
(旧名: Zettelkasten プレフィクサー
)というコアプラグインの振る舞いについて、不具合があるというチケットを見ました。
このプラグインは指定したフォーマットに基づいて、新規作成したファイルに Prefix を付与するものです。
不具合とされていたのは、 YYYY-MM-DD
というフォーマットを採用した場合に、次の現象が起きるというものでした。
- 同日中にプラグインを使って2回ノートを作成すると、「今日」と「翌日」のノートが出来る。
この振る舞いが不具合であるか仕様であるかはさておき、「作成失敗ではなく、次の番号が振られる」という点が気になったので、色々試してみました。
結論
振る舞いを確認したところ、現象としては以下のようなものでした。
- ユニークノートクリエイターが生成した Prefix と一致するファイルが既に存在する場合、一定の規則で定められた要素の数字を 1繰り上げる
- これを、使用可能な Prefix が見つかるまで繰り返す
- 結果、未来のPrefixファイルが生まれる
- 繰り上げる最小要素は
分
である
- これを、使用可能な Prefix が見つかるまで繰り返す
未来のPrefixファイルが多ければ多いほど、ファイル生成時に余計な処理が発生すると思われます。
Prefix には、運用にあたって十分に細かい要素を組み込んでおくとよいでしょう。
実験
以下は試した内容です。
予想
ユニークノートクリエイターは、次のような振る舞いであると予想しました。
- フォーマットに従い、新規作成時点の時刻から Prefix を作る
- 同じ Prefix のファイルがすでに存在する場合、最も小さい数字を1つ繰り上げる
- これを、使用可能になるまで繰り返す
前提
- 環境: Obsidian v0.15.8
- 筆者は
YYYYMMDDHHmm-
という Prefix を普段から使用している- これは、ノートを作る時点の時間を
年月日時分-
に割り当てる設定である
- これは、ノートを作る時点の時間を
- 日付フォーマット文字列の対応は次の通り
-
YYYY
: 西暦の年を表す4桁の数字 -
MM
: 西暦の月を表す2桁で0埋めの数字 -
DD
: 西暦の日を表す2桁で0埋めの数字 -
HH
: 時を表す2桁で0埋めの数字 -
mm
: 分を表す2桁で0埋めの数字 -
ss
: 秒を表す2桁で0埋めの数字
-
-
ctrl+n
にユニークノートクリエイター: 新規ユニークノートの作成
を割り当てている
実験1: YYYYMMDDHHmm-ss
秒単位の Prefix を指定し確認してみました。
これは変化を観測しやすくするため、また、後始末を容易にするためでした。
手順
-
YYYYMMDDHHmm-ss-
と一時的に Prefix ルールを変更する- これは、ノートを作る時点の時間を
年月日時分-秒-
に割り当てる設定である
- これは、ノートを作る時点の時間を
- 1秒以内に複数回押すペースで1秒から2秒ほど、
ctrl+n
を連打する
結果
-
202207261933-01
が作られたあと、秒数はそのまま、分の位が増加したファイルが作られた202207261934-01
202207261935-01
202207261936-01
-
202207261933-02
が作られたあと、秒数はそのまま、分の位が増加したファイルが作られた202207261934-02
202207261935-02
202207261936-02
使われる最小要素は 秒
であるにも関わらず、 分
の要素が繰り上げられました。
実験2: YYYYMMDDHHmmss-
実験1の設定をわずかに変えたものです。
分と秒の間に -
が含まれていることで、連続した数字になっていないことが 分
の要素を繰り上げている疑念があったために調査しました。
手順
-
YYYYMMDDHHmmss-
と一時的に Prefix ルールを変更する- これは、ノートを作る時点の時間を
年月日時分秒-
に割り当てる設定である
- これは、ノートを作る時点の時間を
- 1秒以内に複数回押すペースで1秒から2秒ほど、
ctrl+n
を連打する
結果
- 末尾が
44-
のファイルが作られた20220727003944-
20220727004044-
20220727004144-
- そして、末尾が
45-
のファイルが作られた20220727003945-
20220727004045-
20220727004145-
使われる最小要素は 秒
であるにも関わらず、 分
の要素が繰り上げられました。
しかも、数字の列としてはひとつの塊であっても同様の結果でした。
つまり、分と秒が分割されているかどうかは関係がないことを示しています。
実験3: YYYYMMDDHHmm-
筆者の元々の設定です。
最小要素の次に大きい要素が繰り上げられるとすれば、時
の要素が増えるかもしれないので、調査しました。
手順
-
YYYYMMDDHHmm-
と一時的に Prefix ルールを変更する- これは、ノートを作る時点の時間を
年月日時分-
に割り当てる設定である
- これは、ノートを作る時点の時間を
- 1秒以内に複数回押すペースで1秒から2秒ほど、
ctrl+n
を連打する
結果
- 分の要素を増やしたファイルが作られた
202207270138-
202207270139-
202207270140-
202207270141-
202207270142-
202207270143-
繰り上がったのは 時
ではありませんでした。
実験4: Q- あるいは QQQQQQQQQQQQ-
YYYYMMDD
だけでも、Prefixとしては十分おおきな余裕があります。
では極端に小さい範囲しかないフォーマットを選ぶとどうなるのでしょうか。
手順
-
QQQQQQQQQQQQ-
と一時的に Prefix ルールを変更する- これは、ノートを作る時点の時間を
(四半期を示す値){繰り返し}-
に割り当てる設定である-
Q
ひとつが表す値は1 2 3 4
のいずれかである
-
- これは、ノートを作る時点の時間を
- 1秒以内に複数回押すペースで1秒から2秒ほど、
ctrl+n
を連打する
結果
-
333333333333-
というファイルが作られたことを確認できた - 以後、Obsidianは動作を止め、反応しなくなった
Q
の要素は循環しており、無限ループに陥ったと思われます。
実験5: YYYYMMDDHHmm-ss.S
どうも繰り上げられるのは 分
が最小のように思われますが、念のためミリ秒がある状態も調査しました。
手順
-
YYYYMMDDHHmm-ss.S
と一時的に Prefix ルールを変更する- これは、ノートを作る時点の時間を
年月日時分-秒.(秒の小数点以下第1桁)
に割り当てる設定である
- これは、ノートを作る時点の時間を
- 連打ツールにて、
ctrl+n
を25msec
で連打する
結果
-
分
の要素が繰り上げられたファイルが生成された202207270240-37.5
202207270239-37.5
-
0.1
秒経過するごとに、普通にファイルが生成された202207270239-37.5
202207270239-37.6
202207270239-37.7
202207270239-37.8
- あまりに連続してファイル生成を要求したので、ファイル生成そのものに失敗した通知も多く出た
Error: File already exists.
やはり、繰り上げられたのは 分
でした。
参照
- Zettelkasten plugin wrong date bug - Bug graveyard - Obsidian Forum
- Moment.js | Docs - format 該当プラグインの扱うフォーマットについて、参考資料として提示されているもの
Discussion