ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

事業部メンバーおすすめエイリアス in 2016 夏

初めまして。アジャイル事業部新人の @junk0612 です。 今回はエイリアスの話をします。

長いターミナル生活、みなさん少しでもタイプ数を減らそうと日々努力なさっていることと思います。 タイプ数の削減に一番簡単に効果をあげられるのがエイリアスですよね。

そこで、事業部のメンバーがよく使うエイリアス、おすすめエイリアスをまとめてご紹介します。 もし気になるものがありましたら、ぜひ日々の生活にお役立てください。

おすすめエイリアス

アジャイル事業部では、ほとんどのプロジェクトで Ruby on Rails を使用している関係上、 bundler 系、git 系のエイリアスを設定している方は非常に多かったです。

alias be='bundle exec'
alias bi='bundle install'
alias bo='bundle open'
alias bu='bundle update'

ド鉄板 (というか、もはや設定していない人は希少であろう) エイリアスQwerty 配列でも Dvorak 配列でもそれほど打ちづらいわけでもないにもかかわらず設定されているあたりに、 「いつも使うコマンドに3文字なんて打ちたくない」というプログラマーの美徳が伺えます。

alias g='git'

.gitconfigにはcheckoutcommitgrepなど、 みなさん思い思いのサブコマンドエイリアスを設定していました (自分は以前使っていた Oh My Zsh の影響で、.gitconfigではなく.zshrcにサブコマンド込みのエイリアスを設定しています) 。

git 周りではありますが、ghqhub といったツールを組み合わせて利用している方も多く、こんなエイリアスを教えていただきました。

# from @takkanm
alias ho='hub browse'

# from @koic
alias ghqhub='hub browse $(ghq list | peco | cut -d "/" -f 2,3)'
alias ghqlist='cd $(ghq list -p | peco)'

# from @hibariya
# (fish only)
function repo
  ghq list -p | peco | read there
  cd $there
end

また、普段利用するエディタにオプションをつけたりコマンドを短くする目的でエイリアスを設定している方も多いです。

# from @takkanm
alias v='vim'

# from @koic
alias emacs='emacsclient -nw -a ""'

# from @hidenba
# (Mac OS X only)
alias emacs="/Applications/Emacs.app/Contents/MacOS/Emacs -nw"

そのほか、教えていただいたものをまるっとご紹介 (ここが一番使えるかも?) 。

# from @koic 「Mac OS X を使っていて使いづらいと思って変えた」
alias date='gdate'
alias tac='gtac'

# from @koic 「べんり」
alias less='less --no-init --quit-if-one-screen' # Thanks to http://qiita.com/hatchinee/items/586fb1c4915e2bb5c03b

# from @kunitoo 「linux(gnome) を使っていて Mac に寄せようとした」
alias open='gnome-open'

# from @emattsan 「こんなの設定してた」
# (Mac OS X only)
alias xcode='open -a /Applications/Xcode.app/Contents/MacOS/Xcode'

# from @hibariya 「Dvorak になってだいたい良くなったけど ls -l は打ちづらくなった」
# (fish only)
abbr -a ll='ls -lh'

# from @hibariya 「e \^accomplish みたいな感じでターミナルで英和/和英辞書をひきたい (辞書は英辞郎)」
# (fish only)
function e
  echo $argv | sed -e 's/[\^\$]//g' | read word
  grep --regexp=$argv ~/data/eijiro.utf8.txt | sed -e "s/$argv/\\x1b[36m\\x1b[1m$word\\x1b[0m/g" | eval $PAGER
end

# from @hibariya 「さいきんよく更新してる git 管理下のファイルを開きたい」
# (fish only)
function vimr
  git ls-files | xargs ls -At | peco | read that
  vim $that
end

# from @hibariya 「fish で Ctrl + r をやりたい」
# (fish only)
function peco_select_history
  if set -q $argv
    history | peco | read cmd
  else
    history | peco --query $argv | read cmd
  end

  commandline $cmd
