y-ohgi's blog

しがないSREなフリーランスの徒然

macOSの環境設定と運用方法が整ってきたので晒す

目次

概要

ローカル環境の課題として "複数環境構築時の競合" が個人的に一番つらみを感じる
下手に広く浅くWeb技術に手を出すのでフロントのツールがクラウド系のモジュールと競合するとかあったり。Nodeのバージョンとか。
次点で "bashの起動速度" が課題。

そこらへんが整ってきたので文字に起こした。

TL;DR

  • 前提としてサーバーサイドがメインで、たまにWebフロントで遊ぶ人間。
  • ローカル環境のランタイムは片っ端からDockerへ固める
  • .bash_profiles に起動の遅いものは追加しない(脳死)
  • アプリ類はCaskで入れ、1passwordなどのセンシティブなものは気分の問題でAppStoreから直接入れる

dotfiles

y-ohgi/dotfiles

実行環境

各種言語の実行環境は基本的にDockerイメージを使うかDockerfileで固める。
最初に書いた通り "複数環境構築時の競合" を回避するのが理由。
ローカルに入っているものとしてはmacOSにプリインストールされてるRubyPythonなどと、自前で入れているGolangのみ。

例えば「PlnatUMLをローカルで書きたい」場合はJVMを単純に入れるのは回避する。
JAVA_HOMEでJVMを指定しておくかPlantUML ProxyをDockerで立てるなどして、なるべくインストールしないことやアンインストールしやすくすることを意識する。

また、IDEは使わずにspacemacsを使っているのもあってかDockerと相性が良い。
IDEはなんかそこらへんの対策方法とかある気がするけど使う予定が無いので知らない。

ちなみに社用PCにはお仕事でサーバーサイドKotlinとJavaを扱ってるのでsdkman(gradle)とJVMをローカルへ入れてる。
プロダクト自体はdocker-composeで固めてはあるけど、ローカルに直接プロダクトの環境構築してる方も居るのでその環境を再現するのが主な理由。
余計なものが入ってないとこういうときにすんなり環境構築ができるのも○
終わったらJVMもsdkmanもサクッと消しちゃいます。

ターミナル

だいたい↓の5つで構成されてる

  • Terminal
  • bash
  • tmux
  • spacemacs
  • Docker

Terminal

ターミナルはMacのデフォルトの Terminal を使用している
iTerm2はキーボード入力が薄皮一枚分遅くなるのですぐにやめた

terminalで設定しているものとしてはテーマはProを使っている。
他にはMetaキーをONにして、Bellを全てOFFにして、ANSI Colorsの青を明るめにして、Antialias TextをONにしているぐらい。

bash

shellにはbashを使っている。
zsh/fishを使ったけど起動がbashより起動が遅い気がするのと、それを許容するだけの魅力を特に感じなかったのでbashを使っている。補完とかは基本 C-r で間に合ってるし、ほしいのは bash-completion に頼る。
起動速度にこだわるのは、僕の使い方が微妙なんだろうけど、bashをカジュアルに起動して閉じまくるから。
これはもう手癖で今更直らないので起動速度を上げる方針。

.bash_profile

基本的に何か追記するときは time コマンドで測って導入するか決めてる。
遅いツールは別のを探したり、どうしてもほしい場合はbash起動時には適用せずに起動用コマンドなどを作ったりしている。
例えばgolangのバージョン管理ツールであるgvmは普段使わないので、 gvm が初めて叩かれたタイミングでgvmを起動するようにしている

export IS_GVM_ENABLED=false
gvm() {
  [ -s  ~/.gvm/scripts/gvm -o "${IS_GVM_ENABLED}" == false ] && IS_GVM_ENABLED=true && . ~/.gvm/scripts/gvm

  gvm $@
}

なんでこんなことしてるかというと、 .bash_profile の読み込みは time source ~/.bash_profile で0.5sec以内に収まるようにしている。
で、gvmの起動には 0.05secほどかかる( time source ~/.gvm/scripts/gvm )のでチリツモで許容できないのです。

