Obsidian
コラボレーションツール
Obsidian
概要
Obsidianは、ローカルMarkdownファイルベースのナレッジマネジメントツールです。ノート間のリンク機能、グラフビューによる知識の可視化、プライバシー重視の個人向けナレッジベース構築を特徴とします。個人ナレッジマネジメント(PKM)の第一選択として、2024年にSync Standard Plan(月4ドル)を導入。研究者、ライター、エンジニアの間で人気が高く、プライバシー重視ユーザーに支持されています。豊富なコミュニティプラグインとMarkdown基盤により、将来性のあるPKMシステムを提供します。
詳細
Obsidian 2025年版は、パーソナルナレッジマネジメント(PKM)における最高峰のツールとして地位を確立しています。Markdownファイルベースのローカルファースト設計により、データの完全制御と高いポータビリティを実現。双方向リンク、グラフビュー、ネットワーク思考によるノート接続機能により、従来の階層的ノート整理を超えた知識のネットワーク化を可能にします。1,000以上のコミュニティプラグイン、カスタムテーマ、CSSカスタマイズにより無限の拡張性を提供。キャンバスビュー、デイリーノート、Dataviewプラグインによるデータ分析、Zettlkasten手法サポートなど、研究・執筆・学習ワークフローを包括的に支援。暗号化同期、パブリッシュ機能、モバイルアプリにより、個人の知識管理から専門的な研究活動まで対応します。
主な特徴
- ローカルMarkdownファイル: データの完全制御とベンダーロックイン回避
- 双方向リンクとグラフビュー: 知識間の関係性を視覚的に把握
- 豊富なプラグインエコシステム: 1,000以上のコミュニティプラグイン
- キャンバスビュー: 視覚的思考とアイデアマッピング
- 暗号化同期: エンドツーエンド暗号化による安全なデータ同期
- 完全なカスタマイズ性: CSS、テーマ、プラグインによる自由な拡張
メリット・デメリット
メリット
- 完全なデータ所有権とプライバシー保護(ローカルファイル)
- Markdown標準による高いポータビリティと将来性
- 豊富なプラグインエコシステムによる無限の拡張可能性
- グラフビューによる知識の関係性可視化と発見
- 直感的なリンク機能とバックリンク追跡
- 高度なカスタマイズ性(CSS、テーマ、プラグイン)
- 研究・執筆・学習ワークフローの最適化
- 長期的なコスト効率性(基本機能無料)
デメリット
- 初期設定とプラグイン選択の学習コスト
- チームコラボレーション機能の制限
- モバイル版の機能制約(プラグイン対応制限)
- 大量データ処理時のパフォーマンス課題
- 同期機能は有料プラン(Sync)が必要
- 技術的知識が必要な高度なカスタマイズ
- ウェブベースアクセスの制限
- 初心者には複雑すぎる可能性
参考ページ
書き方の例
基本設定とVault作成
# Obsidian基本セットアップ
# 1. 公式サイトからダウンロード: https://obsidian.md/
# 2. インストール (Windows/Mac/Linux対応)
# 3. 新しいVault作成または既存フォルダを開く
# 4. 設定画面でプラグインとテーマの設定
# 基本的なVault構造例
Personal Knowledge Vault/
├── 00 - Index/
│ ├── Dashboard.md
│ ├── MOCs (Maps of Content)/
│ └── Templates/
├── 01 - Projects/
│ ├── Current Projects/
│ ├── Archive/
│ └── Ideas/
├── 02 - Areas/
│ ├── Health/
│ ├── Finance/
│ └── Career/
├── 03 - Resources/
│ ├── References/
│ ├── Learning/
│ └── Tools/
└── 04 - Archive/
├── Completed/
└── Deprecated/
# 推奨プラグイン設定
Core Plugins:
- Daily Notes ✓
- Templates ✓
- Graph View ✓
- Backlinks ✓
- Tag Pane ✓
- File Explorer ✓
Community Plugins:
- Dataview ✓
- Calendar ✓
- Advanced Tables ✓
- Templater ✓
- QuickAdd ✓
基本ノート作成とリンク機能
# プロジェクト管理ノート例
## プロジェクト: Web Reference サイト開発
### 基本情報
- **開始日**: [[2025-01-01]]
- **期限**: [[2025-03-31]]
- **ステータス**: #進行中
- **優先度**: #高優先度
- **担当者**: [[田中太郎]]
### 関連ノート
- [[プロジェクト計画]]
- [[技術スタック選定]]
- [[進捗レポート]]
- [[課題管理]]
### 目的
[[Web Reference]]サイトを構築し、開発者向けのコラボレーションツール情報を提供する。
### 技術スタック
- **フロントエンド**: [[TypeScript]] + [[React]]
- **バックエンド**: [[Node.js]] + [[Express]]
- **データベース**: [[PostgreSQL]]
- **デプロイ**: [[Vercel]]
### タスクリスト
- [ ] 要件定義完了 [[2025-01-15]]
- [ ] UI/UX設計 [[2025-01-30]]
- [x] 技術選定 [[2025-01-08]]
- [ ] プロトタイプ開発 [[2025-02-15]]
### 学んだこと
このプロジェクトを通じて[[プロジェクト管理]]の重要性を再認識した。
特に[[ステークホルダー管理]]と[[リスク管理]]が成功の鍵となる。
### 参考資料
- [技術仕様書](./specifications.pdf)
- [[競合分析]] - 類似サイトの調査結果
- [[ユーザーインタビュー]] - ターゲット層の調査
---
## デイリーノート例 (2025-01-08)
### 今日の計画
- [ ] [[Web Reference]]プロジェクト: 技術選定会議 10:00-11:00
- [ ] [[Obsidian]]のプラグイン調査と設定
- [ ] [[週次レビュー]]の準備
### 学習ノート
#### [[TypeScript]] 学習メモ
```typescript
// Genericsの使用例
interface Repository<T> {
find(id: string): Promise<T | null>
save(entity: T): Promise<T>
delete(id: string): Promise<void>
}
class UserRepository implements Repository<User> {
async find(id: string): Promise<User | null> {
// 実装
}
}
今日の気づき
[[型安全性]]は開発効率と品質向上に直結する。 [[Design Patterns]]の理解が実装品質を左右する。
振り返り
- よかったこと: チーム会議で技術選定の合意形成ができた
- 改善点: もっと事前準備に時間をかけるべきだった
- 明日への課題: [[プロトタイプ]]開発の計画策定
関連メモ
- [[チームコミュニケーション]]の改善方法
- [[技術債務]]の管理戦略
MOC (Map of Content) 例
プログラミング学習 MOC
概要
プログラミング学習に関する全ての知識を整理したマップ
基礎知識
プログラミング言語
- [[JavaScript]] - ウェブ開発の基盤
- [[TypeScript]] - 型安全なJavaScript
- [[Python]] - データサイエンスとAI
- [[Go]] - バックエンド開発
- [[Rust]] - システムプログラミング
フレームワーク
- [[React]] - フロントエンドライブラリ
- [[Next.js]] - Reactフレームワーク
- [[Express]] - Node.jsフレームワーク
- [[FastAPI]] - Pythonウェブフレームワーク
開発プラクティス
設計パターン
- [[Singleton Pattern]]
- [[Observer Pattern]]
- [[Factory Pattern]]
- [[MVC Architecture]]
テスト手法
- [[Unit Testing]] - 単体テスト
- [[Integration Testing]] - 統合テスト
- [[E2E Testing]] - エンドツーエンドテスト
- [[Test-Driven Development]]
プロジェクト
完了プロジェクト
- [[Portfolio Website]] - 個人サイト開発
- [[Task Manager App]] - タスク管理アプリ
進行中プロジェクト
- [[Web Reference]] - 技術情報サイト
- [[PKM System]] - 個人知識管理システム
学習リソース
書籍
- [[Clean Code]] - Robert C. Martin
- [[Design Patterns]] - GoF
- [[Effective TypeScript]] - Dan Vanderkam
オンラインコース
- [[MDN Web Docs]] - ウェブ技術リファレンス
- [[TypeScript Handbook]] - 公式ドキュメント
次のステップ
- [[Microservices]]アーキテクチャの学習
- [[Docker]]と[[Kubernetes]]の実践
- [[AWS]]クラウドサービスの習得
研究ノート例
Zettelkasten手法によるナレッジマネジメント
アイデア発展
[[202501081030]] 知識の接続性がイノベーションの源泉
↓
[[202501081045]] グラフ理論を応用した知識ネットワーク分析
↓
[[202501081100]] Obsidianグラフビューの活用可能性
仮説
知識間のリンク密度が高いほど、創造的なアイデアが生まれやすい。
検証方法
- [[グラフメトリクス]]による定量分析
- [[アイデア創出セッション]]の記録
- [[相関分析]]による関係性調査
参考文献
- Luhmann, N. (1992). Communicating with Slip Boxes
- [[How to Take Smart Notes]] - Sönke Ahrens
- [[The Zettelkasten Method]] - 実践ガイド
関連研究
- [[Network Science]] - ネットワーク科学
- [[Cognitive Load Theory]] - 認知負荷理論
- [[Knowledge Graphs]] - 知識グラフ
次のアクション
- [[実験設計]]の詳細化
- [[データ収集]]方法の確定
- [[分析ツール]]の選定
### プラグイン活用と自動化
```javascript
// Dataviewプラグインの使用例
// 今日が期限のタスク一覧
```dataview
TASK
FROM ""
WHERE completion = false AND due = date(today)
SORT priority DESC
// プロジェクト別進捗状況
TABLE
status as "ステータス",
length(file.tasks.completed) as "完了タスク",
length(file.tasks) as "総タスク数",
round((length(file.tasks.completed) / length(file.tasks)) * 100) + "%" as "進捗率"
FROM "01 - Projects"
WHERE type = "project"
SORT file.name ASC
// 最近更新されたノート
LIST
FROM ""
WHERE file.mtime >= date(today) - dur(7 days)
SORT file.mtime DESC
LIMIT 10
// タグ別ノート数
TABLE length(rows) as "ノート数"
FROM ""
FLATTEN file.tags as tag
GROUP BY tag
SORT length(rows) DESC
// 月別学習記録
TABLE
length(rows) as "学習セッション数",
sum(rows.duration) as "総学習時間"
FROM "03 - Resources/Learning"
WHERE type = "learning-session"
GROUP BY dateformat(date, "yyyy-MM") as "月"
SORT "月" DESC
### Templaterプラグインによるテンプレート自動化
```javascript
// Templaterテンプレート例
// 日次レビューテンプレート
<%*
const today = tp.date.now("YYYY-MM-DD");
const yesterday = tp.date.now("YYYY-MM-DD", -1);
%>
# 日次レビュー - <% today %>
## 昨日の振り返り
![[<% yesterday %>#振り返り]]
## 今日の計画
### 最重要タスク (MIT - Most Important Tasks)
1. [ ]
2. [ ]
3. [ ]
### その他のタスク
- [ ]
- [ ]
## 学習目標
- [ ]
## 今日の気づき・学び
## 明日への引き継ぎ
## エネルギーレベル
体調: ⭐⭐⭐⭐⭐
集中力: ⭐⭐⭐⭐⭐
モチベーション: ⭐⭐⭐⭐⭐
---
// プロジェクトテンプレート
<%*
const projectName = await tp.system.prompt("プロジェクト名を入力してください:");
const startDate = tp.date.now("YYYY-MM-DD");
const category = await tp.system.suggester(
["Personal", "Work", "Learning", "Research"],
["personal", "work", "learning", "research"]
);
%>
# <% projectName %>
## プロジェクト情報
- **カテゴリ**: #<% category %>
- **ステータス**: #計画中
- **開始日**: <% startDate %>
- **期限**:
- **優先度**: #中優先度
## 目的・背景
## 成功条件
## 必要リソース
### 人的リソース
-
### 技術・ツール
-
### 参考資料
-
## マイルストーン
- [ ] フェーズ1:
- [ ] フェーズ2:
- [ ] フェーズ3:
## リスクと対策
## 進捗記録
### <% tp.date.now("YYYY-MM-DD") %>
-
## 関連ノート
-
---
// 週次レビューテンプレート
<%*
const weekStart = tp.date.now("YYYY-MM-DD", 0, "dddd") === "Monday" ?
tp.date.now("YYYY-MM-DD") :
tp.date.now("YYYY-MM-DD", -7 + (1 - tp.date.now("d")));
const weekEnd = tp.date.weekday(weekStart, 6, "YYYY-MM-DD");
%>
# 週次レビュー - <% weekStart %> to <% weekEnd %>
## 今週の目標達成状況
### 主要目標
- [ ] 目標1
- [ ] 目標2
- [ ] 目標3
### 学習目標
- [ ]
## 今週のハイライト
### 成果・達成事項
### 学んだこと・気づき
### 課題・改善点
## 来週の計画
### 主要目標
1.
2.
3.
### 学習計画
### 注意事項・リマインダー
## メトリクス
```dataview
TASK
FROM ""
WHERE completion = true AND completed >= date(<% weekStart %>) AND completed <= date(<% weekEnd %>)
エネルギー管理
- 高エネルギー時間帯:
- 低エネルギー時間帯:
- 改善アクション:
### 高度な自動化とワークフロー
```bash
# Obsidian自動化スクリプト例
# 1. 自動バックアップスクリプト (bash)
#!/bin/bash
# daily-backup.sh
VAULT_PATH="/path/to/your/obsidian/vault"
BACKUP_PATH="/path/to/backup/location"
DATE=$(date +%Y%m%d_%H%M%S)
# Vaultのバックアップ作成
tar -czf "${BACKUP_PATH}/obsidian_backup_${DATE}.tar.gz" -C "${VAULT_PATH}" .
# 30日以上古いバックアップを削除
find "${BACKUP_PATH}" -name "obsidian_backup_*.tar.gz" -mtime +30 -delete
echo "Backup completed: obsidian_backup_${DATE}.tar.gz"
# 2. グラフメトリクス分析スクリプト (Python)
import json
import os
import re
from collections import defaultdict
import networkx as nx
class ObsidianGraphAnalyzer:
def __init__(self, vault_path):
self.vault_path = vault_path
self.graph = nx.Graph()
self.notes = {}
def scan_vault(self):
"""Vaultをスキャンしてノートとリンクを抽出"""
for root, dirs, files in os.walk(self.vault_path):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
self.process_note(file_path)
def process_note(self, file_path):
"""個別ノートを処理してリンクを抽出"""
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
note_name = os.path.basename(file_path)[:-3] # .md を除去
self.notes[note_name] = {
'path': file_path,
'content': content,
'word_count': len(content.split()),
'links': []
}
# [[リンク]]形式のリンクを抽出
links = re.findall(r'\[\[([^\]]+)\]\]', content)
for link in links:
clean_link = link.split('|')[0] # エイリアスを除去
self.notes[note_name]['links'].append(clean_link)
self.graph.add_edge(note_name, clean_link)
def analyze_graph(self):
"""グラフ構造を分析"""
analysis = {
'total_notes': len(self.notes),
'total_connections': self.graph.number_of_edges(),
'average_connections': self.graph.number_of_edges() * 2 / len(self.notes),
'most_connected_notes': [],
'isolated_notes': [],
'clusters': []
}
# 接続数でソート
degree_centrality = nx.degree_centrality(self.graph)
sorted_notes = sorted(degree_centrality.items(), key=lambda x: x[1], reverse=True)
analysis['most_connected_notes'] = sorted_notes[:10]
# 孤立ノート
analysis['isolated_notes'] = [note for note, degree in self.graph.degree() if degree == 0]
# クラスター分析
if self.graph.number_of_nodes() > 0:
communities = nx.community.greedy_modularity_communities(self.graph)
analysis['clusters'] = [list(community) for community in communities]
return analysis
def generate_report(self):
"""分析レポートを生成"""
analysis = self.analyze_graph()
report = f"""# Obsidian Knowledge Graph Analysis Report
## Overview
- **Total Notes**: {analysis['total_notes']}
- **Total Connections**: {analysis['total_connections']}
- **Average Connections per Note**: {analysis['average_connections']:.2f}
## Most Connected Notes
"""
for note, centrality in analysis['most_connected_notes']:
connections = self.graph.degree(note)
report += f"- **{note}**: {connections} connections\n"
report += f"""
## Isolated Notes ({len(analysis['isolated_notes'])})
"""
for note in analysis['isolated_notes'][:10]: # 最初の10個のみ表示
report += f"- {note}\n"
report += f"""
## Knowledge Clusters ({len(analysis['clusters'])})
"""
for i, cluster in enumerate(analysis['clusters'][:5]): # 最初の5クラスターのみ
report += f"- **Cluster {i+1}**: {len(cluster)} notes\n"
for note in cluster[:3]: # 各クラスターの最初の3ノートのみ
report += f" - {note}\n"
# レポートファイルに保存
report_path = os.path.join(self.vault_path, "Graph_Analysis_Report.md")
with open(report_path, 'w', encoding='utf-8') as f:
f.write(report)
return report
# 使用例
analyzer = ObsidianGraphAnalyzer("/path/to/your/vault")
analyzer.scan_vault()
report = analyzer.generate_report()
print("Graph analysis completed. Report saved to vault.")
# 3. 自動タグ生成スクリプト (Python)
import openai
import os
class ObsidianAutoTagger:
def __init__(self, vault_path, openai_api_key):
self.vault_path = vault_path
openai.api_key = openai_api_key
def suggest_tags(self, note_content, existing_tags):
"""AIを使用してタグを提案"""
prompt = f"""
以下のObsidianノートの内容を分析し、適切なタグを3-5個提案してください。
既存のタグリスト: {', '.join(existing_tags)}
ノート内容:
{note_content[:1000]}...
提案タグ(カンマ区切り):
"""
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
max_tokens=100
)
suggested_tags = response.choices[0].message.content.strip().split(', ')
return [tag.strip('#') for tag in suggested_tags]
except Exception as e:
print(f"API Error: {e}")
return []
def process_notes_without_tags(self):
"""タグのないノートを処理"""
existing_tags = set()
# 既存タグを収集
for root, dirs, files in os.walk(self.vault_path):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 既存タグを抽出
tags = re.findall(r'#(\w+)', content)
existing_tags.update(tags)
# タグのないノートを処理
for root, dirs, files in os.walk(self.vault_path):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# タグが少ない場合のみ処理
current_tags = re.findall(r'#(\w+)', content)
if len(current_tags) < 2:
suggested_tags = self.suggest_tags(content, list(existing_tags))
print(f"File: {file}")
print(f"Suggested tags: {suggested_tags}")
print("---")
# 使用例
# auto_tagger = ObsidianAutoTagger("/path/to/vault", "your-openai-api-key")
# auto_tagger.process_notes_without_tags()