世界を動かす技術を、日本語で。

Nix、Vim、coreutilsを使ったジャーナリング

概要

  • {neo,}vim、coreutils、dateutilsを使った プレーンテキストジャーナルシステム の紹介
  • Ryder Carollの Bullet Journal 方式を参考にした月単位・週単位管理
  • 記号(シグニファイア)Vimの自動化 による効率的整理
  • シンタックスハイライト集計スクリプト による視認性・分析強化
  • 日付操作や 複数月同時表示 のコマンド例も解説

Vim・coreutils・dateutilsで作るBullet Journal風ジャーナルシステム

  • ジャーナルは 年ごとのディレクトリ、各年は 月ごとのファイル で管理
    • 例: journal/2023/01journal/2023/02など
  • 月初めに カレンダー を挿入(:read !cal -mコマンド活用)
  • 週単位でタスク管理、各週は見出し+各項目を1行ずつ記述

タスク記号(シグニファイア)の工夫

  • タスクの状態や種類ごとに 記号 を使い分け
    • ·(U+00B7): todo(未完了タスク)
    • ×(U+00D7): done(完了タスク)
    • o: event(イベント)
    • -: note(メモ)
    • >: moved(移動)
  • Vimの abbreviation機能 で記号入力を自動化
    • 例: :iabbrev todo ·todoと入力→自動で·に変換

タスクの グループ化・ソート

  • タスクを 記号ごとにグループ化・並べ替え
    • 範囲選択(vip)→:sortコマンドで整列
    • :set formatprg=sort\ -V設定でgqipショートカットも可能
  • 記号のUnicode値を活用し todoが上、doneが下 など好みの並び順に調整

シンタックスハイライトで 視覚的な区別

  • 各記号ごとに Vimのsyntax match でグループ化
    • 例: :syntax match JournalDone /^×.*/
  • :highlightコマンドで 色分け (例:doneはグレー、eventはシアン、noteは黄色)

習慣トラッキング・集計

  • 週ごとに 習慣ヘッダー支出記録 を記述
  • awkスクリプト で月間支出などを自動集計
    • 例: awk -f spend.awk journal/2023/01で合計金額表示

振り返り・複数月同時表示

  • 複数月のファイルを同時に開く ことで、過去の記録を参照しながら計画
    • 例: vim -O journal/2023/0{1,2,3}で1月~3月を縦分割表示

日付コマンドによる 効率化

  • 現在月のファイルを自動で開く: vim $(date +"%Y/%m")
  • 2ヶ月前~2ヶ月後の月を一括表示:
    • vim -O $( dateseq "$(date --date "2 months ago" +%Y/%m)" "$(date --date "2 months" +%Y/%m)" -i %Y/%m -f %Y/%m )
  • dateutilsの dateseq コマンドで日付範囲を柔軟に指定

カスタマイズ・運用例

  • サンプルvimrcやnix flakeファイルも リポジトリ で提供
    • 例: git clone https://tangled.sh/@oppi.li/journal
  • ASCIIアート や好みの記号、派手なハイライトで個性も演出可能

注意点・所感

  • org-modeユーザー からの理解は期待しないこと
  • プレーンテキストでも 紙の手帳に負けない楽しさ と柔軟性
  • 自己流カスタマイズ で日々の記録がより快適に

まとめ

  • Vim、coreutils、dateutilsを活用した Bullet Journal風ジャーナル運用法
  • 記号・自動化・色分け で見やすく管理
  • 集計や複数月表示 もシェルコマンドで効率化
  • プレーンテキストならではの 自由度拡張性

Hackerたちの意見

nixが何をしてくれるのか、よくわからないな。vimはもちろん、coreutilsもあるけど、GNU特有のものはすぐには見当たらないし、flake.nixで書かれた小さなラッパースクリプトがあるだけだね。vimをインストールしたらOpenBSDでも動くようなものしか見当たらないよ。(とはいえ、いいジャーナリングシステムではあるけどね)

これはいくつかの理由であまり良い例じゃないけど、要は誰でもツールを完全にインストールした状態でシェルを使えるってことだね。コマンド一発で:nix shell 'git+https://tangled.sh/@oppi.li/journal' これはシェルエイリアスには過剰すぎるけど、もっと複雑なプロジェクトにはすごく便利だよ。

作者はテックトレンドに乗って「クールさ」をアピールするタイプみたいだね。そういう人たちは、実際の利益のためじゃなくてニッチだからこそ、こういう absurなスタックを使うんだ。

