Solist Work Blog

Software engineer note

Dotfilesでバックアップ不要な開発環境

ArchLinuxで仕事をするようになって結構な年月が経過したので、 ArchLinuxをメイン環境にしている現状について書いてみようと思います。

一般的にArchLinuxは玄人向けで普通の人が使うディストリビューションではないと言われているようです。 コマンドラインでの作業が必須になるので一般人には勧められないですが、ソフトウェアエンジニアが開発環境にするディストリビューションとしてはオススメできます。 何か必要になったらたいていのものはパッケージ1で揃います。 ArchLinuxを使うようになってプログラムを自前でビルドすることはほとんどなくなりました。 これは本当に楽で何かを始めるときに億劫になることがほとんどなくなります。

Arch Linux

ArchLinuxのパッケージの最新安定版はユーザー数が少ないので、変な使いかたをするとバグがでることもあります。 それは開発元の最新の安定版を利用しているから起きることです。 GitHubなどで開発されているソフトウェアの最新安定版は作者が想定した使い方の範囲内ではバグはそんなにでません。 たまにあってもそういうバグはArchLinuxユーザーが開発元に報告をいれるので1日以内になおることがほとんどです。 バグがなおるまでの対処法はこちらに書いておきます。 DebianUbuntuなどのディストリビューションはユーザーが多いので、作者がテストしていない設定ファイルの組み合わせなど を使うユーザーがでてきます。そういったバグをユーザー数の多さで潰していくのです。

ArchLinuxには先端のとがったユーザーが多いと思われているようですが、実際は素直に使っていることがほとんどだと思います。 自分の開発しているソフトウェアやいれこんでいるソフトウェアだけGitHubのmainリポジトリをビルドすればよいのです。 それ以外のソフトウェアはArchLinuxのパッケージで提供される最新の安定版を素直に使えばそれほど難しくはないと思います。

バックアップとdotfiles

環境構築に話を移します。 環境がいつでも再現できるようにMakefileを作ったところ まったく期待していなかった副作用として バックアップについては一切考慮しなくてもよくなりました。 これは嬉しい誤算でひどいマシントラブルがあったとしても 何も考えずにThinkPadに対してmake allinstall するだけでよいのです。 バックアップしなくてもよい環境に慣れてしまうともう以前の環境には戻れません。 以下はGitHubのdotfilesのファイルを説明します。

Makefileとdotfilesで開発環境を作る

このドットファイルはArchLinux向けです。 makeがないディストリビューションなど存在しないので Makefileを作ればどんなディストリビューションにも対応できます。お好きなディストリビューション向けに書き換えてください。 さっそくMakefileを作りましょう。

Makefileがあるといいこと

環境構築がコマンド一つでできます。

make install

再び自分のPCを設定することについて心配する必要はありません。

デプロイがすぐできるdotfiles

このコマンドでデプロイできる。

make init

Makefileを使用すると、通常の開発環境を1時間以内に回復できます

クリーンインストールは最高のセキュリティ対策です。 定期的にクリーンインストールを行っていれば、オープンソースのメインラインにウイルスが入らない限りかなりセキュアな環境になります。オープンソースのメインラインにウイルスを入れるのはソフトウェアエンジニアが協力して開発している限りかなり難しいでしょう。ケン・トンプソンが初期のUNIXに仕込んだソースコードを読んでもわからないバックドアもありますが、現代においてはコンパイラもオープンソースなのでこのようなことは難しいと思います。2

Makefileの使い方

make backup

環境作成後このコマンドでインストールされている ArchLinuxパッケージリストがGitHubのarchlinuxディレクトリにバックアップされます。 これは念の為ArchLinuxパッケージリストを保存しているだけです。

make allinstall

Makefileのallinstallの後に書かれているものすべてをインストールできます。3 Makefileが完成していれば一時間以内にいつもの環境が回復するでしょう。

make allbackup

パッケージをすべてバックアップすることができます。

make allupdate

パッケージをすべて更新することができます。

メインのエディタはEmacsを使っています。

Emacsを起動した画面

メーラーはneomuttを使っています。 (neomuttに関するうんちくはこちら)

neomuttを起動した画面

backupをしなくてもいつもの環境をすぐ再生する要件を満たすためDropboxを利用します。

Dropboxによって管理される物の基準

  • GitHubに配置できないもの

    ssh公開鍵などの機密情報

  • 更新ファイルが多いので、GitHubと同期するのは面倒なもの

    .zsh_history .mozc シェルの履歴やIMEのファイルなど

  • 公開できないがデータを保護する必要があるもの

    メールデータ。 メールが到着すると、Dropboxに同期されるようにするので、バックアップについて考える必要はありません。 GmailについてはneomuttのIMAPで処理するのでバックアップする必要はありません。