end

# from @hidenba 「こんな感じで書かれていたわ」
# (zsh only)
alias -g G='| grep'

いかがでしたでしょうか。 皆さんも是非、お気に入りのエイリアスを探してみてください。 それでは!

Ruby 2.4.0-(dev|preview1) で Symbol not found: _rb_cFixnum が起きたときの対処

@koic です。 昨日、Ruby 2.4.0-preview1 がリリースされた時事ネタということで、Ruby 2.4.0 にまつわる TIL です。

Ruby 2.4.0 で Fixnum と Bignum が Integer に統合されます。この変更によりネイティブビルドを要した gem の実行時に Symbol not found: _rb_cFixnum あるいは Symbol not found: _rb_cBignum といったエラーが出た場合の対処です。

Ruby 2.4.0-dev or preview1 の環境にして前述のエラーが起きる gem を gem pristine などでネイティブビルドし直すことで解決します。

bundle exec rails c などで、これらのエラーが起きたときご活用ください。

Nginx のリクエスト制限を burst と nodelay で柔軟に設定する

Nginx では ngx_http_limit_req_module を使ってサーバが処理するリクエストの数を制限できます。例えば、同じ $request_filename へのリクエストを1秒に1回に制限する場合は次のようになります。

http {
  limit_req_zone $request_filename zone=foo:10m rate=1r/s;

  # (省略)

  server {
    # (省略)

    location / {
      # limit_req_zone で設定した上限 (1r/s) を超えたリクエストには503が返される
      limit_req zone=foo;
    }
  }
}

この設定では、1秒以内に2回以上のリクエストがあるとサーバは即座に503を返します。 しかし現実的には、一時的なリクエストの増加は許容したいことがあります。 そのためには burstnodelay を使います。

limit_req zone=foo burst=10 nodelay;

burst を指定すると、上限を超えたリクエストは burst に指定した数だけキューイングされ、リクエスト数が burst を超えたときだけ503が返されるようになります。 nodelay は処理を遅延させないためのオプションです。burst だけが指定された場合、キューイングされたリクエストの処理は rate の上限を超えないように遅延されます。一時的なリクエストの増加を許容したいときにこの遅延は不要ですので nodelay を指定します。

Rails のリポジトリにはレポート用の再現コードテンプレートがある

わたしが参加しているプロジェクトでは、今 Rails 5.0.0.rc1 で開発をしています。

先日コードを書いている時、気になる挙動があり、Issue をあげました。 Issue には再現させるためのコード片を記載していました。

この時、コメントで反応を頂いて知ったのですが、Rails には各コンポーネントごとにファイル単体で実行して確認するための再現コードのテンプレートが用意されているのですね。history を見ると 2013 年ごろからあるようですが、わたしは今回初めて気付きました。

中を読んでみると、bundler/inline が使われており、そのコードを Ruby で実行するだけで発生しているバージョンのライブラリがインストールされるようになっています。セットアップとテストを書けば、何をしているのか、何を期待しているのかがわかるようになっていました。

このテンプレートに沿って再現コードをあげれば、事象が発生している環境を揃えるのも実行も簡単だし、意図も伝わりやすくとても良いなぁと思いました。

Rails の気になる挙動に気づいたけど、英語が苦手でレポートを上げるのに躊躇しちゃうような人(例:わたし)には、とても便利なテンプレートだと思います。

絶対パス、相対パス、そしてキーワードによる移動

koic です。こんにちは。

@b4b4r07 さんによるプロダクトである enhancd のユーザー体験が素晴らしいということで、今日はターミナル生活中のディレクトリ移動についての話です。

今回取り上げる enhancd は執筆時点 (2016年5月20日) で、bash / zsh / fish に対応しているため、ツールとの相性次第で多くのターミナル生活者が恩恵を受けることができます。

