これは株式会社POL テックカレンダー 2021 2日目の記事です。前日の記事はこちらです。
はじめに
「黒い画面だけで開発してるのって、なんだかエンジニアっぽくていいよね。」
POLでエンジニアをしているオクと申します。上の言葉は私の上長の言葉です。
私は今年の8月にPOLに入社しましたが、それまでは博士課程とポスドクでの研究業務をしていたため、開発は未経験でした。
そんな私が開発する上で、できるかぎりターミナルだけを使って開発をしたときのツールとTipsをまとめます。
最初のモチベーションは単にNeovimを使いたかったのと、環境構築を楽にしたいのでHomeBrewを使って管理したかったからスタートしました。人の使ってるツールってあんまり知らないので、他に便利なツールや使い方があれば教えていただきたいです。
今では便利なGUIアプリがありますが、黒い画面だけでかっこよく開発してみましょう。
開発環境
環境 | 名前 |
---|---|
OS | macOS Big Sur |
CPU | Intel core i5 |
サーバーサイド | Java, Rust |
フレームワーク/サーバーサイド | Play2 Framework/Spring Boot |
フロントエンド | TypeScript/JavaScript |
フレームワーク/フロントエンド | React, Next.js |
データベース | MySQL |
インフラ | AWS, Docker, K8s |
リポジトリ管理 | GitHub |
各ツールの使い方
ここでは、PCの環境構築からコードがプロダクトに取り込まれるまでに使うツールを説明します。
さあ、ターミナルを開いてかっこいいハッカーになりましょう!!
私のdotfilesを参照いただきながらご覧いただくと、理解しやすいと思います。
開発環境設定編
Macの設定
ここの設定は好き嫌いがあると思います。
-
ファインダーで隠しファイルを表示する。
defaults write com.apple.finder AppleShowAllFiles TRUE defaults read com.apple.finder AppleShowAllFiles killall Finder
-
DS_Storeを作成しないようにする。
defaults write com.apple.desktopservices DSDontWriteNetworkStores true defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
HomeBrew
HomeBrewはMacでもLinuxでも使えるパッケージマネージャです。特に説明はいらないと思います。
PCを変えてもHomeBrew bundleのコマンドでソフトウェアが一発でインストールできます(後述)。
-
以下のコマンドでHomeBrewをインストールする。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
-
以下のコマンドでエラーを確認する。
brew doctor
ただし、HomeBrewで入れたものが裏で勝手に動いていて不都合が起きる可能性があります。私はありました。この点は注意が必要です。
dotfiles
様々なソフトウェアの設定ファイルはドット(.)から始まる隠しファイルであることが多いです(例:.bashrc、.vimrc、.Brewfile)。そのため、それらドットファイルをまとめて管理することで、環境構築を楽にします。
また、XDG Base Directoryの仕様に基づき、HOMEディレクトリ配下にある.configディレクトリにドットファイルを配置することも多いので、.configディレクトリも含めて管理します。
私の環境ではdotfilesは以下のようになっています。管理するためにはGitHubを使っています。
./dotfiles
├── .Brewfile
├── .bashrc
├── .isort.cfg
├── .pypirc
├── .textlintrc
├── .tool-versions
├── .zshenv
├── README.md
├── config
│ ├── asdf
│ ├── coc
│ ├── fish
│ ├── flake8
│ ├── git
│ ├── htop
│ ├── latexmk
│ ├── mypy
│ ├── nvim
│ ├── pypoetry
│ └── yarn
└── init.sh
各ドットファイルはinit.shでシンボリックリンクを貼っています。init.shは単にシンボリックリンクを貼っているだけなので、もう少し工夫のやりがいがあると思います。
-
dotfiles をgitからcloneする。
git clone https://github.com/w40141/dotfiles.git
-
シンボリックリンクを貼る。
cd dotfiles ./init.sh
-
.BrewfileからHomeBrew経由でインストールする。これから使うコマンドは特に断りがない限り、このコマンドでインストールできている仮定で進めます。
brew bundle --global (--force)
fish
シェルをfishにします。これは本当に好き嫌いがあると思います。
fishのいいところは補完が優れている、色がカラフルなところだと思います。だめなところはbashとzshのコマンドとの互換性がないところです。
-
fish のパスの確認する。
which fish
-
シェルの変更する。
sudo vi /etc/shells
-
末尾にfishのパス (例:/usr/local/bin/fish) を追加する。
-
ログインシェルをfishに変更する。
fish chsh -s /usr/local/bin/fish
-
fisher をインストールする(fisherのコマンドは変わることがあるので、インストールする前に確認したほうがよいです)。
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher
-
fisherプラグインを入れる。以下の例ではfzfを入れています。
fisher install jethrokuan/fzf
-
必要があればfisherプラグインを更新する。
fisher update
asdf
asdfはプログラミング言語やCLIツールのバージョン管理ツールです。私は言語の管理をほとんどasdf経由にしています。理由としては楽だから、それだけです。ただし、Rustに関してはHomeBrewでrustupをインストールし、それ経由で管理しています。
-
以下のコマンドでインストールする。
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
-
各種プログラミング言語をインストールする(ここに一覧があるので参照したほうがよいです)。yarnとpoetryは言語ではないですが、ここでインストールすることで、バージョン管理ができます。
asdf plugin-add danhper/asdf-python asdf plugin-add asdf-vm/asdf-ruby asdf plugin-add asdf-vm/asdf-nodejs asdf plugin-add twuni/asdf-yarn asdf plugin-add asdf-community/asdf-poetry asdf plugin-add halcyon/asdf-java
-
各種プログラミング言語のバージョンをインストールする.
asdf install python 3.9.0 asdf install nodejs latest asdf install ruby 2.7.4
-
各種プログラミング言語のバージョンをglobalで指定する.
asdf global python 3.9.0 asdf global nodejs latest asdf global ruby 2.7.4
-
poetryの補完を設定する(後述するNeovimでPythonの仮想環境を使うのでインストールする)。
poetry completions fish > ~/.config/fish/completions/poetry.fish poetry config virtualenvs.in-project true
Neovim
Neovimが使いたいがためにここまで設定しました。ここまでくれば、ひとまずの環境構築は終わりです。
-
python関連を設定する。poetryを使い仮想環境を構築します。.config/nvim配下にNeovim用の仮想環境を用意します。pythonの環境構築と仮想環境ツールは様々な候補がありますが、私はasdfでpythonを入れ、poetryで仮想環境を作り、pipxで全体で必要なコマンドをインストールするのをおすすめします。
cd ~/.config/nvim/neovim3 poetry install
-
ruby関連を設定する。
gem install neovim
-
node関連を設定する。
yarn global add neovim yarn global add coc
-
nvimのエラーを確認する。nvimで空ページを開き、:checkhealthで確認する。
Neovimの便利プラグイン
最近のVScodeはとても便利です。VScodeに負けないためにも、ターミナルだけで頑張るためにも、必要だと思うプラグインを7つだけピックアップします。もちろん他のプラグインも使っています。
- CoC(入力補助、補完、フォーマット等)
- lightline(ステータスライン)
- fzf(ファジーファインダー)
- defx(ファイラー)
- eskk(日本語入力)
- treesitter(シンタックスハイライト)
- vista(各シンボルの表示)
開発準備編
fzf
fzfはターミナルであいまい検索ができるツールです。
例えば、ctrl-rで過去に入力したコマンドのあいまい検索ができたり、以下のようにghqを使う関数を書くことで、ローカルリポジトリのあいまい検索もできます。
function ghq_fzf_repo -d 'Repository search'
ghq list --full-path | fzf | read select
[ -n "$select" ]; and cd "$select"
echo " $select "
commandline -f repaint
end
# ctrl-gであいまい検索ができます。
function fish_user_key_bindings
bind \cg ghq_fzf_repo
end
Neovimなどで使うためにもHomeBrewでインストールする必要があります。
ghq
ghqはローカルリポジトリを管理するツールです。
はじめはなぜこれを使うかわからず、適当に$HOME/programの配下にソースコードを管理していました。しかし、ghqを使うとどこにローカルリポジトリの配置管理がなくなり、加えてghqのコマンドでgit cloneができます。
ghqはHomeBrewでインストールできます。どこにローカルリポジトリを配置するかは以下のように設定します。以下の例ではGo言語のしきたりにならっています。
[ghq]
root = ~/dev/src
簡単な例を示します。
-
git cloneに対応するコマンド
ghq get ユーザーネーム/リポジトリネーム
-
ローカルリポジトリを作成するコマンド
ghq create リポジトリネーム
ローカルリポジトリの削除ができないのがネックです。
gh
ghはGitHubをターミナルから操るためのコマンドです。リポジトリの作成などいろいろなことができます。もちろんHomeBrewからインストールします。
使用するためには以下のコマンドでログインします。
gh auth login
リモートリポジトリを作成する場合は以下のコマンドを叩きます。
git init リモートリポジトリネーム
cd リモートリポジトリネーム
gh repo create
fzfとghqを組み合わせると
ghq create test
# ctrl-g であいまい検索し、testと入力することで上で作成たローカルリポジトリへ飛ぶ。
gh repo create
git add .
git commit -m "first commit"
git push --set-upstream origin master
でターミナルからローカルリポジトリを作成しプッシュできます。
forgit
forgitはfzfと組み合わせてインタラクティブにgit関連の操作ができます。
例えば以下のコマンドがあります。
ga # fzfであいまい検索しながらインタラクティブにgit addするファイルを選べる。
gi # fzfであいまい検索しながら.gitignoreに加えるファイルを選べる。
HackGen
HackGenはプログラミング向けフォントです。プログラミングするならフォントにもこだわりたいですね。
HackGenはNerdフォントも含まれているものもあるため、プログラミング言語のシンボルなどなども表示できます。特にお気に入りは全角スペースが可視化されるところです。
開発編
Java
JavaのソースコードをNeovimで書くためにCoCのプラグインであるcoc-javaを入れています。
また、VScodeでマウスカーソルを関数に置いたときに出てくるマウスホバーを導入するためにCoCの設定ファイルにhoverの設定をしています。
function! ShowDocIfNoDiagnostic(timer_id)
if (coc#float#has_float() == 0 && CocHasProvider('hover') == 1)
silent call CocActionAsync('doHover')
endif
endfunction
function! s:show_hover_doc()
call timer_start(500, 'ShowDocIfNoDiagnostic')
endfunction
autocmd CursorHoldI * :call <SID>show_hover_doc()
autocmd CursorHold * :call <SID>show_hover_doc()
ただし、上の設定ではいちいちホバーを出すので、それが面倒であれば下の設定にします。
" ノーマルモードで単語上でHと押すとホバーがでる。
nnoremap <silent> H :call CocAction('doHover')<CR>
ビルドにはGradleを使っています。Intellijからもビルドできますが、ターミナルからビルドします。
./gradlew hogehoge
Rust
RustのソースコードをNeovimで書くためにcoc-rust-analyzerを入れています。coc-rust-analyzerをNeovim上で入れるだけで、勝手にrust-analyzerを入れてくれるので、HomeBrewで入れる必要はありません
coc-rstもありますが、coc-rust-analyzerのほうが体感としていい気がします。
rustに関してまた別の日に記事を書きます。
docker, k8s, MySQL
dockerはGUIアプリであるdocker desctopを使って起動させます。起動後はターミナルからコマンドを叩きます。
k8sへの接続はLensを使います。k8sはまだ不慣れすぎるので、便利さに乗っかります。ちょっと悔しいです。一応コマンドとしてkubectlがあります。
データベースへのアクセスもSQLクライアントアプリを使います。ターミナルからでも見ることはできますが、見づらいので便利さに乗っかります。ちょっと悔しいです。
GitHub
GitHubのCLIであるghをインストールしましたが、マージや諸々の操作やブラウザからやります。こればっかりは仕方ありません。
おわりに
これだけがんばってはみたものの、結局GUIアプリに頼るのは楽です。これからもターミナル道を邁進したいと思います。
12/3の記事はサタンさんです。よろしくお願いします。