セキュリティ保護のためDropbox 2段階認証を設定するのを忘れないでください。 この時点でDropboxフォルダとgitリポジトリのファイルはバックアップ不要になりました。 ほとんどのバックアップが必要な作業はこの2つの場所だけで行います。 これにより環境が完成するとバックアップ不要となります。

ArchLinuxインストール

なぜArchLinuxか?

  • あなたのPCが壊れない限り、ArchLinuxローリングリリースなので、再インストールする必要はありません。 もしPCが壊れても Makefileを作ったので新しいPCを買ってきて一時間以内にいつもの環境を構築できるので無敵です。

  • 私のPCの開発環境は古いパッケージだと厳しいので、最新の安定版がすぐパッケージ化されるArchLinuxはとても良いです。

  • 私はカスタマイズが好きですが、カスタマイズがあまりにも多く行われると、コミュニティの利益を得ることができないので良くありません。 ArchLinuxは過度のカスタマイズには適していないので、ちょうどよい感じです。 原則として、Archのパッケージは、バニラのソースから構築するポリシーです。 (バニラは、それがArchLinuxに独自のパッチを適用しないことを意味しま す) ArchLinuxの特有の問題は起こりそうもないので、これは良いです。

  • ArchLinuxは余分なものがないので軽量です。

htopで負荷を調べる

ArchLinuxをダウンロード

https://www.archlinux.org/releng/releases/

USBインストールメディアを作成します。

sudo dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress oflag=sync

ハードディスクで使用中の容量を調べる

SSDは250Gしかありませんが、ArchLinuxとemacsを使用する環境には十分です。

USBメモリでbootする

UEFI BIOSでUSBメモリで起動するように変更してください。

パーティショニング

  • UEFIとGPTを使う

    ハードウェアに合わせて選択してください。

  • パーティションは / のみ

めんどうなことは徹底的に排除します。 ディスクの暗号化は体感速度が落ちるので行いません。 パスワードなどのデリケートな情報だけ暗号化して管理します。 パスワードについてはこちらの記事をご覧ください。

  • スワップは作らない。

ESP(EFIシステムパーティション)を作成します。 UEFIブートを行うため、FAT32フォーマットのパーティションを作成します。

gdisk /dev/sda

Command (? for help):n
Permission number: 1
First sector     : enter
Last sector      : +512M
Hex code or GUID : EF00

残りすべてを / パーティションに設定します

Command (? for help):n
Permission number: 2
First sector     : enter
Last sector      : enter
Hex code or GUID : 8300

ext4およびfat32でフォーマットする

mkfs.vfat -F32 /dev/sda1
mkfs.ext4 /dev/sda2
mount /dev/sda2 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

Wi-Fiとインターネット接続を設定

ip link
rfkill list
rfkill unblock 0
wifi-menu wlp0s29f7u1

viを開いて最上部に一番近いArchLinuxミラーをコピーします。 JAISTTsukuba WIDEを指定すればよいでしょう。

vi /etc/pacman.d/mirrorlist

ArchLinuxのbese bese-develをインストールする

pacstrap /mnt base base-devel linux linux-firmware

fstabを生成する

genfstab -U -p /mnt >> /mnt/etc/fstab

bashログインシェルとしてマウントしてログインする

arch-chroot /mnt /bin/bash

ホスト名を設定する

echo thinkpad > /etc/hostname

ロケールを設定する

vi /etc/locale.gen

en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8

次に実行する

locale-gen

シェルは英語環境にする

export LANG=C

その他はUTF-8にする

echo LANG=ja_JP.UTF-8 > /etc/locale.conf

タイムゾーンの例

ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ln -sf /usr/share/zoneinfo/US/Pacific /etc/localtime

ハードウェアの時間調整

hwclock --systohc --utc

カーネルイメージを生成する

mkinitcpio -p linux

ユーザーを生成する

useradd -m -G wheel -s /bin/bash ${USER}

パスワードを設定してください

passwd ${USER}

グループと権限の設定

pacman -S vim
visudo

以下をコメントアウト

Defaults env_keep += “ HOME ”
%wheel ALL=(ALL) ALL

ブートローダの設定

pacman -S grub dosfstools efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
grub-mkconfig -o /boot/grub/grub.cfg

ドライバとXorg Gnomeの準備

環境に合ったドライバをインストールする

lspci | grep VGA
pacman -S intel-media-driver intel-ucode libva-utils
pacman -S xorg-server xorg-apps

Gnomeは必要に応じて小さく入れられます

pacman -S gnome-backgrounds
pacman -S gnome-control-center
pacman -S gnome-keyring
pacman -S nautilus

ターミナルはurxvtとxtermを使います

sudo pacman -S rxvt-unicode urxvt-perls
sudo pacman -S xterm

