はじめてのdotfiles

自身の開発環境を保存するdotfilesについて学んでいます。

まだ初心者なので間違っている部分もあるかと思いますが、ざっくりと、dotfilesがどんなものなのか、どんなメリットがあるか、また、dotfilesで管理するファイルにはどんなものがあり、それぞれどんな役割なのかを調べました。

プログラミング初学者の方、dotfilesについてまずは知りたいという方向けの内容です。


# dotfilesって何？

- 設定ファイルを管理するリポジトリのことである。
- Unix系OSにおいて、設定ファイルが`.`（ドット）から始まる隠しファイルに保存されていることが名前の由来となっている。
- シェル、エディタ、アプリケーションなど、さまざまな開発環境の設定をバージョン管理するのが目的。
- 主に、Githubリポジトリにアップロードすることで、バージョン管理する。
- 買い替えや転職など、使用するPCが変わった際に、dotfilesを活用することで、環境構築の時間を大幅に短縮することが可能となる。


# dotfilesに関わるワード

##### `シェル`
- shell（シェル）とは、ユーザーとコンピュータのOSを繋ぐためのプログラム。
- シェルは、OSの中核を成すKernel（カーネル）とのやり取りを行う。
- 例えば、ユーザーがコマンドを入力すると、シェルがそのコマンドを受け取り、カーネルに指令を送る。受け取ったカーネルがそれに応じたアクションを、シェルに返し、シェルがユーザーに処理結果を送り、表示させる。
- シェルの設定をdotfilesに保存したりする。
- 主要なシェルとして`bash`、`zsh`、`fish`の3つが挙げられる。

https://zenn.dev/json_hardcoder/articles/c3b1d7fc166559

##### `カーネル`
- Kernel（カーネル）は、コンピュータのOSにおける基本機能を担う中核的なプログラムのこと。
- ハードディスク（HDD）、メモリといったコンピュータの資源を管理する役割がある。
- アプリケーションとハードウェアの架け橋といった表現もできる。

##### `シェルスクリプト`
- シェルスクリプトは、OSを操作するためのスクリプト言語のことである。
- シェル上で実行することができる。
- 一般的にはLinuxなどの、UNIX系OSのシェルで実行するスクリプト言語である。

##### `エディタ`
文章を記述したり編集したりするツールのこと。プログラミングで使うエディタの例としては、Microsoft社が提供する`VSCode`であったり、`Vim`（ターミナルからコマンドを打ち込むことで利用できるCLIテキストエディタ）などがある。

##### `CLI`
CLI （Command Line Interface：コマンドラインインターフェース）の略称。MacのターミナルやWindowsのコマンドプロントなどがCLIの例である。`pwd`とか`ls`とか`cd`などはCLIコマンドとしてよく使われるコマンドである。CLIの同義語としてCUI（キャラクターユーザーインターフェース）がある。CLIはCUIどちらでも同じで、英語圏ではCLIで使われることが多いらしい。対義語として、マウスを使って画面上で直感的な操作を実現する技術をGUI（Graphical User Interface：グラフィカルユーザーインターフェース）と呼ぶ。

##### `バージョン管理`
- ファイルの編集日時、編集者、場所といった変更履歴の情報を記録すること。
- 主な例としてGitを使ったバージョン管理がある。
- dotfilesをGithubリポジトリにアップすることで、環境構築の設定を、状況に応じて修正していくことができる。

##### `SSH（~/.ssh）`
- Secure Shell（セキュアシェル）の略称の通信プロトコルである。
- SSHは公開鍵暗号を利用し、共通鍵を暗号化して鍵交換を実施する。
- FTPなどの従来の通信プロトコルに比べて、セキュリティの観点から推奨されてきている。
- パスとしては`~/.ssh`に保存されることが多い(Linux OS、Mac OSの場合)。
- sshファイルは秘密情報なので、dotfilesで管理してはいけない。

##### `AWSファイル（.aws）`
- AWS共有認証情報ファイルのこと。
- ユーザーのキーが暗号化された形式で保存されている。
- ユーザーのホームフォルダ(Windowsの場合は`C:\Users\username\.` に、`aws`や`Linux`の場合は `~/.aws` ) に配置される。
- ssh同様、秘密情報なので、dotfilesで管理してはいけない。

##### `シンボリックリンク`
- 元のファイルがあるパスは別のところだが、別の場所から参照できるようにする仕組み。
- Windowsで言うところのデスクトップに作成するファイルの`ショートカット`のこと。
- UNIX系OSでは`シンボリックリンク`の名称で語られる。
- Mac OSでは`エイリアス`と呼ぶこともある。

引用：参考：<a href="https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/specifying-your-aws-credentials.html">AWS 認証情報の使用｜AWSユーザーガイド</a>



# dotfilesで管理するさまざまな設定

> - シェルの設定(~/.bashrc, ~/.zshrc, ~/.config/fish, etc)
> - エディタの設定(~/.vimrc, ~/.emacs.el, ~/.config/Code/User, etc)
> - ターミナルの設定(~/.config/alacritty, etc)
> - CLIツールの設定(~/.tmux.conf, ~/.gdbinit, etc)
> - アプリの設定(~/.i3, ~/.autokey, etc)
> - gitの設定(~/.gitignore_global, etc)

引用：<a href="https://qiita.com/yutkat/items/c6c7584d9795799ee164">ようこそdotfilesの世界へ</a>

# dotfilesで管理しないほうがよいファイル