絶対パス相対パスによる移動への不満点と、それらの解決となるキーワードでの移動といった流れで話を進めます。

絶対パスによる移動

どのパスにいても、絶対パスを入力すれば一発で移動ができる反面、ディレクトリが深い場合は入力が面倒です。

cd /path/to/dir

そして、だいたい目的のディレクトリは深いです。 Ctrl+r で履歴から移動すれば入力の手間は減りますが、cd コマンド以外も履歴の探索対象となる点がいま一歩です。

相対パスによる移動

いまいるパスからの相対分のみ入力すれば移動できるため相対位置が近ければ入力が少ない反面、相対位置が遠いと移動先のパスの入力を考えるのが面倒です。

cd ../to/dir

隣のディレクトリであれば、../path で済みますがそれ以上になると ../../path などと書くことになりツリー構造を頭に浮かべるのが思いのほか疲れます。 tab 補完で頑張ることはできますが、ディレクトリ内のすべてのディレクトリから何度も選択していくのが大変です。

そしてキーワードによるパス移動

「そこで enhancd ですよ!」とここで素敵なツールの紹介です。

もし、以前 /path/to/dir に移動したことがあれば以下のように 移動先のパスのキーワード を入力すれば どこのパスにいても瞬時に移動 できます。

cd dir # どこのディレクトリにいても /path/to/dir ディレクトリに移動できる。複数の候補がある場合は peco などでフィルタリング。

絶対パス移動への不満である長い入力への手間、相対パス移動への不満であるディレクトリツリーの脳内組み立てが解決されました。

一度移動したことのあるディレクトリへの移動に手間を掛けない。『達人プログラマー』にも Don't Repeat Yourself とありますね。

早く導入すると、それだけ早く人生の無駄時間が減る

キーワードでの移動は、絶対パス相対パスに背反するものではなく、むしろ絶対パス相対パスによる移動を背景にしています。

移動履歴のあるパスは ~/.enhancd ディレクトリ内のファイルに保存されてキーワードの探索対象になります。つまり、早く導入すればするほど補完できる機会が増えますので、使ったことのない読者の方は一度お試し頂くと良いと思います。

インストールもとても簡単。私自身、毎日のディレクトリ移動時間をかなり削減する実感を体感できたライフチェンジングなイチオシツールです。

作者による Qiita 記事やプロダクトの README.md がとても丁寧に記されているため、詳しくはそちらをご参照下さい。

`set -e` で、コマンドが失敗したときシェルスクリプトの実行を中断する

シェルスクリプトで途中のコマンドが失敗したら直ちに実行を中断してほしいことがあります。 事前に set -e しておけば、コマンドが失敗したとき (non-zero で終了したとき) にスクリプト自体が異常終了します。

#!/bin/sh

set -e

false     # ここで中断される

echo ':(' # 実行されては困る処理

sh や bash-e を同じように解釈するので、#!/bin/sh -e というように shebang に書くこともできます。 反対に set -o errexit というやや冗長な書き方もあります。

次のような箇所では、コマンドが non-zero を返してもスクリプトは終了しません。

  • パイプラインの途中 (最後のコマンドは除く)。
  • whileuntil if elif の条件式。
  • 複数の式を expr1 && expr2 のように AND や OR でつないだ式。

bash の pipefail オプションを使えばパイプラインで失敗したときにも終了できます。

#!/bin/bash -eo pipefail

false | true # ここで中断される

echo ':('    # 実行されては困る処理

ブログはじめました

永和システムマネジメント アジャイル事業部でも、最近流行り(?)の技術ブログをゆるくはじめることにしました。 弊社メンバーによる、気合の入った熱い記事や、脱力系のゆるい記事、はたまた日々の仕事で学んだ TIL などを自分たちのペースで皆さんに伝えられればと思います。

わたしたちに会った時の話のネタにするなどしていただければ、幸いです。

では、よろしくお願いいたします。