lolcommitsで開発の思い出を記録する

[Ateam Finergy Inc. Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-finergy)、7日目はlolcommitsについてご紹介します。

# はじめに

lolcommitsは、`git commit`時に自動でノートPCのインカメラなどで写真を撮影するツールです。

公式サイトのサンプルを見ると雰囲気がよく分かると思います。

https://lolcommits.github.io/#samples

本記事では、lolcommitsのセットアップ手順や使い方などについて紹介していきます。

以下の環境を前提に記述しています。

- macOS Catalina
- Ruby 2.6.5

lolcommitsはLinux環境でも使えるようです。
Windows環境については「Here be dragons!」だそうです。…よくわかりませんが大変なようですね:pensive:

https://lolcommits.github.io/#install

# インストール

lolcommitsはRuby gemとして提供されているので、`gem`コマンドでインストールします:

```
$ gem install lolcommits
```

動作にImageMagickが必要なのであわせてインストールします。
ここではhomebrewを使います:

```
$ brew install imagemagick
```

これで`lolcommits`コマンドが使えるようになっているはずなので、確認してみます:

```
$ lolcommits --version
0.16.0
```

OKですね。

# 試し撮り

本格的に導入する前に、きちんと撮影できるか試し撮りをしておきます。
以下のコマンドで撮影できます:

```
$ lolcommits --test --capture --debug
```

デバッグメッセージがつらつらと出力されたあと、撮影した写真が表示されます。

ちなみに撮影した写真は`~/.lolcommits/test/`に保存されています。

## トラブル事例: 写真が真っ暗

筆者が遭遇したトラブルなのですが、撮影した写真が真っ暗になってしまいました。

![test-3665618437.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461/c76b23df-45e7-075f-778b-1426d0b773ac.jpeg)

これはカメラの明度調節が終わる前に写真を保存してしまっているのが原因です。
対策として`--delay`オプションが用意されています:

```
$ lolcommits --test --capture --debug --delay 1
```

![test-4561996553.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461/db31744d-d386-4a56-cc0a-c746da3ca556.jpeg)

うまくいきました。

もしまだきれいに撮れなければ`--delay`のあとの数字を増やしてみるといいかもしれません。
数字はカメラを起動してから撮影するまでの秒数です。

そのほかのトラブルはFAQを確認してみてください。

https://github.com/lolcommits/lolcommits/wiki/FAQ

# lolcommitsの導入

準備が整ったので、本格的にlolcommitsを導入します。

といってもいきなり既存の開発リポジトリにつっこむのは不安なので、まずはおためしのgitリポジトリを作ります:

```
$ mkdir lolcommits-sandbox
$ cd lolcommits-sandbox
$ git init
```

次に、今作ったリポジトリでlolcommitsを有効化します。
`lolcommits --enable`で有効化します:

```
$ lolcommits --enable --delay 1 --fork
installed lolcommit hook to:
  -> /Users/okonomi/src/local/lolcommits-sandbox/.git/hooks/post-commit
(to remove later, you can use: lolcommits --disable)
```

`lolcommits --enable`のうしろに試し撮りで追加した`--delay 1`と、新たに`--fork`オプションを追加しています。これは撮影時にプロセスをforkするようにするオプションです。
これを付けない場合、lolcommitsの撮影完了まで`git commit`が終了しなくなってしまいます。`--fork`を付けるとlolcommitsの撮影を待たずに`git commit`が終了するため、開発の邪魔になりません。

コミットしてみます:

```
$ git commit --allow-empty -m "hello lolcommits!"
[master 8048f6c] hello lolcommits!
*** Preserving this moment in history.
```

`*** Preserving this moment in history.`のメッセージが出ればlolcommitsが有効になっています。

撮影写真は`~/.lolcommits/[リポジトリ名]/`に保存されています。確認してみてください。

## lolcommitsを外したくなったら

もしlolcommitsを外したくなったら、`lolcommits --disable`で簡単に無効化できます:

```
$ lolcommits --disable
uninstalled lolcommits hook (from .git/hooks/post-commit)
```

無効化した状態でコミットしてみます:

```
$ git commit --allow-empty -m "goodbye lolcommits!"
[master 1277786] goodbye lolcommits!
```

`*** Preserving this moment in history.` のメッセージがなくなりました。

# オマケ: プラグインで遊ぶ

これまでの説明でlolcommitsの導入は完了です。
ここではオマケとして、プラグインで遊んでみます。

lolcommitsはプラグインで動作をカスタマイズできるようになっています。
初期状態でloltextプラグインがインストールされています:

```
$ lolcommits --plugins
Installed plugins: (* enabled)
 [*] loltext
```

## loltextプラグイン

loltextは写真にのせるテキストのフォントや位置、サイズをカスタマイズできるプラグインです。
これもサンプルを見るとわかりやすいです。

https://github.com/lolcommits/lolcommits-loltext

## loltextプラグインのセットアップ

それではloltextをセットアップしてみます。