gdmでグラフィカルログインを有効にする

pacman -S gdm
systemctl enable gdm.service

networkを設定

pacman -S networkmanager
systemctl disable dhcpcd.service
systemctl enable NetworkManager.service
pacman -S otf-ipafont
exit
reboot

${USER}でログインしてホームディレクトリを整理する

ホームディレクトリは英語にする

sudo pacman -S xdg-user-dirs
LANG=C xdg-user-dirs-update --force
sudo pacman -S zsh git
sudo pacman -S noto-fonts noto-fonts-cjk chromium

yayをインストール

mkdir -p ~/src/github.com/aur
cd src/github.com/aur
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

dropboxをインストールして同期する

yay -S dropbox
yay -S nautilus-dropbox
dropbox

dotfilesを準備する

mkdir -p ~/src/github.com/masasam
cd src/github.com/masasam
git clone https://github.com/masasam/dotfiles.git
cd dotfiles
make install
make init

Dconf設定

sudo pacman -S dconf-editor

dconf write /org/gnome/desktop/input-sources/xkb-options "['ctrl:swapcaps']"
dconf write /org/gnome/desktop/interface/gtk-theme "'Adwaita-dark'"
dconf write /org/gnome/desktop/interface/gtk-key-theme "'Emacs'"
dconf write /org/gnome/desktop/interface/text-scaling-factor 1.25
dconf write /org/gnome/desktop/interface/clock-show-date true
dconf write /org/gnome/desktop/interface/clock-show-weekday true
dconf write /org/gnome/desktop/interface/show-battery-percentage true
dconf write /org/gnome/desktop/wm/preferences/num-workspaces 1
dconf write /org/gnome/desktop/wm/keybindings/activate-window-menu "['']"
dconf write /org/gnome/shell/keybindings/toggle-overview "'<Alt>space'"
dconf write /org/gnome/mutter/dynamic-workspaces false

ここまでは手動でインストールします。 ArchLinuxのインストールを自動化してもメリットは少ないです。 ベースにするパソコンを買い換えると変わってしまいますし、ここはコミュニティの利益を享受すること優先します。 これ以下はMakefileですべて片付けることができます。


開発環境のインストール

Pacmanでインストールするもの

sudo pacman -S firefox firefox-i18n-ja
sudo pacman -S sylpheed emacs curl xsel openssh tmux
sudo pacman -S zsh-completions keychain
sudo pacman -S powertop gimp unrar
sudo pacman -S file-roller xclip atool evince inkscape
sudo pacman -S cifs-utils gvfs gvfs-smb eog lhasa lzop
sudo pacman -S seahorse the_silver_searcher
sudo pacman -S cups-pdf htop neovim go pkgfile rsync elixir
sudo pacman -S nodejs whois nmap poppler-data ffmpeg 
sudo pacman -S aspell aspell-en httperf asciidoc sbcl
sudo pacman -S gdb hub wmctrl gpaste pkgstats
sudo pacman -S linux-docs pwgen gauche screen ipcalc
sudo pacman -S arch-install-scripts ctags parallel
sudo pacman -S pandoc texlive-langjapanese texlive-latexextra
sudo pacman -S shellcheck php cscope typescript
sudo pacman -S noto-fonts-cjk arc-gtk-theme jq dnsmasq
sudo pacman -S docker zsh-syntax-highlighting
sudo pacman -S npm llvm llvm-libs lldb hdparm rxvt-unicode 
sudo pacman -S mariadb-clients postgresql-libs tig lsof fzf
sudo pacman -S debootstrap tcpdump pdfgrep
sudo pacman -S alsa-utils mlocate traceroute hugo mpv jhead
sudo pacman -S nethogs optipng jpegoptim noto-fonts-emoji
sudo pacman -S debian-archive-keyring tree python-pip
sudo pacman -S mathjax strace valgrind phantomjs p7zip unace
sudo pacman -S yarn geckodriver w3m neomutt iperf redis
sudo pacman -S highlight lynx elinks mediainfo cpio flameshot
sudo pacman -S oath-toolkit imagemagick
sudo pacman -S bookworm ruby ruby-rdoc

Yayでインストールするもの

yay -S drone-cli
yay -S git-secrets
yay -S global
yay -S google-cloud-sdk
yay -S goobook-git
yay -S ibus-mozc
yay -S mozc
yay -S nkf
yay -S nodenv
yay -S peek
yay -S rbenv
yay -S ruby-build
yay -S screenkey
yay -S yaourt
yay -S yay

Pipでインストールするもの

