[[📒Productivityを上げるために大切な100のこと]] No75. 🥇
----
これまでにいくつか自身の環境をカスタマイズすることで[[プロダクティビティ]]を上げる方法を紹介してきた。しかし、これらが==再現不能な秘伝のタレ==となってはいけない。必要に応じて、その環境を容易に構築できるようにしておくことはとても大事だ。
## 頻度と用途を見極める
こういう話をすると、なんでも **『ポチッとすればすべて自動で環境構築!』** という話にしたくなる人もいるだろう。ただ、本当にそれがコストパフォーマンスの良い選択なのかは別の話だ。というのも、==[[冪等性]]を担保した全自動処理のメンテナンスは非常にコストがかかることが多い==からだ。
毎日構築する環境であれば、全自動を目指す価値はあるだろう。一方、月に1度、年に1度といった頻度であれば、**迷わずに短時間で**構築できさえすれば、いくつか手動オペレーションが入ったところで実害はほぼゼロだ。
私のメインマシンは[[Windows]]だが、買い替えの頻度は数年に1度.. 仕事とプレイベートの両方を考慮しても年に1回程度だ。なので、[[冪等性]]の担保や全自動であることにそこまで重きを置いていない。
## 筆者が構築した仕組み
私が構築する場合に利用しているシステムを紹介しよう。[[🦉owl-playbook]]というリポジトリを作成し、メンテナンスしている。自分しか使わないのでREADMEは日本語で書いている。一読してもらえれば手順は分かると思う。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/owl-playbook: Playbook both Linux and Windows for me</p>
</div>
<div class="link-card-description">
Playbook both Linux and Windows for me. Contribute to tadashi-aikawa/owl-playbook development by creating an account on GitHub.
</div>
</div>
<img src="https://opengraph.githubassets.com/37a5ec93f688b4480a3675b0bbb389306103605018520b2b5ff8be922e2b6966/tadashi-aikawa/owl-playbook" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/owl-playbook"></a>
</div>
構成は以下のようになっている。すべてを表示するとかなりの行数になってしまうので深めの階層はいくつか省略させてもらった。全容は上記リポジトリを見てほしい。
```bash
.
├── LICENSE
├── linux # Linux環境構築用
│ ├── ansible
│ │ ├── ansible.cfg
│ │ ├── local
│ │ ├── Makefile
│ │ ├── roles
│ │ │ ├── clitool # インストールするCLIツール
│ │ │ ├── core # Linuxのcoreなツール
│ │ │ ├── dependency # 他roleの依存関係
│ │ │ ├── editor # インストールするエディタ
│ │ │ ├── font # インストールするフォント
│ │ │ ├── language # インストールするプログラミング言語
│ │ │ ├── link # シンボリックリンク設定
│ │ │ ├── package_manager # 必要なパッケージマネージャー
│ │ │ └── terminal # ターミナルに必要な設定
│ │ └── wsl-ubuntu.yml # WSL上のUbuntu環境をセットアップする設定
│ ├── lubuntu-base
│ │ └── Vagrantfile
│ ├── lubuntu-jp
│ │ ├── provision.sh # Lubuntu日本語版をイメージから構築する (今は使っていない)
│ │ └── Vagrantfile
│ └── ubuntu
│ ├── provision.sh # Ubuntuをイメージから構築する (今は使っていない)
- [ ] │ └── Vagrantfile
├── mnt # 複数マシンで同期(mount)するためのディレクトリ (シンボリックリンクを利用)
│ ├── common # Window/Linux共通
│ │ ├── IntelliJIdea
│ │ │ └── config # IntelliJ IDEAの設定
│ │ │ ├── codestyles
│ │ │ ├── colors
│ │ │ ├── inspection
│ │ │ ├── keymaps
│ │ │ ├── options
│ │ │ └── templates
│ │ └── VSCode
│ │ └── User # VSCodeの設定
│ │ ├── keybindings.json
│ │ ├── settings.json
│ │ └── snippets
│ ├── linux # Linux用
│ │ └── ubuntu
│ │ └── broot.toml # Ubuntu用Brootの設定
│ └── windows # Windows用
│ ├── broot.toml # Brootの設定
│ ├── keypirinha # Keypirinhaの設定
│ │ └── User
│ │ └── Keypirinha.ini
│ ├── power-shell # PowerShellの設定
│ │ ├── fukurou.jpg
│ │ └── Microsoft.PowerShell_profile.ps1
│ ├── terminal # Windows Terminalの設定
│ │ └── LocalState
│ │ └── settings.json
│ └── wsl # WSLの設定
│ └── ubuntu.png
├── README.md
├── task # Taskで実行するレシピ
│ ├── Taskfile_template.yml
│ └── Taskfile_windows.yml
└── windows # Windows環境構築用
├── go
│ └── install.ps1 # Go言語のツールインストール
├── idea-files.txt # IntelliJ IDEAで同期する設定を指定するファイル
├── npm
│ └── install.ps1 # npmのツールインストール
├── provision.bat # Windowsの環境構築スクリプト
├── scoop
│ └── install.ps1 # Scoopで管理されたツールインストール
├── ubuntu # WSLのUbuntuのprovisioning用スクリプト
│ ├── config.xlaunch
│ ├── provision.ps1
│ └── provision.sh
├── vscode-extensions.txt # VSCode拡張のインストールリスト
└── windows-home-dots.txt # Windowsで読み込むドットファイルのリスト
```
環境を変えるとき多少フットワークは落ちるが、いつでも同じ状態を再現できる安心感と引き換えなら悪くない話である。もちろん、タイミングによっては動かなくなって修正する必要が出るケースもあるが..。
## キーバインド
[[🦉owl-playbook]]では1つだけ対応できていないことがある。キーバインドの設定だ。これには[[🦉Spinal reflex bindings template]]を使っている。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/spinal-reflex-bindings-template: This repository is the Autohotkey KeyCustomized Project which is applicable to only mine.</p>
</div>
<div class="link-card-description">
This repository is the Autohotkey KeyCustomized Project which is applicable to only mine. - GitHub - tadashi-aikawa/spinal-reflex-bindings-template: This repository is the Autohotkey KeyCustomized...
</div>
</div>
<img src="https://opengraph.githubassets.com/d2e25f4153fafc9f1bb60875179e414a7fc34f1fdf92da71bda692a1141ce3d0/tadashi-aikawa/spinal-reflex-bindings-template" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/spinal-reflex-bindings-template"></a>
</div>
この件は前回の🥇であるNo.50にて詳しく触れている。興味があれば [[📗共通キーバインド戦略を採用する]] を読んでほしい。
## 最適環境をどこでも作れるように
以上のような仕組みを[[GitHub]]などのバージョン管理システムで構築し、できるだけ[[冪等性]]を持ちつつ自動化しつつも、コストパフォーマンスのバランスがいい点に落とし込む。これさえできていれば、マシンの乗り換えは容易になり、リポジトリが本体になる。
> アメリカ西部のカウボーイたちは、馬が死ぬと馬はそこに残していくが、どんなに砂漠を歩こうとも、鞍は自分で担いで往く。
馬は消耗品であり、鞍は自分の体に馴染んだインタフェースだからだ。
いまやパソコンは消耗品であり、キーボードは大切な、生涯使えるインタフェースであることを忘れてはいけない。
(東京大学 名誉教授 和田英一)
> [Happy Hacking Keyboard \| PFU](https://happyhackingkb.com/jp/) より引用
[[HHKB]]生みの親、[[👤和田栄一]]先生の名言だが、自身の環境構築も似たようなものなのかもしれない。