linuxインストールからの環境構築を自動化する

# 開発環境めんどくさすぎる問題

開発環境を整えるのが超絶めんどくさい。特に僕みたいにどの言語も中途半端で便利屋的な立ち位置の人にとっては特に。
はじめはarchで「全部pacmanで入るし、パッケージも自作できるマン」してたんだけど、ローカルの環境と開発環境は分けたくなった。そうすると、言語ごとのパッケージマネージャーがこんにちはしてきた。サーバーはubuntu？支給されたPCはMac?お家はarchで、たまにwindowsも使う、みたいになった。こんなの覚えられないし、管理しきれないよ！ってなった。
僕は怠惰なエンジニアになりたいので、楽をしたい。もう全部覚えるのは諦めた。そうだdotfileを作ろう。インストールなんて人間のする仕事じゃないんだ。でも情報は全て自分で管理するのだ。
ついでにxmonadとswayも管理する。
タイル型ウインドウマネージャーはいいぞ。ドットファイルで完結できるぞ！
IDEなんてもってもほかだ！あいつらは無駄に学習コストが高くて時代によって変わりすぎる。よって却下。スマホアプリ作るときだけ涙をのめ！

## OSインストール
ubuntuもmacも自動でインストールしてくれるが、archlinuxはしてくれないのでそのためにスクリプトを書いた。
https://gist.github.com/akihirof0005/63112922ad27b4b2322db06447b6557b
archの起動ディスクから

```bash
#todo:ユーザーを作成する部分もgistに加筆する
curl -O https://is.gd/qrbnNu
```

でダウンロードしたスクリプトを実行する。


## dotfileインストール
これだ！
https://github.com/akihirof0005/dotfiles

```zsh
cd ~
curl -L https://is.gd/TAG0yz | bash
```
自作スクリプト`.bin`と`.ssh`の環境はプライベートリポジトリのサブモジュール化してある。

###　dotfile インストール手順
```
#https://is.gd/TAG0yzのなかみ
git clone https://github.com/akihirof0005/.ssh.git
sudo chmod 0600 ~/.ssh/*
git clone --recursive git@github.com:akihirof0005/dotfiles.git
cd dotfiles
rm -rf ~/.ssh
bash link.sh
sudo chmod 0600 ~/.ssh/*
bash install.sh
``` 
はじめ、sshをhttpsの認証で単体で取ってきてssh認証に切り替えます。
みんな大好きlink.shで、ドットファイルをシンボリックリンクする。

### install.shの正体

```zsh
#!/bin/zsh

$HOME/dotfiles/install/systems.sh
# update Systems
$HOME/dotfiles/update/systems.sh
# Install some Languages
$HOME/dotfiles/install/ruby.sh
$HOME/dotfiles/install/rust.sh
$HOME/dotfiles/install/jvmLan.sh
$HOME/dotfiles/install/nodejs.sh
$HOME/dotfiles/install/haskell.sh
## install dein for nvim
$HOME/dotfiles/install/dein.sh
## install zinit for zsh
$HOME/dotfiles/install/zinit.sh
## some plugins for nvim CocInstall
$HOME/dotfiles/install/cocplugin.sh
## init install for nvim enviroment
alacritty -e nvim &
##swich to zsh
chsh -s /bin/zsh
exec zsh
```
ゴリゴリ環境を個別の環境の詳細はそれぞれのファイルにありますし、各公式サイトにもあります。
基本的に"一度打ったコマンドはスクリプトにしてしまえ"という精神です。
ハードコードしていいのと思うかもしれませんが、脳の記憶は基本的にハードコードなので、問題ありません。動かなくなったら公式サイトに飛んで新しい手順に書き直すだけです。  
個別はそのままにして、システムのinstallerを見てみます。

```bash
#!/bin/bash

if [ "$(uname)" == 'Darwin' ]; then
  echo "update system packages"
  softwareupdate --install --all
  echo "install brew package manager"
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  brew install neovim zip unzip git
elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
  if [ -e /etc/arch-release ]; then
    git clone https://aur.archlinux.org/yay.git /tmp/yay
    cd /tmp/yay
    makepkg -si
    cd ~/dotfiles
    yay -Syu
    paccache -r
    paccache -ruk0
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    cat ~/dotfiles/pkgname/yay.list | yay -S -
    cat ~/dotfiles/pkgname/pacman.list | yay -S -
  elif [ -e /etc/lsb-release ]; then
    sudo apt update
    sudo apt upgrade
    sudo apt autoremove
    sudo apt install git neovim zsh zip unzip autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev
  elif [ -e /etc/debian_version ]; then
    sudo apt update
    sudo apt upgrade
    sudo apt autoremove
    sudo apt install git neovim zsh zip unzip autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev
  elif [ "$(expr substr $(uname -m) 1 7)" == 'aarch64' ]; then
    pkg update
    pkg upgrade
    pkg install neovim openssh zsh  zip unzip git 
    termux-setup-storage
  fi
fi
```
ここでもゴリゴリ書いていきます。カーネル情報から、mac、linux(arch ubuntu debian termux/android) へと処理分岐していきます。
インストールするパッケージにはムラがありますが、必要になったら書き足せばオッケーです。

### updaterの正体
環境のインストールはもう終わりました。次はupdateします。これもinstaller同様抽象化します。
aliasで`update`コマンドを定義します。

```
alias update='zsh $HOME/dotfiles/update.sh'
```
正体は以下です。

```
#!/usr/bin/zsh
echo "##################################"
echo "##########DOTFILE UPDATE##########"
echo "##################################"
cd $HOME/dotfiles/
git pull
cd

# update Systems
echo "##################################"
echo "##########SYSTEM  UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/systems.sh
# Install some Languages
echo "##################################"
echo "#############RUBY UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/ruby.sh
echo "##################################"
echo "#############RUST UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/rust.sh
echo "##################################"
echo "##########SDKMAN  UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/jvmLan.sh
echo "##################################"
echo "#############NVM  UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/nodejs.sh
echo "##################################"
echo "##########HASKELL UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/haskell.sh
## update dein for nvim
echo "##################################"
echo "#############DEIN UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/dein.sh
$HOME/dotfiles/update/cocplugin.sh
## update zinit for zsh
echo "##################################"
echo "############ZINIT UPDATE##########"
echo "##################################"
$HOME/dotfiles/update/zinit.sh
```
これを実行すればすぐに最新の開発環境になりますし、macでもlinuxでもandroidでも環境の同期が取れます。

### .zshrc
これはもう皆自分で育ててください。

### 最後に
他にも便利な自作スクリプトを作って業務の補助をしています。いつも忘れるコマンドを書いた表レンダリングしてをデスクトップの壁紙にするコマンドとか、
管理しているgitリポジトリを＄HOME/src以下に階層ごとにすべてクローンし、pullするものなどです。

何も考えずに新しいパソコンからコマンド打つだけで仕事を始めれます。

忘れてたけど、.xmonadをhaskellのパッケージマネージャーで管理してます。つまり、xmonadはビルドしてます。どんな環境でも同じ挙動にできるから。。。

なんか色々不十分だけど、雰囲気で満足できたしこれでいいや。。

###　最後に
真似したい人はこのままだと僕以外は使えないので、フォークして、.binと.sshのサブモジュールを自分のリポジトリに切り替えて使ってください。

# あとやりたいこと
dotfilesのフレームワークを書いて、jsonファイルの設定に必要なツールを階層化して書き込めば全部インストール、アップデートされるものを作りたい。ていうか、linuxも最近はカーネルさえ新しければ使い勝手がディストリごとで左程変わらないので、＄HOME環境のフレームワークほしい。