プラグインの設定の前に、まずはloltextに指定するフォントをインストールします。
フォントのインストール方法はなんでもいいのですが、ここでは[homebrew-cask-fonts](https://github.com/Homebrew/homebrew-cask-fonts)を使います:

```
$ brew cask install font-noto-sans-cjk-jp
Updating Homebrew...
==> Downloading https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip
######################################################################## 100.0%
==> No SHA-256 checksum defined for Cask 'font-noto-sans-cjk-jp', skipping verification.
==> Installing Cask font-noto-sans-cjk-jp
==> Moving Font 'NotoSansMonoCJKjp-Regular.otf' to '/Users/okonomi/Library/Fonts/NotoSansMonoCJKjp-Regular.otf'.
==> Moving Font 'NotoSansCJKjp-Bold.otf' to '/Users/okonomi/Library/Fonts/NotoSansCJKjp-Bold.otf'.
==> Moving Font 'NotoSansCJKjp-DemiLight.otf' to '/Users/okonomi/Library/Fonts/NotoSansCJKjp-DemiLight.otf'.
==> Moving Font 'NotoSansCJKjp-Light.otf' to '/Users/okonomi/Library/Fonts/NotoSansCJKjp-Light.otf'.
==> Moving Font 'NotoSansCJKjp-Medium.otf' to '/Users/okonomi/Library/Fonts/NotoSansCJKjp-Medium.otf'.
==> Moving Font 'NotoSansCJKjp-Regular.otf' to '/Users/okonomi/Library/Fonts/NotoSansCJKjp-Regular.otf'.
==> Moving Font 'NotoSansCJKjp-Thin.otf' to '/Users/okonomi/Library/Fonts/NotoSansCJKjp-Thin.otf'.
==> Moving Font 'NotoSansMonoCJKjp-Bold.otf' to '/Users/okonomi/Library/Fonts/NotoSansMonoCJKjp-Bold.otf'.
==> Moving Font 'NotoSansCJKjp-Black.otf' to '/Users/okonomi/Library/Fonts/NotoSansCJKjp-Black.otf'.
🍺  font-noto-sans-cjk-jp was successfully installed!
```

フォントも好みで、Notoフォントにしました。

では改めてloltextを設定します:

```
$ lolcommits --config -p loltext
```

対話形式で設定を進めます。
設定内容は`~/.lolcommits/[リポジトリ名]/config.yml`に保存されます。こんなふうになりました:

```~/.lolcommits/lolcommits-sandbox/config.yml
---
loltext:
  :enabled: true
  :message:
    :color: 
    :font: "/Users/okonomi/Library/Fonts/NotoSansCJKjp-Thin.otf"
    :position: C
    :size: 30
    :stroke_color: none
    :uppercase: 
  :sha:
    :color: 
    :font: "/Users/okonomi/Library/Fonts/NotoSansCJKjp-Thin.otf"
    :position: S
    :size: 20
    :stroke_color: none
    :uppercase: 
  :overlay:
    :enabled: true
    :overlay_colors: 
    :overlay_percent: 
  :border:
    :enabled: false
```

この状態で撮影するとこうなります。

![4d534dc2126.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461/e0e2edf2-68d8-3d2b-cc52-65cc507c59e4.jpeg)

いいですね:thumbsup:

loltextの設定を調整するとき、いちいち対話形式で入力するのが面倒な場合は設定ファイルを直接編集してもいいです。
設定項目の詳細はREADMEを確認してみてください。

https://github.com/lolcommits/lolcommits-loltext#configuration

## その他のプラグイン

loltextのほかにもいくつかプラグインが公開されています。

https://github.com/lolcommits/lolcommits/wiki/Configuring-Plugins#and-now-the-plugins

Slackに写真を投稿するプラグインなんかもあるようです。チーム内で導入すると面白いかもしれないですね。

もちろん自分でプラグインを作ることもできます:muscle:

https://github.com/lolcommits/lolcommits-sample_plugin#developing-your-own-plugin

# 注意点

lolcommitsを使用する際の注意点としては、情報漏洩の危険があるかもしれない、ということです。

lolcommitsの性質上、あまり意識しない間に写真が撮影されます。おかげで気の抜けた不意の表情が撮れたりするのもlolcommitsを使う面白さのひとつです。
しかし気をつけないと、例えば画像アップロード系プラグインをお試しで導入したことを忘れていて公開領域(Twitterなど)に顔写真とコミットメッセージが垂れ流しになってた、なんてことになりかねません。
それが個人開発のOSSなら恥ずかしい思いをするだけで済むでしょうが、社内のプロジェクトで非公開情報を扱っていたりするとまずい状況になります。

そういった事故を未然に防ぐ対策として、lolcommitsを全面的に無効化する方法があります。

`LOLCOMMITS_CAPTURE_DISABLED`環境変数を設定しておくと、`git commit`時にlolcommitsが作動しなくなります:

```
export LOLCOMMITS_CAPTURE_DISABLED=true
```

必要に応じて設定してください。

# まとめ

lolcommitsのセットアップ方法とプラグインの使い方をご紹介しました。

筆者はかれこれ6年以上lolcommitsを使っています。本記事を書くにあたり久しぶりに`.~/lolcommits/`を覗いたところ、昔の写真がたくさん出てきて懐かしさでしみじみしてしまいました。
この壁は過去に住んでいたマンションかな、とか、これは実家かな、年末に帰省したときかな、ていうか6年前の自分痩せてるな…とか。
記事のタイトルに「思い出」と付けたのはそのためです。ぜひ皆さんもlolcommitsで開発の思い出を記録してみてください。