こちら、参考サイトのほうが分かりやすいので引用させていただきます。

> 常に自動で更新されるファイル（履歴やキャッシュ等）
.bash_history .zsh_history .zcompcache .zcompdump .viminfo .emacs.d/history 等

> バックアップファイル
*~ *.swp 等

> 環境に大きく依存する設定（参考: Tips）
環境変数 PATH や LD_LIBRARY_PATH 等に明らかに環境固有の場所を追加するとき
CUDAの設定

引用：<a href="https://qiita.com/rainbartown/items/d7f59fe4047733c14e8b">どこでも動く dotfiles の作り方</a>


> `認証情報が入っているディレクトリ`は `絶対にdotfilesにて管理しない`こと
.ssh, .aws等

引用：<a href="https://qiita.com/yutkat/items/c6c7584d9795799ee164">ようこそdotfilesの世界へ</a>




## dotfilesで管理するファイルに関するワード

##### `シェルの種類`
- シェルの種類には、いくつかある。
- `sh` `bash` `ksh` `csh` `tcsh` `zsh`などがある。
- `sh`が有名なシェルである。


##### `bash`
- シェルの設定ファイルの一種である。
- `sh`をパワーアップしたシェルである。
- Bourne Again Shellの略称である。（覚えなくても良い。）

##### `~/.bashrc`
- シェルの設定ファイルの一種である。
- bashを起動した際に読み込まれる設定ファイルのことである。
- `rc` は `Run Commands` を意味する。
- `~/.bashrc`は、ホームディレクトリ直下にある。
- コマンド`cd`で移動するホームディレクトリ直下にある隠しファイルである。
- コマンド`ls -a`を叩くと隠しファイルが確認できる。

##### `~/.zsh`
- `rc`は前述の通り`run commands`なので、zshというシェルを実行するコマンドのことである。
- `「ズィーシェル」`と読むっぽい。（「ゼットシェル」でも良いのかな？）
- zshの設定ファイルにもいくつか種類がある。
- `.zshrc` `.zshenv` `.zprofile` `.zlogin`など。zshにも種類がある。
- 基本は`.zshrc`を使えば良いっぽい。

##### `fish`
- bashやshなどのように、シェルの一種である。
- `friendly interactive shell`の略称である。
- GUIで、カラーテーマやプロンプトの設定が簡単にできるのが特徴。
- パスは`.config/fish/config.fish`のファイルに記述する。


##### `vimrc`
- テキストエディタ`Vim`を設定するファイル。
- パスは`~/.vimrc`に保存される。
- デフォルト状態から使いやすいようにカスタマイズできる。

##### `Emacs`
- UNIX系OSでよく利用されるテキストエディタである。
- 作成したスクリプトは「.el」の拡張子ファイルに保存できる。
- ルートディレクトリ直下だと`~/.emacs.el`になる。

##### `Alacritty`
- `Alacritty`は`Rust`で書かれたGPUをレンダリングに使う高速な`ターミナルエミュレータ(端末エミュレータ)`である。
- 読み方は「アラクリッティ」でよさそう？
- `Alacritty`は`yaml`で環境設定を行う。
- GUIは用意されていない。
- `~/.config/alacritty`に保存する。

引用：<a href="https://kazumaxneo.hatenablog.com/entry/2018/08/15/142326">高速な端末エミュレータ Alacritty</a>


##### `tmux`
- `tmux`は、CLIツールの設定のことである。
- `Terminal MUltipleXer（ターミナルマルチプレクサ）`の略称である。
- `~/.tmux.conf`ファイルで tmux の挙動をカスタマイズする。
- > Linux 系のターミナル画面を複数のセッション、ウィンドウ、ペインに分割して利用することができます。

引用：<a href="https://www.tohoho-web.com/ex/tmux.html">とほほのtmux入門</a>

##### `autokey`
- `autokey`はキーバインドを設定できるようにするソフトウェアである。
- ※キーバインド設定とは、キーを押した時の機能を割り当てることである。
- Linuxでは利用できないカーソル移動などのショートカットを実現するなど、操作性を向上させる意味で導入する価値がある。


##### `~/.gitignore`

- `gitignore`や、`gitignore_global`は、Git管理の対象から外したりといった設定を記述するファイル。
- 常に無視したいファイルをここに記述することにより、Gitの管理下から外すことができる。
- コミットの対象から外れるので、Githubリポジトリに誤ってプッシュしてしまい、履歴が残ってしまうことがなくなる。
- 例えば`.DS_Store`ファイルは、WindowsとMacで必要・不要が分かれるため、環境によっては邪魔になってくる。なので、.gitignoreに記述することでGit管理の対象外にしたりする。


# 参考サイト

https://ramble.impl.co.jp/2755/

https://qiita.com/yutkat/items/c6c7584d9795799ee164

https://qiita.com/rainbartown/items/d7f59fe4047733c14e8b

https://backlog.com/ja/git-tutorial/intro/01/

https://original-game.com/how-to-make-dot-files/

https://udemy.benesse.co.jp/development/system/shell.html

https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/specifying-your-aws-credentials.html

https://improve-future.com/what-does-rc-in-bashrc-and-vimrc-stand-for.html

https://nonakayasuo.com/zshrc/

https://note.com/standenglish/n/ne9825624fe93

https://zenn.dev/lis2a/articles/6776002a034207

https://www.tohoho-web.com/ex/tmux.html

https://zenn.dev/skanehira/articles/2021-03-08-linux-autokey