うーん、ここではNixが特に何かするとは思えないけど、僕は通常、システムをできるだけ一貫性のある状態に保つためにこういうことをするかな。アクティブにメンテナンスされていなくても、長期間にわたってね。これでjournalコマンドが正確に同じように動くことは保証されると思う。dateutilsのバイナリがflake.lockのバージョンに固定されるからね。nvimも固定されると思ってたけど、特別な設定があるからこそ、そこにもっと壊れやすい変更があると思ってたんだ。こういう小さなツールやプロジェクトだと、またアクティブに注目するまでに数ヶ月から数年かかるかもしれないし(単に使わなくなるかもしれないから、関係ないけど)。

フレークにはvimrcがバンドルされたnvimが入ってると思ってたんだけど。そうすれば、nix develop環境でnvimを開くだけで、最小限のジャーナリング環境ができるよね(cdしたときにdirenvみたいなものでアクティベートすることもできるし)。

blosxomを復活させてほしいな: https://en.m.wikipedia.org/wiki/Blosxom

todoアイテムが2-3語だけだったらいいのにな。例を見た感じでは問題なさそうだけど、実際のデータだとどうなるかは怪しいね。

まだ詳しい記事は読んでないけど、ちょっとした話としてTODOリストは「動詞 名詞 [- 説明]」にしてる。- 牛乳を買う - 医者に電話 - 肩 - 整備士に電話 - ヘッドガスケット 簡潔にすることで、すぐに見返せるのが助かる。すぐに見返せるから、すぐに実行できるんだ。

なんか「nix宗教」ってよく聞くけど、これって何なの?

Nixは、過去20年と未来20年が同時に存在するようなコンピューティングの形だね。大好きだよ。正直に言うと、これはコンピュータや環境を構築するための決定論的な方法なんだ。pipやuv、packages.lockみたいな感じで、すべてに対して使えるんだよ。

これはnodeやnpm、pythonとかを使う人向けだと思う。開発環境やツールが最初からうまくいかないことが多いし、みんなが互換性のないパッケージを使ってるからね。

ここで「tangled.sh」について考え込んでるけど、これがこの投稿の全てのポイントかもしれないね。

フォローしてる開発者たちがBlueSkyで結構話してるのを見たよ。これはATProto(BlueSkyの基盤技術)上に構築されたソーシャルGitホストだよ。: https://blog.tangled.sh/intro

うん、これはいいブログ記事だし、このサービスの素晴らしいプレゼンだね。昨日、次のGitHubをどこで探すかについて話し合いがあったよ。

Nixって、ブロックチェーン上のOSみたいに感じるんだよね。検証可能性を最優先にするならいいけど、開発環境を頻繁にいじる人にはかなり負担になると思う。でも、いい discipline を教えてくれるかもしれないね。

普通のLinuxディストリビューションでnixパッケージマネージャを使う妥協をしたんだ。自分が気に入ってる機能はほとんど揃ってるし、ほぼデメリットがないよ。

NixOSは自分の環境を進化させるのに最高だと思ってる。configuration.nixを更新して、sudo nixos-rebuild switchを実行するだけ。終わり!どんな「調整」をしてるの?新しい環境を試すためにnix-shellを使うこともできるよ。気に入ったら、shell.nixファイルを作って宣言的にすることもできるし。もっと進めたいなら、フレークを作ることも考えてみて。まずは https://nix.dev/concepts/flakes.html を読んでみることをおすすめするよ。

Nixは常にブロックチェーン上のOSって感じがしてた。検証可能性を最優先にするならいいけど、開発環境を頻繁に調整する場合はかなり面倒になるよね。Nixでは「開発環境」をプロジェクトごとに特定できる。普通のシステムではコンパイラやライブラリをインストールするけど、Nixでは開発環境を孤立させて記述できる。(Dev Containersも似たような効果を持ってるね)。君のコメントをこう言い換えたいな:NixOSは実用的じゃない。設定を変えてサービスを再起動するだけじゃなくて、NixOSの設定を変えて、それを再構築して、更新された設定に切り替えなきゃいけない。-- NixOS(とNix)は「今のうちに全ての努力を注いで、後で楽をする」って考え方をサポートしてると思う。もし誰かがプロジェクトのためにnix-shellやdevenvファイルを書いてくれたら、動く開発環境を整えるのに追加の努力は必要ないよ。(Devenvは「services.postgres.enable = true」みたいな設定で、動くDBを得るためにdocker-composeよりも使いやすいのが特徴だね)。

