📝

ジャーナリングを暗号化してGitHubで管理

2023/11/03に公開

ジャーナリングとは

ジャーナリングとは、頭に浮かんだ考えや感情をそのまま紙に書くことで、自己理解を深めて、ストレスを軽減し、メンタルを向上させる手法です。「書く瞑想」とも言われてるらしいです。

日記は「その日の出来事や行動を記録する」のに対して、ジャーナリングは「自分の状態や感情に気づく」ことが主な目的です。

https://www.shizensyokuhin.jp/archives/articles/1139

私自身も、仕事や勉強におけるモチベーションを高めるためにジャーナリングを始めました。しかし、エンジニアとして、紙にジャーナルを書くのではなく、vimで書き、gitで管理しています。

また、ジャーナリングには、「内容を他人に見せない」というルールがあります。これは、自分のネガティブな感情や考えもオープンに書き出すことが求められるため、他人の目に触れないようにする必要があるからです。

しかし、私はgithubの草を生やすためにリポジトリはpublicにしたいというポリシーがあります。それに、ジャーナリングを継続出来ている自分をみんなに知ってもらいたいという自己顕示欲もあります。

そこで、ジャーナリングの内容を暗号化することにしました。これにより、ジャーナリングの内容自体は隠しつつ、リポジトリをpublicに出来ます。副作用として、githubのプロフィールの草も生やすことが出来てしまいます。


ジャーナリングを毎日継続すればこうなれる

プロセス

具体的なプロセスは以下の通りです

  1. ジャーナリングを書く
  2. ジャーナリングの内容をgit-secretで暗号化
  3. 暗号化した内容をpush

git-secret

git-secretは、指定したファイルの内容を暗号化して、publicリポジトリ内で秘密情報を管理出来るツールです。また、許可した人のみが復号出来るので、チームでの秘密情報の共有も実現できます。

ファイル暗号化の流れ

git-secretgpg(GNU Privacy Guard)を利用するので、まずgpgをインストールします。

brew install gnupg

次に、gpg公開鍵・秘密鍵を作成します。

--full-gen-key

次に、git-secretでファイルの暗号化を行います。まずはgit-secretをインストールします。

brew install git-secret

以降の作業は、対象のgitリポジトリ内で行います。
まず、.gitsecretディレクトリを生成します。

git secret init

次に、暗号化・復号化を行うユーザのメールアドレスを入力します。今回は自分のメールアドレスのみ追加します。

git secert tell [メールアドレス]

リストに追加されたユーザは以下のコマンドで確認出来ます

git secret whoknows

また、ユーザをリストから削除したい場合は、以下のコマンドでユーザを削除できます。

git secret removeperson [メールアドレス]

次に、暗号化したいファイルをgit secretに追加します。
また、暗号化したいファイルはgitignoreにも追加する必要があります。

echo "journal.txt" > .gitignore
git secret add  journal.txt

次に、先ほど追加したファイルを暗号化します。これにより、拡張子.secretの暗号化ファイルが生成されます。

git secret hide

この先は通常のgithubリポジトリへのpushを行います。

git add journal.txt.secret
git commit -m "add secret file"
git push

これにより、ファイルを暗号化してリポジトリにpushすることができました。

スクリプト化

上記の流れを毎回やるのは流石に面倒なので、一連の処理をシェルスクリプトにまとめ、ジャーナルの生成からpushまでを最低限の動作で行えるようにします。

まずは、ジャーナルファイルを生成してvimで開くスクリプトを作成します。

create_journal.sh
#!/bin/zsh

year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)
time=$(date +%H:%M)
day_of_week=$(date +%A)
user=$(whoami)
date_string="$year-$month-$day"
date_week_string="$year-$month-$day $time ($day_of_week)"

header="/* *************************************************** */\n"
header+="/*                                                     */\n"
header+="/*   $date_week_string                         */\n"
header+="/*                                                     */\n"
header+="/*   By: $user                                    */\n"
header+="/*                                                     */\n"
header+="/* *************************************************** */\n"

file_path=[リポジトリへのパス]/$year/$month/$date_string.txt

if [ -e "$file_path" ]; then
    echo "File $file_path already exists."
    vim "$file_path" +9
else
    mkdir -p $(dirname "$file_path")
    touch "$file_path"
    echo "$header" >> "$file_path"
    echo "\n" >> "$file_path"
    vim "$file_path" +9
fi

全くの白紙にジャーナルの書くのは寂しいので、ファイルヘッダーを作ってみました。


こんな感じのファイルを生成します


ジャーナルを書き終わった後、ジャーナルを暗号化してpushする作業をスクリプト化します。

push_journal.sh
#!/bin/zsh

year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)
date_string="$year-$month-$day"
journal_file=[リポジトリへのパス]/$year/$month/$date_string.txt

cd "[リポジトリへのパス]"

git secret add "$year/$month/$date_string.txt"
git secret hide

git add "$year/$month/$date_string.txt.secret"
git commit -m "Journal entry for $date_string"
git push

echo "Journal entry for $date_string is committed and pushed."

これにより、ジャーナルを生成してpushする操作を、以下の2つのコマンドで行えるようになりました。

sh create_journal.sh # ジャーナルを生成して書く
sh push_journal.sh # ジャーナルを暗号化してリポジトリにpush

まとめ

ジャーナリングを行うことで自分の目標や課題を意識しやすくなったり、自分を客観視出来るようになるので、是非みなさんにもオススメしたいです。
ちなみに、ジャーナリングは本来「紙に書くこと」が重要らしく、ペンとノートで書くことが推奨されているらしいです。

参考文献

https://qiita.com/jqtype/items/9b0524baa4b7fe6dbde0

https://sobolevn.me/git-secret/

Discussion