空いてる日にちを埋めていくスタイル
今すぐaliasを登録しておくべきGitワンライナー
はじめに
今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018 の2日目です。
私はプロジェクト依存のものはなるべくMakefileから利用するようにしているので,.zshrc
は Git 関連程度で薄く保たれています。
皆さんの素敵なワンライナーが見られるよう,貢献させていただきます。
大いに盛り上がって欲しいと思います。
本題
業務で叩くものの中で1番多いであろうGitコマンド。
もう checkout のタイポで移動できない,なんて無くしましょう。gc
で十分です。
また,GitHub では issue 駆動の開発をしていますが,issues/ は 7 文字です。i
で十分です。
以下をコピペし,些細な工夫でモチベーションが下がるのを防ぎましょう。
# g: git
alias g='git'
# gc: checkout
alias gc='git checkout'
fuction gci (){ git checkout issues/$@ }
# gcb: checkout with a new branch
alias gcb='git checkout -b'
function gcbi (){ git checkout -b issues/$@ }
# gpr: pull the PR branch
function gpr (){ git fetch upstream pull/$@/head:pr/$@ && git checkout pr/$@ }
# gp: push
alias gp='git push'
alias gpo='git push origin'
function gpoi (){ git push origin issues/$@ }
個人的によく使う(ベタな)bash alias
今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018の3日目の記事です。
前回は@YutoMizutaniさんの今すぐaliasを登録しておくべきGitワンライナーでした。
(かぶった部分があることを先にお詫びしておきます...)
「ワンライナー」と言えるほどライナーライナーしてないのですが、簡単だけどもよく使う(ベタともいう)エイリアスを書いておこうかと思います。
物によっては便利かもしれない。
前提
- OS: macOS
- shell: bash
- 基本的になんでもCLIで行いたい人間です
超基本的なカスタム
色づけなど
if [ "Darwin" = 'Darwin' ]; then
alias ls='ls -G'
else
eval `dircolors ~/.colorrc`
alias ls='ls --color=auto'
fi
alias la='ls -a'
alias ll='ls -l'
alias tree='tree -C'
ls
- lsコマンドは、物によって色づけのオプションが異なる
- 自分の環境ではこの分け方で十分だが、もっと変えようがあると思う。
- なおこれはコピペしてきた思い出がある。
- 用途: lsに色づけしたい
la
-
ls -a
もよく使いますよね。 - 用途:
.*
ファイルも見たい時
ll
-
ls -l
もよくt(ry - 用途:
ls
で詳細が見たい時
tree
- 用途: treeコマンドの出力に色づけする
git関連
git関連は最もよく使うコマンドの一つだと思います。
そこで、ベタですがいくつか載せておきます
alias gs='git status' # `git status`の確認
alias gd='git diff' # `git diff`の確認
alias gc='git commit' # commitする
alias gca='git commit --amend' # 前のコミットの編集
alias glo='git log --oneline' # コミットログを各一行で読む
alias mkpr='hub pull-request' # PRを書く
alias prs='ghi | grep ↑' # 現在のレポジトリのPR取得
少しだけ解説
mkpr
-
hub pull-request
でPRをかけるのでそのショートカット - 用途: CLIからPRを送る
hubコマンドは、githubを使うにあたって便利なコマンド群を提供します。
調べると色々出てくると思います。Githubユーザーには強くおすすめ。
公式: github/hub
prs
-
ghi
コマンドでissue&PRの一覧が取得できるため、そこからPRのみを抽出 -
ghi
ではPRには↑
の記号が付いていることからそれのみをgrepしている - 用途: PRの一覧を見る
ghiコマンドはGithubのissue周りの管理をするコマンドです。
これもまた便利。githubユーザーには強くおすすめ。
公式: stephencelis/ghi
utilityツール群
その他諸々なツール群
alias init='[ ! -d ".git" ] && { git init; git flow init; hub create; } || echo "aleady initialized"' # プロジェクト作成時に行う一連の作業
alias bashrc='source ~/.bashrc' # bashrc再読み込み
alias bash_profile='source ~/.bash_profile' # bash_profile再読み込み
alias back='cd $OLDPWD' # 一つ前のディレクトリにback
init
新たなプロジェクトを作成するときに、自分が使っている一連の作業を詰め込んだものです。
[ ! -d ".git" ] \
: # `.git`ディレクトリが存在していなければ \
&& { git init; git flow init; hub create; } \ : # `git`を初期化してgit-flowも初期化、githubにレポジトリを作成する
: # `.git`ディレクトリが存在していれば \
|| echo "aleady initialized" # 初期化済みだよと出力して終了
-
git init
: おなじみgitの初期化 -
git-flow
: 開発手法の一つであるgit-flow
をサポートする拡張コマンド -
hub create
: hubコマンドの機能の一つで、githubに現在のレポジトリを作成します。
git-flowも調べれば出てきますが、割とおすすめな開発手法です。
自分は、その拡張であるgit-flow-avh
を使っています。
CLIツール公式: nvie/gitflow
CLIツールavh版公式: petervanderdoes/gitflow-avh
bashrc
名前のまま、です。
- 用途: bashrc書き直した時など
bash_profile
名前のままです。
- 用途:
bash_profile
に書かれてる処理がたまに実行されていない時など -
##
back
現在いるディレクトリの一つ前のディレクトリに移動します。
$ pwd # 元のディレクトリ
/Users/me/dotfiles/vim
$ cd ~/Desktop/hoge # 他のディレクトリに移動
$ pwd
/Users/me/Desktop/hoge
$ back # 一つ前にいたディレクトリへ移動
$ pwd
/Users/me/dotfiles/vim
-
$OLDPWD
には、一つ前のpwd
が保存されている(man bash
を探ると書いてあります) -
cd -
でも同様の動作はできる -
cd -
ではない理由:cd -
だとパスが出力され、個人的に邪魔だったから。
おまけ
正直あまり使ってない(or実用的ではない)けど面白いのがいくつかあるのでおまけで載せておきます
Macに関わる設定
mac以外では通用しない設定たちです。
alias airport='/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport'
alias wport='networksetup -setairportpower' # usage: wport <device> <on/off>
alias wifi='networksetup -setairportnetwork' # usage: wifi <device> <SSID> <password>
alias siri='open /Applications/Siri.app'
airport
- airportユーティリティへのショートカット
- このコマンドはデフォルトで存在しているがパスは通っていない
- ネットワーク周りの設定をするコマンドだったと思う(きちんと使えていないため紹介のみ)
wport
- 同じくネットワーク系コマンドの
networksetup
のラッパーです。 - 正直あまりわからない。
- 各デバイス(wifiやbluetoothなど)をオンオフします。
wifi
- 同じくnetworksetupのラッパー
- wifiアクセスポイントに接続を試みます
- GUIで接続した方が楽(パスワードを求められないため)のであまり使っていない
siri
- 文字通りsiriを起動する
- ちょっともっさりする
個人的utility群
全員の役には立たないけど自分が使っている諸々
alias drp='cd ~/Dropbox && ls'
alias dotdrop='$HOME/dotfiles/dotdrop.sh'
alias jnethack='cocot -t UTF-8 -p cp932 -- ~/nethackdir/jnethack'
drp
- ドロップボックス内に移動します
dotdrop
- dotfile管理ツールのdotdrop用エイリアス
jnethack
* ローグライクゲーム"nethack"の日本語バッチ版の起動用エイリアス
* ちょっとややこしいのでエイリアス化した
お金を貸してと言ったら「といちですよ」といわれたので
お金を貸してといったら、「といちですよ。」といわれて、一体いくらになるのか怖くなったので、
いくらになるか計算するPythonワンライナーを考えてみた。
lambda days, dept, l=lambda days, dept: True and [globals().__setitem__("t",lambda dept:globals().__setitem__("ret",dept))] and [t(dept)] and [1.1 for x in range(1,days + 11) if x % 10 == 0]: reduce(lambda x, y: [globals().__setitem__("ret", ret * y)] and ret , l(days, dept))
_(借りてから経過した日付, 借りたお金)
複利って怖いですね。
phpプログラムの構文チェックをalias登録
はじめに
phpの構文チェック、phpcsなどを入れて本格的にチェックしたい場合もあるでしょうが、とりあえずローカルとかでもちょこっとだけやっておきたいときってありますよね。
そんなときの小ネタです。
単一phpファイルの構文チェック
実は単一のファイルに対するphpの構文チェックは php -l [ターゲットファイル]
で実施できます。
# php -l example.php
No syntax errors detected in example.php
ディレクトリ全体の構文チェック1
では、特定のディレクトリの下を全部チェックしたい場合はfindと組み合わせれば再帰的にチェックしてくれます。
$ find ./ -name "*.php" | xargs -n1 php -l
No syntax errors detected in ./example1.php
No syntax errors detected in ./example2.php
No syntax errors detected in ./example3.php
No syntax errors detected in ./dir1/example1.php
No syntax errors detected in ./dir1/example2.php
No syntax errors detected in ./dir1/example3.php
No syntax errors detected in ./dir2/example1.php
No syntax errors detected in ./dir2/example2.php
PHP Parse error: syntax error, unexpected '{' in ./dir2/example3.php on line 14
Errors parsing ./dir2/example3.php
xargs: php: exited with status 255; aborting
途中でどこかエラーがあったら止まりますが、少し出力内容が多いので邪魔ですね。
ディレクトリ全体の構文チェック2
成功した行を捨ててしまいましょう。
$ find ./ -name "*.php" | xargs -n1 php -l > /dev/null
PHP Parse error: syntax error, unexpected '{' in ./dir2/example3.php on line 14
Errors parsing ./dir2/example3.php
xargs: php: exited with status 255; aborting
aliasに登録しておこう
ついでにこれを.bashrcなどにalias登録しておきましょう。
~中略~
alias phplint='find ./ -name "*.php" | xargs -n1 php -l > /dev/null'
$ phplint
PHP Parse error: syntax error, unexpected '{' in ./dir2/example3.php on line 14
Errors parsing ./dir2/example3.php
xargs: php: exited with status 255; aborting
便利ですね。
もちろん、同様のaliasを登録しておけばphp以外でも各種言語で簡単に手元でのチェックができるようになります。
穴埋め: gitにもaliasの指定ができる件
あるページの画像をガッっと一気にダウンロードしようぜ!
あるWebページから画像をいっぺんにDLしたいときってあるよね!
いちいちマウスで右クリックして「名前をつけて画像を保存」をして、これを繰り返して、ってめんどくさいですよね。
ワンライナーで解決しましょう!
一括DLコマンド
curl -Ls $URL | xmllint --html --xpath '//img/@src' - | xargs -n 1 | cut -d= -f2 | sed 's/^\/\//https:\/\//' | xargs -n 1 curl -L#O
$URL
がURL部分になりますので、目的のURLに置き換えましょう。
下は実行サンプルです。(注:読みやすくするために改行しています。)
DLしたデータを区別しやすいように、適当なディレクトリを作ってそのディレクトリ下で実行したほうがよいでしょう。
$ curl -Ls https://www.irasutoya.com/2015/11/blog-post_607.html | \
xmllint --html --xpath '//img/@src' - | \
xargs -n 1 | \
cut -d= -f2 | \
sed 's/^\/\//https:\/\//' | \
xargs -n 1 curl -L#O
ちょいと解説
curl
ご存知、Webページを取得するコマンド「カール」です。1
-L
で、リダイレクト指示されてもリダイレクト先の情報を取るようにします。
-s
で、インジケータ(進捗状況を表すメモリ)を出さないようにします。
-#
は、インジケータではなく#
で作られた進捗メーターが出ます。
-O
は、ファイル出力です。ファイル名指定しないと、画像のファイル名を用いて保存します。
xmllint
XMLをパースするコマンドです。HTMLもパースできます。
--html
で、htmlとみなしてパースします。
--xpath
で、XPathを用いて部分的にデータを抽出します。
-
は、データとして(パイプから渡された)標準入力を用いることを指します。
xargs
引数の最大値はOS依存ですが、限界があります。コマンド xargs
は、主にパイプで与えられたデータを引数の列挙とみなし、コマンドを実行します。
ここでは、1行ずつ処理するために '-n' オプションを使っています。
xargs -n 1
は、コマンドが省略されているので、暗黙的に echo
が実行されます。2
xargs -n 1 curl
は、 curl ...1個目...
curl ...2個目...
と、順番にcurlが実行されます。
cut
ワンライナー使いの定番コマンドですな。
-d
で示すデリミタで引数(主に文字列)を区切り、-f n
で、n番目のものを抽出します(n,m
やn-m
とかn-
とかといった複数指定も可能)
sed
こちらもワンライナーなどでよく使われる、元祖正規表現置換コマンド。3
ここでは、URLが//
で始まる場合に、https://
にするよう置換しています。
エイリアス化
エイリアス(alias)化はできないです。URLとして引数を使うので。
なので手軽に使いたい場合は、.bashrc
など、rcファイルに関数として登録するといいかもですね。
#関数サンプル(追加部分)
imgg() {
curl -Ls $1 | \
xmllint --html --xpath '//img/@src' - | \
xargs -n 1 | \
cut -d= -f2 | \
sed 's/^\/\//https:\/\//' | \
xargs -n 1 curl -L#O
}
使用上のご注意!
- HTML内の
<img>
だけを抽出し、そのsrc属性を参照しています。cssで定義されている画像やJavascriptなどで動的に読み込んだ画像(例えばGoogleの検索結果ページのようなもの)には対応していません。改造すればいけるかもですが。 - HTMLに構文的なエラーがある場合、標準エラー出力にxmllintのエラーが表示されますが、処理はそれを無視して進みます。
- 短時間に大量にアクセスすると、対象のサーバに負荷がかかりますので、良識の範囲で使いましょう!
- 画像やコンテンツには著作権があります。著作権を侵害しないように使いましょう!
(おわり)
とにかく多用するワンライナーもといaliases
エイリアスです
[Darth@Death Star: ~]$ alias | grep ls
alias imgls='/Users/Darth/.iterm2/imgls'
alias ll='ls -l'
alias ls='ls -aF --color --time-style="+%Y-%m-%d %H:%M:%S"'
alias lsr='ls -lSr'
alias ltr='ls -ltr'
ワンライナー黒魔術はコピペメンにより事故る可能性が高いので今回は安全なエイリアスの中でとにかく利用頻度が高いものを挙げてみます。しかも ls
縛り
ltr
alias ltr='ls -ltr'
まぁ使いますね、ログディレクトリなんかで大活躍
なに? ls -lt
は無いのかって?
そんなの使わないでしょ、必要なら ltr|tac
でも叩こうよ
lsr
alias lsr='ls -lSr'
実はそんなに使わないですね。多分 ls --full | sort -k 5 -n
とか使う人が多いんじゃ無いかな
でも有ると便利な lsr
なに? ls
は無いのかって? 無茶言うな、そもそもそんなリスト要らん
なんで r
なの?
ls -lt|head
とか叩くの面倒じゃ無いですか、以上
以上、白魔術としての多分事故らない aliases for newbies でした
負荷発生・事後調査のときに便利なワンライナー
今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018 9日目の記事です。
前回は@szfさんのとにかく多用するワンライナーもといaliasesでした。
本日は、負荷発生時や事後調査時に便利に使えるワンライナーをご紹介していきます!
Ubuntu, Apacheを想定していますが、チョチョッと変えていただければ他の環境でも利用できるかと思います。
容量多いディレクトリ上位を調べる
du -m / | sort -rn | head -100
ディスク容量が足りなくなった際に重宝します。
(さすがにこの時代にそんな障害起きひんやろwと思いきや、たまに起きてしまうやつです・・・)
処理が終わるまで時間がかかるので、大体の目星がついている際はそのディレクトリ以下のみにするなど工夫してください。
容量多いファイル上位を調べる
du -ma / | sort -rn | head -100
こちらもディスク容量が足りなくなった際に重宝します。
ディレクトリ上位を調べたあとに、まだどの部分化特定できないようなら使うといいと思います。
30日以上経過しているファイル削除を調べる
find /fuga/cache -type f -mtime +30 -exec rm -rf {} \;
取り急ぎログファイルやキャッシュファイル等の古いファイルを手動で消したいときに重宝します。
(ログファイル等は、このワンライナーで手動削除するのではなく、きちんとrotateしたほうがいいです)
日別のログ行数出力を調べる
for file in `find -type f -name "access_log.2018112*.gz" | sort`; do echo $file `zcat $file | wc -l`; done
# access_log.201811201.gz 20000
# access_log.201811202.gz 24000
# access_log.201811203.gz 19000
# access_log.201811204.gz 12000
# access_log.201811205.gz 45000
# ...
負荷発生日時の前後のアクセス数、エラー数等をサクッと知りたいときに使えます。
ls -l
でファイルサイズを見てもおおよその検討はつきますが、より具体的に調べていく過程で使うと便利です。
時毎のアクセス数を調べる
cut -d'[' -f2 /var/log/apache2/access_log.`date +%Y%m%d` | cut -d' ' -f1 | cut -d':' -f2 | sort | uniq -c
事後調査をする際、障害発生時刻の前後で比較したいときに便利です。
分毎のアクセス数を調べる
cut -d'[' -f2 /var/log/apache2/access_log.`date +%Y%m%d` | cut -d' ' -f1 | cut -d':' -f2,3 | sort | uniq -c | grep 12:
事後調査をする際、より具体的な発生時刻を特定するのに便利です。
秒毎のアクセス数を調べる
cut -d'[' -f2 /var/log/apache2/access_log.`date +%Y%m%d` | cut -d' ' -f1 | cut -d':' -f2,3,4 | sort | uniq -c | grep 12:00:
# 2 12:00:00
# 10 12:00:01
# 22 12:00:02
# 27 12:00:03
# 10 12:00:04
# ...
事後調査をする際、分間のアクセス調査後にさらにブレークダウンして調べたいときに便利です。
負荷テスト(古いシステムから新しいシステムへ移行するような場合)に、最大秒間どれくらいさばければいいのかの指標を探すのにも使えます。
リクエスト別のアクセス数を調べる
cat /var/log/apache2/access_log.`date +%Y%m%d` | awk -F '"' '{print $2}' | awk '{print $2}' | sort | uniq -c | sort -n -r | head -n 5
# 13600 /api/entries/
# 10210 /api/images/
# 9000 /api/users/
# 6900 /api/categories/
# 5600 /api/likes/
どこへのリクエストが多いのか調べるときに便利です。
いかがだったでしょうか。
簡単なものばかりですが、これらを組み合わせて調査していくことである程度問題を特定できたりしますので、ぜひ使ってみてください。
Gitブランチをきれいにするワンライナー
普段業務で使っているAWS関連のワンライナー
はじめに
大阪にある株式会社鈴木商店の姜です。
弊社は100%自社開発で受託開発を行っている会社です。
主にAWS上にフルスクラッチでシステムを構築することが多く、クライアント毎にAWSアカウントが複数あります。
その中でそれぞれのアカウントのEC2にアクセスして作業するのは大変です。
そこで、普段の業務でEC2のIPアドレスやDBの情報などをなるべく楽に見れるように使っているワンライナーを公開します。
利用方法
こんな感じです。
# 全てのEC2の情報を取得する
$ ec2 foo # fooは後述のアカウント名
| InstanceName | PublicIpAddress | InstanceId | InstanceType | KeyName | State |
| -------------- | --------------- | ------------------- | ------------ | -------- | ------- |
| pro-ec2-batch | XX.XX.XX.XX | i-xxxxxxxxxxxxxxxxx | t2.micro | keypairA | running |
| pro-ec2-mta | YY.YY.YY.YY | i-yyyyyyyyyyyyyyyyy | t2.micro | keypairB | stopped |
# 起動中のEC2のみ取得する
$ ec2-running foo
| InstanceName | PublicIpAddress | InstanceId | InstanceType | KeyName | State |
| -------------- | --------------- | ------------------- | ------------ | -------- | ------- |
| pro-ec2-batch | XX.XX.XX.XX | i-xxxxxxxxxxxxxxxxx | t2.micro | keypairA | running |
# RDSの情報を取得する
$ rds foo
| DBInstanceIdentifier | DBInstanceStatus | DBName | Address |
| -------------------- | ---------------- | ------- | -------------------------------------- |
| pro-ZZZZZ | available | DB_NAME | AA.XX.ap-northeast-1.rds.amazonaws.com |
| stg-ZZZZZ | available | DB_NAME | BB.YY.ap-northeast-1.rds.amazonaws.com |
下準備
AWSアカウントの設定
AWS CLIを使うので、各アカウントにIAMユーザを作成してキーを取得して設定しておきます。
$ cat ~/.aws/credentials
[foo]
aws_access_key_id = AKIAXXXXXXX
aws_secret_access_key = XXXXXXXX
各種ツールをインストール
- pip
sudo easy_install pip
- aws cli
sudo pip install awscli
- jq
brew install jq
- csvkit
pip install csvkit
関数を登録
次に~/.bashrc
にでも以下を登録します。
source ~/.bashrc
を忘れないように。
alias aws="aws --region ap-northeast-1"
function rds {
aws --profile $1 rds describe-db-instances | jq -r '[ "DBInstanceIdentifier", "DBInstanceStatus", "DBName", "Address" ], (.DBInstances[] | [ .DBInstanceIdentifier, .DBInstanceStatus, .DBName, .Endpoint.Address]) | @csv' | csvsort -c DBInstanceIdentifier | csvlook
}
function ec2-running {
aws --profile $1 ec2 describe-instances --filter "Name=instance-state-name,Values=running" | jq -r '[ "InstanceName", "PublicIpAddress", "InstanceId", "InstanceType", "KeyName", "State" ], (.Reservations[].Instances[] | [(.Tags[] | select(.Key=="Name").Value), .PublicIpAddress, .InstanceId, .InstanceType, .KeyName ,.State.Name]) | @csv' | csvsort -c InstanceName | csvlook
}
function ec2 {
aws --profile $1 ec2 describe-instances | jq -r '[ "InstanceName", "PublicIpAddress", "InstanceId", "InstanceType", "KeyName", "State" ], (.Reservations[].Instances[] | [(.Tags[] | select(.Key=="Name").Value), .PublicIpAddress, .InstanceId, .InstanceType, .KeyName, .State.Name]) | @csv' | csvsort -c InstanceName | csvlook
}
function ec2-start {
aws --profile $1 ec2 start-instances --instance-ids $2
}
function ec2-stop {
aws --profile $1 ec2 stop-instances --instance-ids $2
}
以上。
番外編
他にもよく使うものをご紹介。
- グローバルIPを取得
curl ifconfig.io
- マージ済みのローカルブランチを削除(AWSとは関係ないですが・・)
git branch --merged | grep -vE '^\*|master$|develop$' | xargs -I % git branch -d %
- Apacheログをステータスコードでフィルタする(これは500番台)
cat access_log | awk '($9 >= 500 && $9 < 600 || $7 >= 500 && $7 < 600) {print $0 }' | less
- sshdが上がってくるまで再接続を試みるスクリプト
sshr() {
while ! ssh -o ConnectTimeout=1 $@; do sleep 1; done
}
dockerで開発する時に重宝しているalias
空いてる日にちがあったので、飛び入りですが参加します。
ローカルでDocker使ってイメージビルドしていると、ふと気がつけば相当な容量を食ってしまっていることがあります。
開発が終わったもの、ビルドに失敗したコンテナやイメージなど不要なものは削除して整理しておきたいですが、逐一docker rm(i)コマンドを打つのは手間であると。
わかります。その気持ち。
いらない、何も、捨ててしまおう。
というわけで、最近この2行をaliasとして使っています。
# container全削除
alias rm-containers='docker ps -aq | xargs docker rm'
# image全削除
alias rm-images='docker images -aq | xargs docker rmi'
ぜひお役立てください。
よく使うエイリアス
※この記事はこちらのアドベントカレンダーに参加しています。
https://qiita.com/advent-calendar/2018/yumemi01_one-liner
というわけで、やっていきます。
ちなみにちゃんとbashを使い始めたのは大体3か月ぐらい前くらいです。それまでは完全なwindowsマンでしたので、低レベルな内容になるかと思いますがご容赦ください。
Docker関連
僕は普段の業務でdocker-compose up
してから、docker ps
してコンテナIDを調べてからコンテナに入るということをやっているので下記のaliasを張っています。
alias dcp='docker-compose'
alias dop='docker ps'
function dce() {
docker exec -it $1 bash
}
毎回dockerのコンテナID入力するとか面倒じゃない?と思ったかたもいると思いますが、じつはコンテナIDって全部入力しなくてもいいんですよ。コンテナを識別できる文字数(2文字か3文字程度)が入力されていれば普通にログインできます。
下記が例。
$ docker-compose up
# コンテナが起動する
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7ec42e8cef5 node_web "node" 13 seconds ago Up 4 seconds 0.0.0.0:8080->3000/tcp node
78303277dc02 mysql:5.7 "docker-entrypoint.s…" 16 seconds ago Up 11 seconds 0.0.0.0:3306->3306/tcp db
$ docker exec -it e7 bash
# これでコンテナにログインできる
なので、この例を最初に紹介したエイリアスを張った場合には、下記のようになります。
$ dcp up
$ dop
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7ec42e8cef5 node_web "node" 13 seconds ago Up 4 seconds 0.0.0.0:8080->3000/tcp node
78303277dc02 mysql:5.7 "docker-entrypoint.s…" 16 seconds ago Up 11 seconds 0.0.0.0:3306->3306/tcp db
$ dce e7
コンテナを複数立ち上げて頻繁に入りなおす場合なんかはこうしておくと便利です。
あと、そもそもコンテナIDじゃなくてimageの名前で定義しておけばいいんじゃない?って人もいると思います。それでもいいと思います。
ただ、僕はいまからどのコンテナに入るかを明確に意識するために毎回IDを見てから入るようにしています。これは個人の感覚の問題なので好きなやりかたでok。
あと当たり前の話ではありますが、$ docker exec -it $1 bash
というコマンドはbashがインストールされてるイメージじゃないと怒られます。alpineベースのコンテナだとデフォルトではbashが入っていないのでインストールさせるかコマンドの末尾を bin/sh
もしくは ash
に変更しましょう。
git関連
alias glo='git log --oneline'
alias gb='git branch'
alias gba='git branch -a'
function gcb() {
git checkout -b $1
}
gitは敢えてしぼっています。
pushやcommitもよく使いますが、aliasで短くした結果コマンド間違ったみたいなことになると嫌なので。。。
とりあえずこんなとこですかね。
来年はもうちょっとターミナルを活用していきたいなーと思っています。
皆様、良いお年を~
追記
tree='pwd;find . | sort | sed '\''1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/| /g'\'''
どこまでワンライナーで実現できるか!? サーバ負荷のボトルネック箇所をすばやく確認できるようにしてみる
ゆめみさんのAdvent Calendarのイベントに乗っかってチャレンジしてみました。
やってみたこと
よく、サーバが重いなーっといったときにpsコマンドやtopコマンドでリソースの状況をチェックしたり、ディスクがいっぱいになってきて何を消そうかというときに容量の多いディレクトリがどこかをチェックしたり行うかと思います。
こういったものをちょっとワンライナーを工夫してすばやく・わかりやすく確認できるようにしてみようと思います。
普段からよく使っているものというわけではなく、今回のこの機会に便利になるようなワンライナーを設定してみたという話です。
ただ、単純に見れるようにするだけだとあれなので、どこまでコンソール上で状況をワンライナーで表現できるかを試しています。
作成したワンライナー
今回は4つの設定を試してます。
- CPU使用率のTop10のプロセスリストを表示
- メモリ使用率のTop10のプロセスリストを表示
- ディレクトリサイズのTop10を表示
- CPU、メモリ使用率Top10を常時表示
CentOS7系のbash前提となります。その他環境だと動かないかもしれないのでご了承ください。
必要なパッケージは極力ミニマムで済むようにしています。
利用しているのはdu,awk,expr,echo,ps,head,cut,read,while,xargs,ifとかぐらいです。
CPUの使用率のTop 10プロセスリスト(bneck.cpu)
psコマンドの実行結果のなかからpcpuのカラム情報を抽出し、パーセンテージの高いものから順に10件並べています。
視覚的にもわかりやすいように、パーセンテージを示すバーもセットで表示してみました。
alias bneck.cpu='echo -e "\033[37;44;1mCPU Top10\033[m"; echo -e "%CPU PID COMMAND"| awk '\''{printf "\033[0;36;4m%-30s %-10s %s\033[m\n",$1,$2,$3}'\''; ps ahxo pcpu,comm,pid k -pcpu |head -n 10 | while read line; do value=`echo ${line} |xargs |cut -d " " -f 1`; proc_comm=`echo ${line} |xargs |cut -d " " -f 2`; pid=`echo ${line} |xargs | cut -d " " -f 3`; percent=`expr ${value%.*} / 5`;bar=`for i in \`seq 0 ${percent}\`;do echo -n "#"; done`; if [ ${value%.*} -gt 50 ]; then color_code=31; elif [ ${value%.*} -gt 30 ]; then color_code=33; else color_code=32; fi; echo -e "$value $bar $pid $proc_comm $color_code" | awk '\''{printf "%-7s [\033[0;%d;1m%-20s\033[0;m] %-10s %s\n",$1,$5,$2,$3,$4}'\''; done'
このコマンドを実行するとこんな感じ。
メモリの使用率のTop 10プロセスリスト(bneck.mem)
次にメモリの使用率のTop 10です。こちらもCPUと同じくpsコマンドのpmemカラムの情報をピックアップして表示するようにしています。
ワンライナーの中身的には先程のCPUのものとほぼ同じです。
alias bneck.mem='echo -e "\033[37;44;1mMemory Top10\033[m"; echo -e "%MEM PID COMMAND"| awk '\''{printf "\033[0;36;4m%-30s %-10s %s\033[m\n",$1,$2,$3}'\''; ps ahxo pmem,comm,pid k -pmem |head -n 10 | while read line; do value=`echo ${line} |xargs |cut -d " " -f 1`; proc_comm=`echo ${line} |xargs |cut -d " " -f 2`; pid=`echo ${line} |xargs | cut -d " " -f 3`; percent=`expr ${value%.*} / 5`;bar=`for i in \`seq 0 ${percent}\`;do echo -n "#"; done`; if [ ${value%.*} -gt 50 ]; then color_code=31; elif [ ${value%.*} -gt 30 ]; then color_code=33; else color_code=32; fi; echo -e "$value $bar $pid $proc_comm $color_code" | awk '\''{printf "%-7s [\033[0;%d;1m%-20s\033[0;m] %-10s %s\n",$1,$5,$2,$3,$4}'\''; done'
ディレクトリサイズのTop10(bneck.dir)
こちらは、duコマンドで指定のディレクトリ配下のディレクトリをサイズ順に並べるように表示しています。
再帰的にディレクトリ配下を一気に確認できるようにしてもよかったですが、応答のスピードのことも考え、ディレクトリは1階層下のもののみを対象にしています。
その代わり、表示されたディレクトリを選択してドリルダウンで辿っていけるようにしてみました。
指定のディレクトリのみの情報をとりたかったので、aliasだと引数渡せなかったので、ここだけはaliasではなくfunctionとして設定してます。
function bneck.dir () {
total_size=`du -s -b $1|cut -f 1`; kib_total_size=`expr $total_size / 1024`; mib_total_size=`expr $kib_total_size / 1024`; gib_total_size=`expr $mib_total_size / 1024`; if [ $gib_total_size -ne 0 ]; then view_total_size=${gib_total_size}GiB; elif [ $mib_total_size -ne 0 ]; then view_total_size=${mib_total_size}MiB; elif [ $kib_total_size -ne 0 ]; then view_total_size=${kib_total_size}KiB; else view_total_size=${total_size}B; fi; echo -e "\033[37;41;1m $1 (total: $view_total_size)\033[m\033[37;44;1m directory size Top10\033[m"; echo -e "SIZE PUSED DIR"| awk '{printf "\033[0;36;4m%-15s %-27s %s\033[m\n",$1,$2,$3}'; count=0; select_col=2; command_result=`du -b -d1 $1 | sort -rn |head -n 10`; IFS=$'\n'; while true; do for line in $command_result; do if [ $count -eq 0 ]; then count=1; continue; else count=`expr $count + 1`; fi; size=`echo ${line} |cut -f 1`; kib_size=`expr $size / 1024`; mib_size=`expr $kib_size / 1024`; gib_size=`expr $mib_size / 1024`; if [ $gib_size -ne 0 ]; then view_size=${gib_size}GiB; elif [ $mib_size -ne 0 ]; then view_size=${mib_size}MiB; elif [ $kib_size -ne 0 ]; then view_size=${kib_size}KiB; else view_size=${size}B; fi; dir_name=`echo ${line} |cut -f 2`;percent=`expr ${size} \* 100 / ${total_size}`;bar_num=`expr $percent / 5`;bar=`for i in \`seq 0 ${bar_num}\`; do echo -n '#'; done`; if [ $bar_num -gt 10 ]; then color_code=31; elif [ $bar_num -gt 6 ]; then color_code=33; else color_code=32; fi;if [ $select_col -eq $count ]; then select_dir=$dir_name; selected_color="30;43"; else unset selected_color; fi; echo -e "$view_size ${percent}% $color_code $bar $dir_name $selected_color"| awk '{printf "%-15s %4s [\033[0;%d;1m%-20s\033[m] \033[%sm%s\033[m\n",$1,$2,$3,$4,$6,$5}'; done; read -sn1 key; up_count=`expr $count - 1`; if [ "$key" = "j" -a $select_col -lt $count ]; then select_col=`expr $select_col + 1`; echo -e "\033[${up_count}A\033[0J\033[1A"; count=0; elif [ "$key" = "k" -a $select_col -gt 2 ]; then select_col=`expr $select_col - 1`; echo -e "\033[${up_count}A\033[0J\033[1A"; count=0; elif [ "$key" = "" -o "$key" = "l" ]; then echo -e "\033[`expr $count + 1`A\033[10M\033[1A"; bneck.dir $select_dir; elif [ "$key" = "h" ];then echo -e "\033[`expr $count + 1`A\033[10M\033[1A"; new_dir=${1%/*}; if [ -z $new_dir ]; then new_dir="/"; fi; bneck.dir $new_dir; else echo -e "\033[${up_count}A\033[10M\033[1A"; count=0; fi; done;
}
わかりやすく改行してみるとこんな感じです。(あまり良い書き方ではないかと思いますが。。)
function bneck.dir () {
total_size=`du -s -b $1|cut -f 1`
kib_total_size=`expr $total_size / 1024`
mib_total_size=`expr $kib_total_size / 1024`
gib_total_size=`expr $mib_total_size / 1024`
if [ $gib_total_size -ne 0 ]; then
view_total_size=${gib_total_size}GiB
elif [ $mib_total_size -ne 0 ]; then
view_total_size=${mib_total_size}MiB
elif [ $kib_total_size -ne 0 ]; then
view_total_size=${kib_total_size}KiB
else
view_total_size=${total_size}B
fi
echo -e "\033[37;41;1m $1 (total: $view_total_size)\033[m\033[37;44;1m directory size Top10\033[m"
echo -e "SIZE PUSED DIR"| awk '{printf "\033[0;36;4m%-15s %-27s %s\033[m\n",$1,$2,$3}'
count=0
select_col=2
command_result=`du -b -d1 $1 | sort -rn |head -n 10`
while true
do
for line in $command_result
do
if [ $count -eq 0 ]; then
count=1
continue
else
count=`expr $count + 1`
fi
size=`echo ${line} |cut -f 1`
kib_size=`expr $size / 1024`
mib_size=`expr $kib_size / 1024`
gib_size=`expr $mib_size / 1024`
if [ $gib_size -ne 0 ]; then
view_size=${gib_size}GiB
elif [ $mib_size -ne 0 ]; then
view_size=${mib_size}MiB
elif [ $kib_size -ne 0 ]; then
view_size=${kib_size}KiB
else
view_size=${size}B
fi
dir_name=`echo ${line} |cut -f 2`
percent=`expr ${size} \* 100 / ${total_size}`
bar_num=`expr $percent / 5`
bar=`for i in \`seq 0 ${bar_num}\`; do echo -n '#'; done`
if [ $bar_num -gt 10 ]; then
color_code=31
elif [ $bar_num -gt 6 ]; then
color_code=33
else
color_code=32
fi
if [ $select_col -eq $count ]; then
select_dir=$dir_name
selected_color="30;43"
else
unset selected_color
fi
echo -e "$view_size ${percent}% $color_code $bar $dir_name $selected_color"| awk '{printf "%-15s %4s [\033[0;%d;1m%-20s\033[m] \033[%sm%s\033[m\n",$1,$2,$3,$4,$6,$5}'
done
read -sn1 key
up_count=`expr $count - 1`
if [ "$key" = "j" -a $select_col -lt $count ]; then
select_col=`expr $select_col + 1`
echo -e "\033[${up_count}A\033[0J\033[1A"
count=0
elif [ "$key" = "k" -a $select_col -gt 2 ]; then
select_col=`expr $select_col - 1`
echo -e "\033[${up_count}A\033[0J\033[1A"; count=0
elif [ "$key" = "" -o "$key" = "l" ]; then
echo -e "\033[`expr $count + 1`A\033[10M\033[1A"
bneck.dir $select_dir
elif [ "$key" = "h" ];then
echo -e "\033[`expr $count + 1`A\033[10M\033[1A"
new_dir=${1%/*}
if [ -z $new_dir ]; then
new_dir="/"
fi
bneck.dir $new_dir
else
echo -e "\033[${up_count}A\033[10M\033[1A"
count=0
fi
done;
}
実行結果はこんな感じ。
CPU、メモリ使用率Top10を常時表示(bneck)
最後は先程のCPU、メモリ使用率Top10を常に表示しておくためのワンライナーです。
alias bneck='while true; do bneck.cpu; bneck.mem; sleep 1; echo -e "\033[24A\033[22M\033[2K\033[1A"; done'
ここまでの各ワンライナーを実行すると以下のようになります。
まとめ
ちょっと便利にするためのお手軽なワンライナーとは程遠い形のものですが、このちょっとした機会をきっかけに以下のような知識を得ました。
- エスケープシーケンス
- ターミナル画面のクリア方法
- 色付け、装飾方法
- カーソル移動方法
- awk
- awkのprintfを使った表示揃えの方法
- alias設定の中でのprintf利用時のシングルクォーテーションの書き方
- read
- 1文字入力の受付と、入力文字の非表示化
お遊び要素もふくめて実施したことではありますが、手を動かしてやってみると何かと知見は得られるものですね。
SSHと履歴検索で便利なalias
会社でも共有して、自分でも重宝している、無いとツライAlias(というかzshとpecoの使い方の話)
環境
- MacOS(Linuxでも良い)
- zsh
- peco
pecoのインストール
pecoを使う前提なので、下記でpecoをインストールする。
$ brew install peco
履歴検索
ctrl
+ r
で履歴検索を便利にするやつ。
設定内容
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000
HIST_STAMPS="yyyy/mm/dd"
function history-all { history -E 1 }
function peco-history-selection() {
BUFFER=$(history | tail -r | awk '{$1="";print $0}' | egrep -v "ls" | uniq -u | sed 's/^ //g' | peco --layout bottom-up)
CURSOR=$#BUFFER
zle reset-prompt
}
zle -N peco-history-selection
bindkey '^R' peco-history-selection
SSH接続先検索
~/.ssh/conf.d/*/
配下のconfigを読み込んで、ctrl
+ s
でSSH接続先を絞るやつ。
### SSH
function peco-ssh () {
local selected_host=$(awk '
tolower($1)=="host" {
for (i=2; i<=NF; i++) {
if ($i !~ "[*?]") {
print $i
}
}
}
' ~/.ssh/conf.d/*/config | sort | peco --layout bottom-up --query "$LBUFFER")
if [ -n "$selected_host" ]; then
BUFFER="ssh -A ${selected_host}"
zle accept-line
fi
zle clear-screen
}
zle -N peco-ssh
bindkey '^S' peco-ssh
MacOSで、ディレクトリ内部の.heicファイルを一括で.jpgファイルに変換する方法
いつの間にか追加してた長いワンライナーとその時のテク
アドベントカレンダー企画で、いつの間にか追加していたワンライナーを載せます。
あと、便利な覚え書き程度のテクを載せます。
gitのrootディレクトリに戻る。
標準のように多用している。
function cdg() { builtin cd `git rev-parse --show-toplevel`; return 0;}
議事録から日付を抜き出す。
find /path/議事録/`date "+%Y_%m_%d"`*.html -type f -print0 | xargs -0 grep '.\{1,2\}月.\{1,2\}日' | pup "text{}" | grep -v '^\s*$' | tail -1 | cut -c 1-20
議事録の最後の行を見る。
find . -type f -name "*議事録*" -not -name "trashed*" | tail -1 | xargs -I% cat '%'
今日の天気
livedoor天気を利用している。。APIにやさしい版はこちらhttps://qiita.com/benridane/items/6ebfe45d8abcc497d09d
curl -s http://weather.livedoor.com/forecast/webservice/json/v1\?city\=270000 | jq -r '.forecasts[0].telop'
簡単なテク解説
- pup: go製のhtmlパーサ。https://github.com/ericchiang/pup
- パーサーはxmllintなどあるが、いろんな環境で動くものとしておススメしたい。
- jq: 高機能パーサ。JSONパーサ。https://stedolan.github.io/jq/
-
pup "json{}"
でjsonに変換してjqで処理することもできる。
-
- find: ファイル検索。
-
-not -name "trashed*"
でファイルを除外できる。
-
- xargs: -0を付けるとヌル文字対応になる。
-
xargs -I% cat '%'
で確かスペース対策で出力できる。
-
- grep:
grep -v '^\s*$'
で空行除外ができる。
以上、ちょっとしたテクでした。
alias登録すべきワンライナーを探すワンライナー
これは 今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018 の18日目の記事です。
@M_Ishikawa です!
このアドベントカレンダー。
登録してみたものの。。
うーん。自分のdotfiles見返してみて、いろんなaliasあるんですが、特に晒そうと思うものがなくて。
一番良く使うgrep
とかgit
とか、あとは集計に| sort | uniq -c | sort -n
のパイプとかとか。
で、渾身のalias晒すんじゃなくて、渾身のaliasを探すワンライナーをばご紹介。
渾身のaliasを探すワンライナー(錯乱
open "https://github.com/search?q=alias+language%3AShell+extension%3Ash&type=Code"
https://github.com/search?q=alias+language%3AShell+extension%3Ash&type=Code
みんなこまめにチェックして暇な時に探すとよいよ!じゃあね!(ほんとごめんなさい
監視や調査でよく使うワンライナー
アドベンドカレンダー参加してみたかったのでやってみました。すでにいろんな方が書かれてるので用途が被るものはありそうですが、コマンド丸被りという事はないと思うので自分が良く使うやつを。
自分はインフラ周りの業務を担当していて、なんかあったときにec2入ってリソースとかログ確認したりとか、ec2作った時に監視シェルを仕込んだりとかやったりしてるしがないエンジニアです。
環境
- amazon Linux 2
よくあるコマンドしか使わないのでおおよそのLinuxで使えるだろうとは思います。細かいオプションは変わるかもしれないですが。
行数とか項目の並びとか決め打ちで書いてるとこもあるので、コマンドのversionやら環境に応じて少し調整も必要になるかもしれないです。
監視や調査でよく使うワンライナー
ディスク足りなくなって何かファイル消したい時
du -l / | sort -n | cut -f1,2 | awk '{print sprintf ("%5.0dM, %s", $1/1024,$2)}'
ディレクトリ容量をMB単位で昇順ソートしつつ表示します。
環境によってはルートディレクトリ指定するとめっちゃ時間かかるので環境に応じて変更してください。
こんな感じででる。
...
2019M, /var/cache/apt/archives
2108M, /var/cache/apt
2113M, /var/cache
2253M, /usr
2484M, /var
5155M, /home/username
5183M, /home
12261M, /
いらなそうなファイルをごっそり退避したい時
find ./ -type f ! -atime -180 -exec tar -czf aaa.tgz {} \+ -exec rm -f {} \+
特定のディレクトリ配下で180日間アクセスのなかったファイルをaaa.tgzに固めてファイルは消す。
どのファイルを対象にするはfindのオプションで調整します。
コマンド化する場合、aliasではなく下記のようにfunctionとして登録になります。
function findshitezip(){
if [ $# -ne 2 ]; then
return "usage: findshitezip [atime] [filename]"
fi
find ./ -type f ! -atime -$1 -exec tar -czf $2.tgz {} \+ -exec rf -f {} \+
}
特定のプロセス(httpd等)の生死を確認する
PID=$(ps axo pid,args | grep httpd | grep -v grep | sed -r 's/^\s//' | cut -d ' ' -f1 | head -n 1)
生死というかプロセスがあればプロセスIDを拾います。
監視シェルで使う用で、例のように変数(ex:$PID)に入れておいてその後のif(ex:if [ -z "$PID" ]; then ...
)なんかで用います。
プロセスは一つあれば生きていると判断する場合になりますね。
CPU使用率チェック
CPU_UTIL=$(vmstat 10 2 | awk 'NR==4{use=100-$15;print use}')
10秒平均の使用率で0~100の値が$CPU_UTILに入ります。
デバイス毎にトラフィックチェック
sar -n DEV 1 5 | grep 'Average' | grep 'eth' | awk '{printf("SND=%s;RCV=%s",$6,$5)}'
debian系のOSはapt-getでsysstatを入れる必要があります。
1秒当たりの送受信トラフィックを表示。
中身をevalとかに渡してやればシェル内で変数に代入できます。
eval $(sar -n DEV 1 5 | grep 'Average' | grep 'eth' | awk '{printf("SND=%s;RCV=%s",$6,$5)}')
空きメモリチェック(空き使用率)
free | grep 'Mem:' | awk '{printf("%d",$7/$2*100)}'
OSのversionによっては/proc/meminfoみないと値が正確じゃなかったりするので注意。
freeコマンドでavailableという項目が表示されるならこれで問題ないはず。
その他番外編
ソースを対象にしつつまるっとgrep
find ./ -name '*.py' -exec grep -nH '検索する語句' {} \;
特定のワードで拡張子がpyのファイルをごっそりgrepし、見つかったファイル名と行数を出力します。ソースだけじゃなく、lotateされてるlogとかをgrepするのにも使えそうです。
こんな感じです。
$ find ./ -name '*.py' -exec grep -nH 'sound' {} \;
./app.py:23:drumrole_mp3 = "soundbank://soundlibrary/musical/amzn_sfx_drum_and_cymbal_01"
./app.py:24:question_mp3 = "soundbank://soundlibrary/ui/gameshow/amzn_ui_sfx_gameshow_bridge_02"
./app.py:25:correct_mp3 = "soundbank://soundlibrary/ui/gameshow/amzn_ui_sfx_gameshow_positive_response_01"
./app.py:26:incorrect_mp3 = "soundbank://soundlibrary/ui/gameshow/amzn_ui_sfx_gameshow_negative_response_01"
./app.py:27:beep_mp3 = "soundbank://soundlibrary/musical/amzn_sfx_electronic_beep_02"
その他、よく使う特殊変数(?)とか
!$
= 直前に打ったコマンドの最後の引数をリピート
!!
= 直前に打ったコマンドをそのままリピート
!3
= historyと対応した行番号を指定し、それを実行
$ echo abcdef
abcdef
$ echo !$
abcdef
$ !!
abcdef
$ history | tac | head -n 2
2032 history | tac | head -n 2
2031 echo abcdef
$ !2031
abcdef
なんかランダムでファイル作ったりとか処理したりする時にワンライナー
for i in `seq 1 10`; do touch $RANDOM.txt; done
ただ、10回ループしてランダム名でファイルを作るだけ。なんかテストとかやる時のベース的なやつ。
だいたいこんなところでしょうか。find,grepあたりを一番使ってる気がします。
何か書く
Gitでよく使うワンライナー
現在のmasterを最新のものにした上でマージされたブランチは削除する
有用度: ★★★★★
sync = !git checkout master && git pull origin master && git fetch -p origin && git branch -d $(git branch --merged | grep -v master | grep -v '*')
現在の変更点をHEADのコミットに追加
有用度: ★★★★★
amend = commit --amend -C HEAD
.gitignoreに追加(なかったら作成)
有用度: ★★★★☆
ignore = "!f() { echo $1 >> \"${GIT_PREFIX}.gitignore\"; }; f"
使い方
git ignore [ignoreするファイル名]
簡易ステータスを表示
有用度: ★★★★☆
s = status --short --branch
全てのファイルをaddして簡易statusを表示
有用度: ★★★★☆
aa = !git add -A && git s
グラフログを表示
有用度: ★★★☆☆
lg = log --graph --date=short --decorate=short --pretty=format:'%C(yellow)%h %Cgreen%cd %Cblue%cn%Cred%d %Creset%s'
参考記事
TypeScript x React x Firebase Hostingの環境構築&デプロイを1行で
この記事は、今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018の22日目の記事です。
ワンライナー、なんかgitやらサーバやらは結構たくさん世にでている気がするので、
ちょっとひと味違うワンライナー(?)をかきました。
ワンライナー
npx create-react-app my-app --scripts-version=react-scripts-ts; cd my-app; expect -c "spawn firebase init hosting; expect \"Select a default Firebase project\"; send \"\n\"; expect \"What do you want to use as your public directory?\"; send \"build\n\"; expect \"Configure as a single-page app\"; send \"\n\"; interact;"; npm run build; firebase deploy --only hosting;
※前提、node.jsをいれてnpxが使えるようになっていること、firebase loginを済ませていること
簡単に解説
なんでこんなワンライナーを書いたかというと、
最近フロントエンドでなんかしたいな、というときに考えることが多くてめんどくさいな、
というところで。
もう、とりあえずでいいんや!ってときでも、ちょっと考えたり、選んだりしてると、やる気と時間を奪われかねないので、
とりあえずのベストプラクティスを1行で提供してみました。
やってることは、
npx(その場限りのnpm、みたいなものです)をつかって、
create-react-app(reactアプリケーションで楽にスタートさせるための環境)で環境を作って、
firebaseプロジェクト化して(firebase init hosting)、
reactのビルドをして、
firebase hostingにdeployしています。
ポイントは、expectを使っているところで、
firebase initしたときの対話をすべて自動化しています。
デプロイ対象ディレクトリを、create-react-appに合わせて、buildディレクトリに変えるくらいのことだけしてます。
いちおう、bashでのファイルにしたとき(整形したバージョン)も記載しておきます。
#!/bin/bash
npx create-react-app my-app --scripts-version=react-scripts-ts
cd my-app
expect -c "
spawn firebase init hosting
expect \"Select a default Firebase project\"
send \"\n\"
expect \"What do you want to use as your public directory?\"
send \"build\n\"
expect \"Configure as a single-page app\"
send \"\n\"
interact
"
npm run build
firebase deploy --only hosting
注意としては、firebaseはdefaultのプロジェクトを使うようにしているので、気をつけてください。
では、良いクリスマスを!!!
npm versionのように簡単にgitのタグを使ってセマンティックにバージョンアップをするワンライナー
OSSや多人数でのプロジェクト開発をしているときに必要になってくるのは、プロジェクト自体のセマンティックなバージョン管理かと思います。
特にインストール型のプロジェクトでは、現在のユーザのバージョンと比較して、インストールさせるべきか、させる場合はどういうメッセージを出すかなどを判断するのに、メジャーバージョンやマイナーバージョン、パッチバージョンなどのバージョンを比較しているかと思います。
npmであれば、npm version
を使うと、Node.jsをもちいたパッケージのバージョンアップを簡単にできる様になっているかと思います。
ただ、そういった機能が備わっていない言語の管理やパッケージ管理ツールを使っていないプロジェクトなどでは独自にセマンティックバージョンを管理する必要があり、それを毎回最新のタグをみて更新するのは面倒かと思うので、ワンライナーで簡単に管理できるようにしました。
導入方法
まず、下記のシェルスクリプトをどこかに配置します。
著者はzshを使っているので、~/.zsh/version_up.sh
に設定しています。
#!/bin/sh
version=`awk '{print $1}' < /dev/stdin`
command=$1
major=`echo $version | awk -F '.' '{print $1}'`
minor=`echo $version | awk -F '.' '{print $2}'`
bugfix=`echo $version | awk -F '.' '{print $3}'`
build=`echo $version | awk -F '.' '{print $4}'`
if [ -z "$version" ]; then
echo "USAGE: echo 1.0.0 | version_up.sh [major|minor|bugfix|build]"
exit 1
fi
if [ "$command" = '' ]; then
if [ -n "$build" ]; then
build=`expr $build + 1`
elif [ -n "$bugfix" ]; then
bugfix=`expr $bugfix + 1`
fi
elif [ "$command" = 'major' ]; then
major=`expr $major + 1`
minor=0
bugfix=0
build=0
elif [ "$command" = 'minor' ]; then
minor=`expr $minor + 1`
bugfix=0
build=0
elif [ "$command" = 'bugfix' ]; then
bugfix=`expr $bugfix + 1`
build=0
elif [ "$command" = 'build' ]; then
build=`expr $build + 1`
fi
if [ "$command" = "major" -o "$command" = 'minor' -o "$command" = 'bugfix' ]; then
if [ -n "$build" ]; then
build=0
fi
fi
if [ -n "$build" ]; then
echo ${major}.${minor}.${bugfix}.${build}
else
echo ${major}.${minor}.${bugfix}
fi
次に~/.zshrc
内部に下記スクリプトを記載します。
alias vup="git tag -l | tail -n 1 | sed 's/[^0-9\.]//g' | ~/.zsh/version_up.sh" # version up string
最後に下記のコマンドで実行するだけです。
$ git tag -l
v1.6.1
$ vup major
2.0.0.0
$ vup minor
1.7.0.0
$ vup bugfix
1.6.2.0
あとはこの出力されたバージョンを使ってタグを生成してもいいし、何かしらのファイルに出力するのでもいいと思います。
今すぐalias登録すべきワンライナー
記事のタイトルはアドベントカレンダーのタイトルをそのまま使わせてもらいました
僕が alias
登録して使っている中で最も使用頻度が高かったものをご紹介します。
git push
Git
はもはやデファクトと言っていいくらい普及しているバージョン管理ツールですね。
hub
コマンド等 Git
の関連ツールのコマンドもとても便利ですね。
そんな Git
なのですがリポジトリに push
する際に git push
の代わりに使っている alias
を紹介します。
alias gcb="git rev-parse --abbrev-ref HEAD" # current branch
alias gp="gcb | xargs git push origin"
alias gpf="gcb | xargs git push origin --force-with-lease"
例えば GitHub
でリポジトリを Fork
しているような人だと初回の git push
は下記のようにエラーが出ると思います。
$ git push
fatal: The current branch test/branch has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin your-branch-name
上のコマンドを実行するか、省略形で git push -u origin your-branch-name
とすれば解決するのですが、初回の push
のたびにブランチ名を入力するのは面倒です。紹介した alias
を使えばいつのタイミングでも gp
と打つだけでリモートリポジトリに変更点を push
できます。これでブランチ名の入力の手間が省けましたね。やったね
cd
これはちょっとした tips
なのですが、よく使うので紹介します。
紹介する alias
は下のようなものです。
alias 0="cd /Users/username/development/my-oss"
alias 1="cd /Users/username/development/product"
alias 2="cd /Users/username/blog/"
さて、これはセクションのタイトルにある通り cd
コマンドを実行する alias
となっています。
自分の都合にもなってしまうのですが、業務での開発・趣味での開発。また、複数言語・複数プラットフォーム と同じローカルの環境で行き来することがとても多いです。 ディレクトリを移動したい時にいちいちディレクトリを入力するのはとても手間です。この alias
を登録しておけば 0 と入力して Enter を押すだけで cd /Users/username/development/my-oss
に移動します。そして、この数字は普段コマンドの最初として入力することがないものなので心なしか typo
も少なくていいです。もちろん cd
以外のコマンドを登録しておくのもありでしょう。実は僕も 0 は前述した gp
コマンドを割り当ててます。しかし、手軽にやれてしまうので破壊的なコマンドの登録はやめておきましょう。オススメしません。
終わりに
いかがでしたでしょうか。
awk
コマンド等を使った多少凝ったものも便利なのですが、今回は簡易なものを組み合わせたちょっとしたシェルコマンドの alias
をご紹介させていただきまいた。
みなさん素敵なワンライナーおよびシェルライフを送りましょう
おしまい \(^o^)/