ノートパソコンとゲーミング/ホームサーバーのデスクトップで完全にNixOSに移行したよ。めっちゃ好きだし(嫌いな部分もあるけど)、もう「宣言的じゃない」ものには戻れない。後悔はゼロ。ただ、実際のメリットは投資した時間に見合わないから、趣味として楽しむのがいいと思う。Silverblue/Bazziteみたいな不変のデスクトップが一番いい感じだね。Nix(OSじゃない)を使って開発環境を定義するのは?素晴らしい、すぐにおすすめできるよ。プロジェクトを開いて、必要な依存関係の正確なバージョンが揃ってるって分かるのはすごくリフレッシュできるし、公開されてるgitリポジトリにflake.nixがあって、nix runでプロジェクトを一発でダウンロード/ビルドできるのは本当に魔法みたい。

カレンダーに週番号を表示したいなら、ncal -wを使えば、最後の行に表示されるよ。-3を追加すると、こんな感じになる:$ ncal -w3 2025年7月 2025年8月 2025年9月 Mo 7 14 21 28 4 11 18 25 1 8 15 22 29 Tu 1 8 15 22 29 5 12 19 26 2 9 16 23 30 We 2 9 16 23 30 6 13 20 27 3 10 17 24 Th 3 10 17 24 31 7 14 21 28 4 11 18 25 Fr 4 11 18 25 1 8 15 22 29 5 12 19 26 Sa 5 12 19 26 2 9 16 23 30 6 13 20 27 Su 6 13 20 27 3 10 17 24 31 7 14 21 28 27 28 29 30 31 31 32 33 34 35 36 37 38 39 40

-bフラグを使うと、calから期待される形に戻せるよ。その形だと週の列が読みやすいと思う:w| Mo Tu We Th Fr Sa Su 31| 1 2 3 32| 4 5 6 7 8 9 10 ncalの-wはISO-8601に準拠してる¹ってのも注目すべきかも。新年の時期に週番号が12月や1月でリセットされることに驚く人もいるかもしれないしね。(自分のロケールに合った週の初めの日を得るために、calを「ncal -wb」にエイリアスしてる人として言ってるよ。)¹ https://en.wikipedia.org/wiki/ISO_week_date

似たようなことをオーグモードで数年やってたけど、今はペンと紙に戻ってるよ。

Org-modeはめっちゃ過小評価されてるけど、ノートを取るための最高の手段だと思う。柔軟性がすごくて、Org-roamや似たような代替手段を使うと、ノートの整理方法を考える必要すらなくなる。何かを書いたら、それが絶対に失われないって分かってるから安心だし。カレンダーの日付だけでノートを整理するのは理想的じゃないと思ってる。例えば「去年の10月にボブと負荷テストの話をしたっけ?」なんて考えない。代わりに、ボブにタグを付けて「負荷テスト」のタグをノートに追加すると、それがOrg-modeのデートツリーのアウトラインに自動で整理されるから、いつでも見つけられる。ボブや「負荷テスト」、日付を通じてでもね。記事にあるように、ノートはプレーンテキストだから、簡単に同期したり、バージョン管理やバックアップ、他の自動化ができる可能性が広がる。実行可能なソースブロックやPDFの注釈、LaTeXの埋め込み、素晴らしいLLM統合、スプレッドシートのような計算、出版機能など、他にもたくさんの機能がある。私にとって、ペンと紙じゃないなら、Org-modeじゃなきゃダメだ。Org-modeを見つけるまでにいろんなアプローチを試したけど、今はEmacsやOrg-modeが難しいと感じるなら、ぜひこの本を読んでみて。「スマートノートの取り方」ISBN-10: 1542866502。

