Obsidianのリンク切れをlycheeで自動チェックする
Rust製の高速リンクチェッカー「lychee」を使って、Obsidian vaultのリンク切れを自動検出する方法
Zettelkasten を2年ほど運用しています。この記事では、フォルダ構造とタグ設計について書きます。
正直、特別なことはやっていません。ただ、続けてみて「これでいいな」と思える形に落ち着いたので、記録として残しておきます。
以前はディレクトリ構造でノートを管理していました。programming/python/、infrastructure/docker/ のように分類する方法です。
この運用には問題がありました。関連しているドキュメントが全然違う場所に保存されてしまうのです。
「Python で Docker コンテナを操作する」というノートは、programming/python/ に置くべきか infrastructure/docker/ に置くべきか。どちらに置いても、もう一方からは見つけにくくなります。
Zettelkasten はこの問題を「つながりで管理する」という発想で解決します。どこに保存するかではなく、何とつながっているかを重視します。
vault/├── 01_FleetingNotes/├── 02_ReferenceNotes/├── 03_PermanentNotes/├── 04_DailyNotes/├── 05_BlogDrafts/└── 99_Templates/FleetingNotes は一時的なメモです。「あとで調べる」「このツール試したい」みたいな思いつきを置く場所です。
ReferenceNotes がメインです。調べた技術情報を記録します。Zettelkasten の用語では Literature Note ですが、技術リファレンスという実態に合わせて改名しました。
PermanentNotes は MOC(Map of Contents)や、自分の見解をまとめたノートです。複数の Reference Note を束ねる役割があります。
DailyNotes は振り返り用。BlogDrafts はブログ下書きです。
フォルダは浅く保ちます。深い階層を作ると、どこに置くか迷う問題が再発します。
Reference Note のファイル名は {tool}-{action} 形式で統一しています。
curl-post-request.mdmysql-backup-restore.mddocker-compose-networking.mdこの命名だと、シェルから ls や rg で直感的に探せます。
ls vault/02_ReferenceNotes/ | grep curlrg "proxy" vault/Obsidian の検索機能に頼らなくても見つかります。これは後述するツール非依存の設計にもつながります。
タグは多次元で設計しています。
tags: - tool/curl - category/http - use-case/developmenttool/ はツール軸。curl、docker、mysql など。
category/ は機能軸。http、database、networking など。
use-case/ は使用場面。development、debugging、monitoring など。
なぜ多次元にするか。検索の切り口が複数あるからです。
tool/curlcategory/httpuse-case/development単一軸のタグだと、どれか一つの切り口でしか探せません。
同じトピックのノートが増えてきたら、MOC を作ります。
# curl MOC
## ネットワーク診断
- [curl-global-ip-check](../02_ReferenceNotes/curl-global-ip-check.md)- [curl-via-proxy](../02_ReferenceNotes/curl-via-proxy.md)
## API操作
- [curl-post-request](../02_ReferenceNotes/curl-post-request.md)- [curl-JSON-request](../02_ReferenceNotes/curl-JSON-request.md)
## 関連ツール
- [wget-basic](../02_ReferenceNotes/wget-basic.md)- [httpie-usage](../02_ReferenceNotes/httpie-usage.md)MOC は単なる目次ではなく、用途別のナビゲーションです。「curl で何ができるか」を俯瞰できます。
作成タイミングは「ノートが増えてきたら」です。厳密なルールは設けていません。5個くらい溜まったら作ることが多いです。
Obsidian を使っていますが、Obsidian に依存しない設計にしています。
<!-- 使わない -->
[[curl-post-request]]
<!-- 使う -->
[curl-post-request](../02_ReferenceNotes/curl-post-request.md)標準の Markdown 相対リンクなら、GitHub でも VSCode でもリンクが機能します。
git 同期のプラグインだけ使っています。便利なプラグインは山ほどありますが、それに依存すると Obsidian がないと困る状態になります。
Obsidian の検索も使いますが、よく使うのは nvim の telescope です。ファイル名検索・全文検索をして、yank してシェルに貼り付けて実行、という流れがスムーズにできます。
この運用のために、Reference Note のコマンドは汎用的な書き方にしておく必要があります。環境変数やパスを直書きせず、どこでも動く形で記録しておく。
プレーンテキストだから grep も rg も効きます。Obsidian が消えても、Markdown ファイルと検索コマンドがあれば困りません。
アイデア → Fleeting Note ↓調べる → Reference Note ↓増える → MOC 作成 ↓まとめる → Permanent Note ↓公開 → BlogFleeting Note は一時的な置き場です。調べたら Reference Note に昇格します。放置されたら消します。
Reference Note が増えてきたら MOC を作って整理します。
独自の見解が出てきたら Permanent Note にまとめます。
公開できそうならブログに出します。
この流れがあるから、ノートを書くときに「これはどの段階か」を意識できます。
{tool}-{action} で検索しやすく特別なことはしていません。ただ、この構造で2年続いているので、それなりに機能していると思います。
品質管理(リンク切れチェック、pre-commit、GitHub Actions)については、別記事で詳しく書いています。
Rust製の高速リンクチェッカー「lychee」を使って、Obsidian vaultのリンク切れを自動検出する方法
Makefileで自分の活動を可視化する。タグの偏り分析、曜日×時間のヒートマップなど
タスクの期限・見積もり時間・優先度から1日の作業時間上限を守りながらスケジュールを自動生成するCLI/TUIタスク管理ツールTaskdogを開発した話