mkdir -p ${HOME}/.local
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python ${PWD}/get-pip.py --user
pip install --user --upgrade pip
pip install --user virtualenv
pip install --user ansible
pip install --user ansible-lint
pip install --user docker-compose
pip install --user virtualenvwrapper
pip install --user seaborn
pip install --user ipywidgets
pip install --user scikit-learn
pip install --user scipy
pip install --user pandas
pip install --user matplotlib
pip install --user jupyter
pip install --user neovim
pip install --user pylint
pip install --user jedi
pip install --user autopep8
pip install --user flake8
pip install --user pyflakes
pip install --user pygments
pip install --user speedtest-cli
pip install --user selenium
pip install --user ansible-container
pip install --user scrapy
pip install --user mycli
pip install --user pgcli
pip install --user pip-review
pip install --user yapf
pip install --user pydoc_utils
pip install --user rope
pip install --user importmagic
pip install --user awscli
pip install --user progressbar2
pip install --user ranger-fm
pip install --user rtv
pip install --user jupyterthemes
pip install --user httpie
pip install --user trash-cli
pip install --user jupyterlab
pip install --user cheat
pip install --user faker

Golangでインストールするもの

mkdir -p ${HOME}/{bin,src}
GO111MODULE="on" go get -u -v golang.org/x/tools/cmd/gopls
GO111MODULE="on" go get -u -v golang.org/x/tools/cmd/goimports
go get -u -v github.com/golang/dep/cmd/dep
go get -u -v github.com/motemen/ghq
go get -u -v github.com/sonatard/ghs
go get -u -v github.com/kyoshidajp/ghkw
go get -u -v github.com/simeji/jid/cmd/jid
go get -u -v github.com/jmhodges/jsonpp
GO111MODULE="on" go get -u -v github.com/mithrandie/csvq

Yarnでインストールするもの

mkdir -p ${HOME}/.node_modules
yarn global add babel-eslint
yarn global add create-component-app
yarn global add create-react-app
yarn global add eslint
yarn global add eslint-plugin-react
yarn global add firebase-tools
yarn global add gulp
yarn global add heroku-cli
yarn global add jshint
yarn global add ngrok
yarn global add npm
yarn global add prettier
yarn global add tern
yarn global add tldr
yarn global add vue-cli
yarn global add vue-language-server
yarn global add webpack

Rbenv railsなど

yay -S rbenv
yay -S ruby-build
rbenv install 2.5.1

Rustでインストールするもの

sudo pacman -S cmake
mkdir -p ${HOME}/.cargo
curl -sSf https://sh.rustup.rs | sh
cargo install racer
cargo install cargo-update
cargo install cargo-script
cargo install cargo-edit
cargo install ripgrep
cargo install exa
cargo install fd-find
cargo install xsv
cargo install hyperfine
rustup component add rust-src

ターミナル

私のterminal

ターミナルは urxvt をメインにする

DNS cacheを有効にする

dnsmasqをインストールする

sudo pacman -S dnsmasq

vim /etc/NetworkManager/NetworkManager.conf

[main]
dns=dnsmasq

NetworkManagerを再起動すると、dnsmasqは自動的に使用可能に設定されます。

sudo systemctl restart NetworkManager

同じドリルコマンドで2回実行してDNSキャッシュが効いているかチェックします。 2回目のDNSルックアップが0 msecになっていればDNSキャッシュが効いています。

DNSキャッシュが効いているか調べる

Mozc

ibus-mozc

入力ソースmozcをリージョンと言語のみにする。

USキーボードなので、日本語変換はshift + spaceを使う。

それはemacsでバッティングしないようにするためです。

キーバインドはことえりベースをカスタマイズする ← emacsに一番近い

reboot

設定が終わったらシンボリックリンクをはる

ln -sfn ~/Dropbox/mozc/.mozc ~/.mozc

mozcの設定をdropboxに設定する

これでもう二度と設定する必要はないでしょう。

Makefileをテストする方法

dockerを利用してMakefileをテストする

make test

dockerを利用してMakefile Dropboxなしのテスト

make testsimple

手動でテストしたい場合

1.このDockerファイルをビルドする

docker build -t dotfiles /home/${USER}/src/github.com/masasam/dotfiles

2.docker runを実行

docker run -t -i -v /home/${USER}/Dropbox:/home/${USER}/Dropbox:cached --name arch dotfiles /bin/bash

3.dockerコンテナ内で次のコマンドを実行します。

cd /home/${USER}/src/github.com/masasam/dotfiles
make install
make init

  1. AURも利用すると60000パッケージを越えます。 ↩︎

  2. むしろ、皆が気づかないようなものがオープンソースに仕込まれていて、それを発見して有名になってやろうという不純な動機でオープンソースをはじめてもいいのではないでしょうか。プログラミングスクールに行くより将来有望かもしれません。 ↩︎

  3. make allinstallを行う前にDropboxを同期させておく必要があります。 ↩︎

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