17年間、時々日記をつけてるんだ。他に同じようにやってる人は知らないから、私の方法を紹介するね。日記専用のメールアカウントを作ったんだ。私は個人的にGmailを選んだけど、Googleが信頼できないなら他のプロバイダーやセルフホスティングを使ってもいいよ。毎日の終わりや気が向いたときに、そのアカウントにログインして、自分自身にその日の出来事や思っていること、感じていることをメールするんだ。件名には日付を入れて、「2025年8月12日」みたいにしてる。絶対にそのアカウントから他の何かにメールを送ったり、何かに接続したり、他の用途には使わない。完全に孤立した存在なんだ。その結果、17年間の簡単に検索できる日記ができた。パスワード保護されてて、バックアップも取ってあって、インターネットがあればどこからでもアクセスできるし、物理的な日記のように「失くす」こともない(Googleを信頼してるのはわかってるけど、心配ならセルフホスティングすればいいし)。誰かが私のものを探って見つけることもない。どれだけの価値を得たかは言えないよ。忘れてしまったことを忘れていることもあるし、人生の中の小さな瞬間や日々がたくさんある。昔の自分が考えていたことや感じていたことに驚くこともあるし、何年も思い出さなかった素晴らしい日々に驚くこともある。自分が時間とともに変わっていく記録でもあるし、通ってきたフェーズを示している。これを強く勧めるよ。あまり規律も必要ないし、やらなきゃいけないことじゃない。気が向いたときにやるんだ。年によっては25回しか書かないこともあれば、200回書くこともある。書きたい気持ち次第だね。感情的な時期、特に悪い時期には書くことが多いけど、素晴らしい日々もたくさん書いてるよ。

自分のプールに毎晩投げ込むメッセージボトルみたいだね。いいね。

前の日の編集とかする?メールだと難しそうだね。

なんで17年前にこれを思いつかなかったんだろう。

この意見、めっちゃ好き。私も似たようなことをしてるんだけど、日記は完全に孤立してる。日記のエントリーには音声メモを録音してる。これだと早くできるし、運転中や歩いてる時でもできるからね。感情をもう少しキャッチできる気もする。これを20年くらいやってるけど、去年からはノートを整理して書き起こすためのPythonアプリを作ってる。

犬の散歩中にも似たようなことをしてるよ。Androidのスマホに原始的な音声録音アプリがあって、数年前に見つけた時の唯一の条件はmp3ファイルに直接録音できることだったけど、今はそれは関係ない。とにかく、歩きながらスマホに話しかけるだけ。録音されるし、何年もたくさんの録音を集めてきたけど、ほとんど役に立たなかった。最近になってやっと役立つようになった。今はResilioを使って(理由はバカバカしいけど、Syncthingじゃなくて、こっちも良い代替手段だよ)、音声メモを同期してる。そして、whisper.cppに接続したスクリプトがあって、そのスクリプトは単にテキストに変換してくれる。技術的には、字幕ファイルを作成するんだ。なんで字幕ファイルかって?.srtファイルを使うと、ノートをgrepできるだけじゃなくて、エディタでカラオケスタイルで再生できるから。Emacsにはそれを可能にするsubedモードがあるし、タイムスタンプや他のメタデータを簡単に隠して、テキストだけに集中できる。間違ったテキスト認識を修正したり、自分のコメントを追加したりもできる。

2000年代初頭から日記をつけたりつけなかったりしてるけど、長続きしたことはない。数週間で大体やめちゃう。書いたことがあまりにも些細に感じるから。そんな時、ある生産性の本を読んでたら、成功の基準を異常に低く設定するってトリックを見つけた。最悪の日でもクリアできるくらい低く。そこで登場したのが「ワンライン日記」。目標は毎日たった一行を書くこと。そうしたら、ほとんどの日に最初の文の後にいくつかの文が続くことが分かった。時にはもっとたくさん。ここ2.5年、ほぼ毎日続けてる。基準を低く保つために、毎朝新しいファイルを作って真っ白な状態から始めるようにしてる。その新しいページがさらにハードルを下げてくれる。すべてVimでこの小さなエイリアスでやってる:oneline='printf "## $(date +"%Y") \n \n#" >> /path/to/folder/year/$( date +"%Y-%j-%b-%d" )_ol-jrnl.md && vim +$ /path/to/folder/year/$( date +"%Y-%j-%b-%d")_ol-jrnl.md' 特に fancyなことはないけど、自分には合ってる。

嫁がそれやってるんだよね。今日から俺も始めるわ、君の投稿読んで。前に言ってたけど、全然理解できなかったんだよね。ハンドルがついてるからかな。

これはVimと一般的なUnixのテキスト処理の素晴らしい入門だね。最初に読んだとき、Vimwikiやorgを使えばいいのにって思ったけど、ここでのアプローチがすごく好きだ。シンプルで頑丈だし、Vimの組み込みの略語や構文ハイライトを活用するのもいい感じ。

Nixがセットアップに重要な理由を聞くコメントが来るだろうなって思ってた。こういうことにはNixが好きだよ。シェルスクリプトはデフォルトで隔離がひどいけど、Nixがシェルスクリプトを組み合わせる方法だと、スクリプトのPATHには必要なものだけが入ってるって自信を持てるのがいいよね。