JavaScriptを有効にしてください

自分用Wikiのすゝめ

 ·   ·  ☕ 6 min read

2年前から自分用Wiki1としてCrowiを使っていて、すごく生活の役に立っているので布教する。情報過多の時代においてイイ感じに重要なものだけまとめておきたい人の参考になれば嬉しい。

外部記憶装置

自分用Wikiの必要性を考えるために、何か思いついたときにどうするかを検討する。

ダジャレの類ならTwitterに投稿する。何かまとまったものならブログに書ける。中途半端なのは大抵そのまま忘れる。何かの手順とか「あのコマンドの使い方」とかそのうち必要になるものもよく忘れる。

次のように雑な分類をしてみると、多分だけどWikiみたいな手軽に閲覧したり編集したりできるシステムがあると嬉しい。

  • 寝かせるもの(そのうちやるやつ)
    • 「これいいじゃん!同人誌のネタにするか!」と思ったら書き留めておく。そうしないとすぐ忘れるからだ。まあ翌日読み返すと大体わけのわからないことが書かれているが
  • なんかすごい知見(よく忘れてググるやつ)
    • キュレーションされた情報には価値がある。だから2chのスレを読まずにアフィ◯スのまとめサイトを読むのだ。自分向けのまとめはすごく役に立つ
  • 脳みそダンプ(オタクがやりがちな思考を垂れ流すやつ)
    • 割となんでも書く。たとえばアニメを観たときに感じたこととか。感想文みたいなのは後から書けるけど、最初に観たときに受けた衝撃みたいなのは思い出せないことがある。再度観るとまた違うことを感じる。本の著者ってどうやって読者の気持ちを考えるんだろう?

つまり、自分の記憶を補完するための外部記憶装置である。ピンとこなかったら攻殻機動隊を観てほしい。

自分用Wikiの要件

譲れないものに留める。

  • 検索しやすさ
    • 木構造だけで何かをうまく整理するのは多分無理。パソコンのデスクトップを見ればわかる
  • 使いやすさ
    • Markdownが完璧ってわけじゃないけどTeXで書けと言われても困る。他のあまり普及していない記法はもっと疲れる
  • シンプルさ
    • 長く使うことを考えると、サービスやツール自体がなくなっても他に移動できるようなシンプルな仕組みじゃないと使えないよね

これらをふまえて考えるとやっぱりWikiのようなマークアップ言語によるシンプルなページ+よさげな検索機能がほしいっぽい。

[ここにイイ感じの案を入力]じゃあダメ?

論理的であるためには、比較検討を経て最適なソリューションを見つける必要があるはず。

  • ノートとペン
    • 検索できないしサイジングが難しい
  • SlackやTeamsなど、チャット的なやつ
    • 情報が流れる。というか新旧によって記憶の価値が決まるわけではない
  • BoostnoteやObsidianなど、テキストベースのノートアプリ
    • 本質的には似ているけどブラウザで使いたい、あとタグを管理するのが苦手
  • 非公開のブログ
    • 時系列順なのでチャットと同じ問題がある
  • OneNoteやEvernoteなど、こういう用途のためのサービス
    • 複雑すぎる。機能があるとついつい使っちゃうんだけどロックインされるよね
  • esa.ioなど、Wikiサービス
    • 本質的には同じ。仕事ならSaaSを使うけど、趣味だとすべてを手中に収めたいよね
  • 何もしない
    • 人間の脳はさまざまな都合から三歩歩けば忘れるようにできている
    • それもいいかもしれない

ということで、やっぱりWikiがよさげ。

Crowi

Wikiの比較はググればいっぱい出てくる。ここでは主に次の理由からCrowiを採用した。Crowiの詳細は公式サイトが詳しい。

  • まともな検索機能
    • ElasticSearchによる全文検索は強力
    • ページ遷移せずその場で結果を表示してくれる作りが素晴らしい
  • よく考えられた使いやすさ
    • URLを入力するとそれがそのままページになる仕組みがカッコイイ。たしかにページ作成ボタンって本質的じゃないよね
    • Markdown対応がイイ感じ。というか他のWikiがまともな記法に対応していない
  • 普通にシンプル
    • 普通のウェブアプリ。MongoDBとAmazon S3にそれぞれ記事と添付ファイルを保存

書きようはいくらでもあるが、とにかく他と比べると機能が十分でかつ使いやすくて運用もしやすいから総合的にこれが一番良いと思った。

イイ感じに運用する

大事なこと: 安い、シンプル、楽2

検討
  • 案1: PCにインストール
    • 安くないし複雑だしちっとも楽じゃないのでおわり
  • 案2: GCEのFree Tier
    • ElasticSearchがまともに動かないし他も解決しないのでおわり
  • 案3: ちゃんと考える
    • 壊れちゃいけないもの壊れてもいいものに分けて考える
    • 壊れちゃいけないものは自分で運用しない
    • 壊れてもいいものは楽な運用方法を採用する

なるほど、案3しかない。ということでCrowiの構成要素を考える。

  • MongoDBに添付ファイル以外のデータ
  • Amazon S3に添付ファイル
  • Redisにセッション情報
  • ElasticSearchに検索機能
  • PlantUMLにUML描画機能
  • Node.jsのサーバ

これを案3に当てはめるとこうなる。

  • 壊れちゃいけないもの
    • MongoDBとS3だけ
    • MongoDBの自前運用はイヤなのでMongoDB Atlasでやる。Free Tierで3ノードのクラスタをGCPの東京リージョンに作れるの神でしょ
    • どちらも定期的にバックアップを取る。S3は不要だと思うけど手間でもないしローカルにダウンロードしてる
  • 壊れてもいいもの
    • 残りのすべて
素晴らしいソリューション

さて、お気づきだと思うが、案3の前提なら「安くてシンプルで楽」という条件を簡単に満たせる。そう、一家に一式おうちKubernetesクラスタで動かそう!

メルカリのブログをすごく参考にさせてもらった(というかほぼ丸パクリ)

課題
  • スマホだと操作性が微妙
  • セキュリティと利便性のバランス

最後に

「何かあるときはとにかくここに書けばいい」というのはなかなか頼りになるからぜひ試してみて。


  1. 不特定多数が更新するわけではないが、便宜上「Wiki」と呼ぶことにする。「社内Wiki」とか言うし? ↩︎

  2. 「安い」とは文字通り、最小限のお金という意味。「シンプル」とは全容を把握できて移行もスムーズにできそうなアーキテクチャくらいの意味。「楽」とは運用に有限リソースである時間を浪費せずに済むこと。 ↩︎