f:id:y-ohgi:20180626021403p:plain

alias/function

あまり登録はしてないけど、万人受けしそうなのだけあげるなら。

pbcopy

ビルトインのpbcopyは日本語が扱えないため、それを可能にするalias。
前提条件として nfk をインストールする必要がある

nfkはbrewでインストールできる

$ brew install nfk

.bash_profileへ追記

alias pbcopy="nkf -w | __CF_USER_TEXT_ENCODING=0x$(printf %x $(id -u)):0x08000100:14 pbcopy"

cdf

現在開いているFinderのパスへ移動するためのfunction。

.bash_profileへ以下を追記して

cdf() {
  target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
  if [ "$target" != "" ]; then
    builtin cd "$target"; pwd
  else
    echo 'No Finder window found' >&2
  fi
}

適当なパスをFinderで開いて cdf

$ open ~/Pictures/
# デスクトップにFinderで Picturesが開く
$ cdf
$ pwd
/Users/y-ohgi/Pictures

プロンプト

プロンプトには "カレントディレクトリ"、"gitのブランチとユーザー名" 、"選択中のgcpプロジェクト"、"最後に実行したコマンドの成否" を表示するようにしている。
PS1 へ直接プロンプト記述するわけではなく、 PROMPT_COMMAND でPS1を変更したい場合は既存の PROMPT_COMMAND も読み込むようにしてあげないとせっかくインストールしてあげたツール類が動かなくなることに注意。

PROMPT_COMMAND="_prompt_command;${PROMPT_COMMAND}"
_prompt_command() {
  LAST_EXEC="$?"
  PS1=""

  [[ ${IS_KUBE_PS1_ENABLED} == true && "${TMUX}" == "" ]] && PS1+=$(kube_ps1)

  PS1+="\w "
  PS1+="${Green}\$(_git_branch)${Color_Off} "
  PS1+="${Blue}\$(_gcp_project)${Color_Off} "
  PS1+="\$(_last_result) "
  PS1+="\n"
  PS1+="$ "
}

だいたいこんなかんじになる
f:id:y-ohgi:20180626014611p:plain

syslogの削除

bashを起動する際ここが肥大化すると引きずられて起動速度が落ちるので削除する。自己責任。
参考: macOS Sierra時代のsyslogとの付き合いかた - すがブロ

