notebook

都内でWEB系エンジニアやってます。

dotfilesの構成、運用、コマンドの紹介

この記事はdotfiles Advent Calendar 2019 - Qiitaの6日目の記事です

数年前に作り込んだけどそれ以来あまりメンテできていないので思い出すのも兼ねて構成とかを書き出してみる

開発で使うマシンがCentOSのため基本的にCentOSを前提とした作りになっている

ディレクトリ構造

.
|-- README.md
|-- ansible
|   |-- README.md
|   .....
|   .....
|   .....
|-- batfiles
|   |-- rubocop.bat
|   `-- solargraph.bat
|-- bin
|   |-- README.md
|   |-- ansi_colorlist
|   |-- as_ips
|   |-- file2slack
|   |-- gluediff
|   |-- jq2esc
|   |-- mbsplit
|   |-- server
|   |-- setup_gitconfig
|   |-- traceback
|   |-- watch-server
|   `-- wcmd
|-- cheatsheets
|   |-- _curl
|   |-- ag
|   |-- ansible
|   |-- git
|   |-- jq
|   |-- mail
|   |-- mkdocs
|   |-- mysqlbinlog
|   |-- nkf
|   |-- pgrep
|   |-- server
|   |-- tmux
|   `-- twurl
|-- config
|   |-- peco
|   |   `-- config.json
|   `-- ssh
|       `-- config
|-- envs_version
|-- neobundle
|-- node_modules
|-- powerline_theme
|   |-- base_colorscheme_default.json
|   |-- colors.json
|   |-- shell_colorscheme_allblue.json
|   |-- shell_colorscheme_default.json
|   |-- shell_colorscheme_lucius.json
|   |-- vim_colorscheme_allblue.json
|   `-- vim_colorscheme_lucius.json
|-- putty
|   |-- lucario.reg
|   |-- memo.txt
|   `-- setting.md
|-- servers_processes.sh
|-- setup.root.sh
|-- setup.sh
|-- test
|-- tmux
|   |-- blue.sh
|   |-- green.sh
|   |-- lucario.sh
|   `-- lucius.sh
|-- vimrc
|   |-- plugins
|   |   |-- ale.vim
|   |   |-- caw.vim
|   |   |-- complete.vim
|   |   |-- indent-guides.vim
|   |   |-- indentline.vim
|   |   |-- lightline.vim
|   |   |-- powerline.vim
|   |   |-- quickhl.vim
|   |   |-- smartchr.vim
|   |   |-- srcexpl.vim
|   |   |-- submode.vim
|   |   |-- taglist.vim
|   |   |-- unite-outline.vim
|   |   |-- unite.vim
|   |   |-- vcscommand.vim
|   |   |-- vim-go.vim
|   |   `-- yankround.vim
|   `-- rc
|       |-- basic.vim
|       |-- mapping.vim
|       |-- plugins.vim
|       `-- tab.vim
`-- zsh
    |-- alias.command
    |-- functions
    |-- hooks
    |-- lscolor
    |-- peco
    |-- prompt
    `-- vcs_prompt

ざっと見た感じゴミが残っている気もする・・・

Ansibleでの構築

このdotfilesにansibleディレクトリがありその中にplaybookがなどがおいてある

新しく開発環境を立てる際にはこのansibleを叩く

ただ、最近試したら一発じゃ構築できなかった・・・・

ただまぁその対応を除いたとしても色々入れているので今の所価値はあるのではと思っている(どっかで時間見つけて直したい)

cheat

よく使うけどコマンド1から打ってみると出てこない・・・みたいなやつ

履歴からのpecoでも良いが解説含め何だったっけな・・・といったことがあったのでcheatというコマンドを使ってチートシートを書くようにしていた

cheatsheetsというディレクトリにいれている

jqとかのチートシートは毎度ググっていたりしたのでよく使うものはcheatsheetに残したりして思い出すために使っていた

cheat/cheat: cheat allows you to create and view interactive cheatsheets on the command-line. It was designed to help remind *nix system administrators of options for commands that they use frequently, but not frequently enough to remember.

github.com

設定自体は.zshrcに書いている

export DEFAULT_CHEAT_DIR=~/dotfiles/cheatsheets
export CHEATCOLORS=true

cheat -e jq でcheatsheet自体を編集でき編集した内容がそのままgitで差分として出てくるので更新したらpushするようにしている

下記はjqの例

  • cheatsheets/jq
# Pretty print the json
jq "." < filename.json

# Access the value at key "foo"
jq '.foo'

# Access first list item
jq '.[0]'

# Slice & Dice
jq '.[2:4]'
jq '.[:3]'
jq '.[-2:]'

# where的な使いかた
jq 'select(.request_time > 20)'

# 配列から Instancesの項目を取得(複数)
jq '.[].Instances'

