Obsidian で DataView を使い、Publish もする
TL;DR
Obsidian のプラグイン DataView を活用することで、ファイルの作成日などのメタデータを活用したクエリ検索やリスト化が可能となり、柔軟なメモ管理や表示を実現できる。
ただし Scrapbox から移行した際にメタデータがリセットされたため、yq
と setfile
を利用したスクリプトを作成し修正した。
また DataView は、 Obsidian Publish ではデフォルトではサポートされていないため、udus122/dataview-publisher を利用することにした。
そもそもDataView とは
Obsidian のプラグインである DataView を使い始めた。
DataView は Obsidian 内のメモをクエリで検索し、リストやテーブル形式で表示することができる便利なツールである。
以下は、 scraps/papers
フォルダ内のファイルを更新日時順に並べて10件リスト化する例である。
※ 実際に https://note.omuomugin.com/readme#books で使っているクエリである。
list "(更新: " + dateformat(file.mday, "yyyy-MM-dd") + ")"
from "scraps/papers"
SORT file.mtime DESC
limit 10
--> 以下のようなリストが出力される (し何もしなくても更新される)
- Real World HTTP 第3版: (更新: 2025-04-13)
- Scaling People: (更新: 2025-04-13)
- データ指向アプリケーションデザイン: (更新: 2025-04-13)
- 世界はシステムで動く: (更新: 2025-04-13)
- 事業分析・データ設計のためのモデル作成技術入門: (更新: 2025-04-13)
- 戦略の要諦: (更新: 2025-04-13)
- ストーリーとしての競争戦略: (更新: 2025-03-15)
- 競争戦略論 I, II: (更新: 2025-03-15)
- 世界で一番やさしい考え方の教科書: (更新: 2025-03-04)
- Software Design X-Rays: (更新: 2025-02-26)
詳細は以下のドキュメントを見てもらうとして、 個人的にポイントは、Metadata on Pages にもあるように file.mday
や file.mtime
など実際のファイル自体のメタデータを参照してクエリを実行できるという点である。
また、 file.tags
や file.starred
など Obsidian 独自で管理しているメタデータにもアクセスできるのでいろんなことができそうである。
see also
Scrapbox から移行したファイルのメタデータを修正する
ただし Obsidian を使ってみている にも書いたとおり、 Scrapbox - omuomugin から移行したばかりで全てのファイルの作成日がリセットされてしまっているので Scrapbox - omuomugin で表示していた並び順番が失われてしまった。
そこで移行時に設定した front matter にある created_at
と updated_at
をもとに、各ファイルのメタデータを修正する以下のスクリプトを作成して実行した。
yq
を使って front matter に設定している yaml の情報を取得し、 setfile
という macOS 特有のコマンドを使ってファイルのメタデータを修正しているだけである。
#!/bin/bash
# scraps 以下のすべての .md ファイルを処理
find scraps -name "*.md" -type f | while read -r file; do
# 各ファイルの front matter から created_at と updated_at を取得
## see also https://mikefarah.gitbook.io/yq/usage/front-matter
created_at=$(yq eval --front-matter=extract '.created_at' "$file")
updated_at=$(yq eval --front-matter=extract '.updated_at' "$file")
# setfile に渡す date は、 `mm/dd/yyyy` というフォーマットでないといけない
## see also https://book.studio947.net/article/4609/
## see also https://ss64.com/mac/setfile.html
created_at_formatted=$(date -j -f "%Y-%m-%d" "$created_at" "+%m/%d/%Y")
updated_at_formatted=$(date -j -f "%Y-%m-%d" "$updated_at" "+%m/%d/%Y")
# -d はファイルの作成日
setfile -d "$created_at_formatted" "$file"
# -m はファイルの更新日
setfile -m "$updated_at_formatted" "$file"
echo "${file} has updated to created_at: ${created_at}, updated_at: ${updated_at}"
done
※ ちなみに macOS 以外 (例えば Linux) の touch
コマンドなどではうまくそれぞれを修正する術がないようでやや面倒そうな雰囲気であった。
DataView を Publish できるようにする
そんな便利な DataView は Publish limitations にある以下記載の通り Obsidian Publish に対応していない。
Whereas a plugin that requires a plugin codeblock to render, such as Dataview or Fantasy Statblocks, will not work by default in Publish.
※ 一応 Roadmap で 2025/05/03 時点では Dynamic views
という機能が Active となっているので近い将来公式にサポートされるのかもしれない。
これを解決するために udus122/dataview-publisher というβ版のプラグインがあるのでそれを使うことにした。
仕組みとしてはシンプルでプラグイン側でファイルの変更や保存などをする際に、 DataView のクエリを実際に実行してマークダウンに変換して差し込んでくれるというものである。
インストールの仕方などもシンプルなので詳細は、 README などを見てほしい。
※ ちなみにインストール手順 3 にある Enable the Checkbox Time Tracker plugin
は少なくとも list
と table
しか使っていない状態では不要である。
まとめ
Obsidian のプラグイン DataView を活用することで、ファイルの作成日などのメタデータを活用したクエリ検索やリスト化が可能となり、柔軟なメモ管理や表示を実現できる。
ただし Scrapbox から移行した際にメタデータがリセットされたため、yq
と setfile
を利用したスクリプトを作成し修正した。
また DataView は、 Obsidian Publish ではデフォルトではサポートされていないため、udus122/dataview-publisher を利用することにした。