$ sudo rm -rf /private/var/log/asl/*.asl

tmux

sshセッションの維持とか画面分割とかしてくれるツール。
画面分割目的に使ってる。
開始キーはデフォルトだとemacsと競合するので C-t に変更してる。
何度か挫折してたけど同期のemacsライクな設定を参考にゴニョったら世界が変わった。同期に感謝

同期のdotfile
sinnershiki/dot_files: dot files

Spacemacs

知らない人に説明するなら「emacsvimを足せば最強だよね」って思想のエディタ。ベースはemacs

最近emacsからspacemacsへ乗り換えた。
emacsのコンフィグをゴニョゴニョするのは楽しいけど無限に時間が吹っ飛ぶ。
で、そこらへんの設定周りをいい感じにするためにspacemacsに乗り換えた。
spacemacsには一般的に使われるであろうパッケージがデフォルトで入っていて、markdownやgitなどの設定は layer と呼ばれる機能で公式が 設定を一式 提供してくれる

いざ乗り換えてみると最初はemacsだと思って使って痛い目みたけど、なれてきたら快適そのもの。
ほしいパッケージはほんとにほとんど最初から入ってるし、新しく言語を始める場合はlayerがあるしで最高のユーザー体験が得られる。

packages

万人受けしそうなのをあげるなら

multiple-cursor

名前の通りマルチカーソル用パッケージ。
例えば矩形選択は直線の同時編集には強いけど行末の同時編集は苦手である
そういったときにmultiple-cursorで行末にカーソル増やし、行末に編集を行う。
QuickTimePlayerを初めて使った。

参考: multiple-cursor.elの設定を調整してみた - Qiita

undo-tree

編集履歴をツリー形式で表示させ、自由に履歴を行き来するパッケージ。
単純に一本道でundoするだけじゃなく、gitのブランチのように過去にundoしたタイミングにも戻れる。
こちらも百聞は一見にしかずなので動画を撮った。

EmacsWiki: Undo Tree

Applications

おまけでGUIのアプリケーションを。

2年ぐらいほとんど固定化されてる気がする。
満足してるのもあるけど単純に探してないだけ。
基本Caskを使って、Caskに無いものは直接取得しに行く。

Google 日本語入力

Windowsネトゲやってた頃から使っていて手に馴染んでいるので使ってる。
Microsoft IMEネトゲと相性悪くてGoogle IMEを入れたのが最初だった気がする。

Google Chrome

メインブラウザ。
サブはCanary。Safariは使ってない。

Chrome Extension

名前順にいつも使ってるのをつらつらと

  • 1password
    • 1password
  • Awesome Screenshot
    • キャプチャがメインっぽいけど画像の編集の用途に使ってる
  • Chrome extension source viewer
  • CSS Viewer
    • カーソルをあわせた要素のCSSを閲覧できるようになる
  • EditThisCookie
  • Emoji Keyboard
    • PCでemojiを使う
  • Enable right click
  • Hatena Bookmark
  • Highlight to Search
    • カーソルで選択した箇所を即座に検索するためのツール
  • HTTP/2 and SPDY indicator
    • HTTP2とSPDY対応のサイト判別
  • JSON Formatter
    • JSONのフォーマット
  • Keepa - Amazon Price Tracker
    • Amazonの商品ページで値段の推移が見れるようになる
  • Octotree
  • PlantUML Viewer
    • PlantUMLのプレビュー
  • title tag getter
  • User JavaScript and CSS
    • ユーザーが作成したCSS/JSを適用してくれる。適用タイミングが良いらしく、色んなサイトで "書いたとおりのCSS" が適用できるのが良い
  • vimium
    • Chromevimライクに操作するための拡張。keybindingをカスタマイズしてemacsライクにして使ってる
  • Wappalayzer
    • 現在居るページがどんな技術で作られてるかを閲覧するツール

Alfred

Option + Space でアプリケーション呼び出し用inputフォームが最前面に出てくるサムシング。使えばわかる系。
アプリ呼び出しより課金してスニペットメインで使ってる。

Better Snap Tool

WindowsのエアロをMacで再現するためのツール

Better Touch Tool

一部アプリのキーバインド上書き用に使ってる。
IDEとか使うときemacsライクなキーバインドC-hC-_ )ができなかったりするので、
こいつで( C-hBackspace へ、 C-_Cmd-z へ、etc...)強制的に上書く。

Dropbox

バックアップ用。
画像は自分のアイコンしか使わないしソースコードGitHubなので、DropBoxがバックアップの全て。
会社では会社の方針かなにかで使えないのがしんどい。そっちはGoogle Driveを使ってる

Postman

WebAPIのテストツール

Gyazo (GIF)

画面キャプチャ & 共有ツール
キャプチャ後アップロードされURLが生成されるユーザー体験は素晴らしい。

Wunderlist

Todo管理ツール
Shift + Option + Space でAlfred的なinputフォームを呼び出せて思いついたタスクをカジュアルに登録できるのが気に入ってる。
todo登録しようとしてアプリ起動からやってると何しようとしてたか忘れるので(忘れるので)ショートカットはほんと大事。

Inkdrop

Markdownで書けるメモ帳。
いろいろ試したけどMarkdownベースならこれが最高だったので課金して使ってる

Atom

いちばんemacsライクなキーバインドが使えるGUIエディタなので入れてる。
GUIでテキストファイルクリックしたときに起動する用。基本使わない。

Visual Studio Code

ひとが僕の環境でエディタを使うときはこいつを起動します。