# 組み合わせ autoscalingのinstance_idを取得
jq '.AutoScalingGroups[]|select(.AutoScalingGroupName == "backends")|.Instances[].InstanceId'

# 日付の比較(複数select)
jq 'select(.time <= "2015-12-18 03:20:00")|select(.time >= "2015-12-18 03:10:00")|'

# 複数取得
jq '.Messages[].Body, .Messages[].Handle'

# 一行出力
jq '-c [.group.unread_count_display, .group.name]'

# 特定の要素が存在するか
jq 'select(has("age"))'

# 特定の要素を含むかチェック
jq 'select(contains({age:20}))'

# ハッシュの生成
jq '.[]|{a: .foo, b: bar}'

# 特定のキーでソート
jq 'sort_by(.key)'

# 全行をまとめて配列にしてjqに食わせる
jq '.[]|{a: .foo, b: bar}' | paste -s -d ',' | sed -e 's/^/\[/' -e 's/$/\]/' | jq 'sort_by(.b)'

# CSV的な出力
jq -r '.TargetHealthDescriptions[]|select(.TargetHealth.State!="healthy2")|[.Target.Id,.TargetHealth.State]|join(",")'

# 特定のをnullに書き換え(ない場合もある)
jq 'if(has(".next_cursor")) then .next_cursor|=null else . end'

jqは使い方の参考だがある程度使うコマンド固定で適当な名前を定義して使えばpecoと組み合わせて実行みたいなこともできる

server辞書にワンライナーのコマンドをメモしておいてそのまま実行みたいなこともできる

使い方次第で色々らくできると思う

設定ファイル

vimrc

vimrc/ディレクトリを用意してその下に記述する内容を分けて設定を記述

.vimrcで分けた設定ファイルを読み込むようにしている

ディレクトリ構成はこんな感じ

vimrc
|-- plugins
|   |-- ale.vim
|   |-- caw.vim
|   |-- complete.vim
|   |-- indent-guides.vim
|   |-- indentline.vim
|   |-- lightline.vim
|   |-- powerline.vim
|   |-- quickhl.vim
|   |-- smartchr.vim
|   |-- srcexpl.vim
|   |-- submode.vim
|   |-- taglist.vim
|   |-- unite-outline.vim
|   |-- unite.vim
|   |-- vcscommand.vim
|   |-- vim-go.vim
|   `-- yankround.vim
`-- rc
    |-- basic.vim
    |-- mapping.vim
    |-- plugins.vim
    `-- tab.vim

binディレクトリに自作コマンド

Ansibleでの環境構築時に~/dotfiles/binへのPATHを通すようにしている

  • .zshrc
export PATH="$HOME/dotfiles/bin:$PATH"

なんかしら汎用的に使えそうなコマンドとかシェルスクリプトはこのディレクトリにおいてサクッと使えるようにしている

どれも車輪の・・・感はあるもののなんだかんだで便利に使っているものが多い

一部紹介すると

  • server

カレントディレクトリでpythonのhttp.serverを起動するためだけのコマンド

単純な静的ファイルやHTMLレポート生成ツールなどの成果物をserveしたいときとかに便利

  • file2slack

ファイル内容をslackに投稿するためのコマンド

調査などでコマンドの結果をそのままslackに投げたいときとかに使っている

最初のうちは結構使っていたが最近は調査自体が減ってしまったので出番があまりない

下記記事で紹介している

slack APIでコードスニペットを投稿する - notebook

swfz.hatenablog.com

  • wcmd
#!/bin/bash

inotifywait --recursive --monitor --quiet \
  --event MODIFY \
  --exclude ".*\.sw[pox]|./log|./tmp|./git" \
  ./ | while read d e f;
do
  echo "$d$f"
  "$@"
  echo '---------- END ----------'
done

inotifytoolsでファイルの変更を検知して設定したコマンドを実行するやーつ

最近は開発用のサーバーを立ち上げる系のコマンドだったりは大体変更したら自動でリロードしてくれる便利な感じになっているのでそんなに出番がなくなった

変更を検知する部分だけをコマンド化してあるので用途は色々ある

直近だとmd2googleslideでスライド作成をmarkdownファイルに変更があるたびに実行したりしてた

pecoの活用

下記記事で紹介しているコード辺をzsh/pecoに書いていて.zshrcで読み込むようにしている

  • .zshrc
# zshディレクトリ以下の設定ファイルを読み込み
for file in $HOME/dotfiles/zsh/*
do
  source $file
done

branchのフィルタリング、変更があったファイルのフィルタリングあたりは今もよく使っている

pecoを使った便利な設定などのまとめ - notebook

swfz.hatenablog.com

まとめ

ダラダラと書いてしまいましたが良さそうなのがあれば取り入れてみてくれれば光栄です

メンテ全然してなかったのでちょこちょこ時間見つけてやっていきたい所存

最後にdotfilesへのリンクを張って終わります

swfz/dotfiles

github.com