bash で使う ANSI カラーコードは変数に定義しておくと便利

英語版の Wikipediaこちらより。「Usage example」の項です(2017年7月1日現在)。

上記 Wikipedia を参考にして、以下のように .bashrc にシェル変数として定義しました。

FG_NORMAL='\e[m'
FG_BLACK='\e[30m'
FG_RED='\e[31m'
FG_GREEN='\e[32m'
FG_YELLOW='\e[33m'
FG_BLUE='\e[34m'
FG_MAGENTA='\e[35m'
FG_CYAN='\e[36m'
FG_LIGHT_GRAY='\e[37m'

試しに echo -e の引数として使ってみます。

f:id:blp1526:20170701231109p:plain

とてもわかりやすいです。

そして、PS1 を定義する際に利用してみました。こちらの記事で書いた repo_name_or_short_pwd() という関数に加え、jobs_size() という関数を追加してみました。man bash の PROMPTING の項を読むと同様の表示の \j がありますが、\j はジョブ数が0のときでも表示されてしまうため、ジョブ数が0のときには表示しないものを関数として自作しました。

jobs_size() {
  local jobs_size=$(jobs | wc -l)
  if [ ${jobs_size} -gt 0 ]; then
    echo "[jobs: ${jobs_size}] "
  else
    echo ""
  fi
}

repo_name_or_short_pwd() {
  if [ ${PWD} = ${HOME} ]; then
    echo "~"
  elif [ -e ${PWD}/.git ]; then
    echo $(awk -F / '{ print $(NF-1)"/"$(NF) }' <<< ${PWD})
  else
    echo $(basename ${PWD})
  fi
}

GIT_PS1_SHOWDIRTYSTATE=true
PS1_JOBS_SIZE=${FG_YELLOW}'$(jobs_size)'
PS1_USER=${FG_GREEN}'\u'
PS1_SEPARATOR=${FG_LIGHT_GRAY}':'
PS1_DIR=${FG_BLUE}'$(repo_name_or_short_pwd)'
PS1_BRANCH=${FG_RED}'$(__git_ps1)'
PS1_DOLLAR=${FG_NORMAL}'\n\$ '
PS1="${PS1_JOBS_SIZE}${PS1_USER}${PS1_SEPARATOR}${PS1_DIR}${PS1_BRANCH}${PS1_DOLLAR}"

f:id:blp1526:20170701231300p:plain

だいぶスッキリしました。

bash の PS1 の /W の挙動で git のリポジトリのみ「ユーザー名/リポジトリ名」の形式で表示

bashPS1/W は現在の作業ディレクトリのベース名を表示してくれてシンプルで素晴らしいです(man の bash の「プロンプト」の項に詳細が記載されています)。 ただ、現在の作業ディレクトリが gitリポジトリのとき、リポジトリ名だけでなく、 リポジトリのユーザー名も表示してくれると、フォークしたリポジトリの場合などには見分けがついて便利です。

それを実現するために .bashrc に以下の関数を書きました。

repo_name_or_short_pwd() {
  if [ ${PWD} = ${HOME} ]; then
    echo "~"
  elif [ -e ${PWD}/.git ]; then
    echo $(awk -F / '{ print $(NF-1)"/"$(NF) }' <<< ${PWD})
  else
    echo $(basename ${PWD})
  fi
}

それを PS1 の要素として組み込みます。私は現在下記のように .bashrc に書いています。

GIT_PS1_SHOWDIRTYSTATE=true
PS1_USER='\[\033[32m\]\u'
PS1_SEPARATOR='\[\033[37m\]:'
PS1_DIR='\[\033[34m\]$(repo_name_or_short_pwd)'
PS1_BRANCH='\[\033[31m\]$(__git_ps1)\[\033[00m\]'
PS1_DOLLAR='\n\$ '
PS1="${PS1_USER}${PS1_SEPARATOR}${PS1_DIR}${PS1_BRANCH}${PS1_DOLLAR}"

結果、ホームディレクトリのときは

f:id:blp1526:20170629215039p:plain

git リポジトリのときは

f:id:blp1526:20170629214908p:plain

その他のときは

f:id:blp1526:20170629214931p:plain

の形式となり、希望する表示になりました。

さくらのクラウドAPIをパイプで渡せるようにする

この記事はさくらインターネット(その2) Advent Calendar 2016の20日目の記事です。

はじめに

FUSE での開発を題材にアドベントカレンダーを書こうと思っていたところ、あまりの偶然に驚愕したのですが、昨日のアドベントカレンダーで Go で FUSE で開発された方がいらっしゃいました。拝読し、翻って私の記事のことを思いますと、開発の途中の報告レベルで恐縮しています。本記事は Ruby での実装となります。何卒よろしくお願いします。

余談ですが、個人的に今年の上旬は FUSE 熱が高かったのですが、

いろいろ他の優先すべきことがあったためいつの間にやらペンディングとなり、今回、アドベントカレンダーの題材ということもあり FUSE の開発に着手できほっとしています。アドベントカレンダー駆動開発いいですね。

概要

現在、Ruby の Gem の lwoggardner/rfusefs を使い、FUSEファイルシステムを開発中です。

blp1526/sacloudfs-rb

さくらのクラウドAPI1.1 を利用したファイルシステムで、例えば、ターミナルから ls mountpiont/tk1v/disk と打った場合、裏でさくらのクラウドのSandboxゾーン(tk1v)に対して GET /disk がリクエストされ、コマンドの結果としては、disk ディレクトリの配下にディスクの id がファイルとして存在するという処理になっています。 具体的には、

f:id:blp1526:20161220212923j:plain

というようにSandboxゾーンで3つのディスクを作成している場合、

f:id:blp1526:20161220213019j:plain

上記2枚目のターミナルのとおり、ls mountpoint/tk1v/disk の結果として、3つのファイルが標準出力に表示されます。

さくらのクラウドAPIについて

さくらのクラウドAPIについては、下記スライドでエバンジェリストの寺尾さんがまとめられています。

スライドの15枚目にありますが、Sandboxゾーンというテスト用のゾーンがあり、無課金でAPIの動作確認ができます。 また、スライドの29枚目のとおり、APIを利用するためにはAPIキーの発行が必要です。

所感

このファイルシステムFUSE の練習として開発しています。このファイルシステムの利用方法をあえて言うと、ブログの記事名のとおり、ls mountpoint/tk1v/disk | xargs curl ... のように、コマンドとコマンドをパイプでつなぎ、何らかの処理をできるようにすることだと思いますが、いろいろな例外に対する処理を想定すると、普通になんらかのスクリプト言語で処理を書いた方がいいと思われます。 FUSEファイルシステムを簡単に開発することができますが、本当に役に立つものを作るのは難しいものだと感じます。fuse-sshfs や ntfs-3g、zfs-fuse のような身近に利用しているレベルのものを開発できるよう、技術力と発想力を磨いていきたいと改めて思いました。

Google 検索後に Developer Tools を開く Alfred Workflow

Google 検索後に Developer Tools を自動で開く Alfred Workflow を作りました。

github.com

検索ごとに Developer Tools を手動で開く手間が省けだいぶ楽になりました。

tig のチェックアウト時などの [Yy/Nn] の確認をスキップする設定

ずっと探していたのですが、マニュアル内を confirm などの単語で検索していたのが間違いでした。 設定方法はこちらに記載されていました。

例えば、tig refs で行うチェックアウトの場合ですと、こちらに記載の

bind refs C ?git checkout %(branch)

の ? の部分を ! に置き換えたもの、すなわち

bind refs C !git checkout %(branch)

.tigrc に追加するだけで [Yy/Nn] の確認をスキップできました。さらに、チェックアウトした瞬間に tig を抜けたい場合には < を追加して

bind refs C !<git checkout %(branch)

で OK です。

「表記ゆれ撲滅ハッカソン」に参加しました

六本木の Mozilla Japan にて開催された「表記ゆれ撲滅ハッカソン」に参加しました。 その名のとおり、表記ゆれを正すハッカソンで、私は mozilla-japan/gecko-l10n というリポジトリにて「語尾が -er、-or、-cy、-ry、-gy の単語はすべて長音を付ける」というルールに基づき、いくつかの単語を対応しました。こちらのプルリクなどです。

印象に残ったことはいくつもありますが、そのひとつとして、こちらの Wiki にも書かれていますが、「特定の接続詞や副詞はひらがなで書く」際の基準として、共同通信社の『記者ハンドブック新聞用字用語集』という書籍を利用されているという話がありました。なるほど、このような基準となる書籍があるのですね。

非常にためになるハッカソンでした。主催の Mozilla Japan 様、ありがとうございました。

git のエイリアスとして peco で branch 一覧を表示し checkout できるようにする

ターミナルから tig refs と打つと refs の一覧画面が表示されます。 さらに、refs の中から checkout したいものを選択し、 Shift + c を打つと、選択したものにチェックアウトすることができます。

大変便利な機能ですが、ローカルブランチだけでなくリモートブランチやタグも表示されてしまいますので、 ローカルブランチだけを見たい場合には表示される量が多すぎますし、 また、チェックアウト時には本当にチェックアウトをするか否かの確認の [Yy/Nn] を打たなければならず、確認を飛ばしたくなる場合もあるかと思います。

そこで、gitエイリアスとして、tig に倣い git refs を用意しました。 .gitconfig

[alias]
  refs = !git checkout $(git branch | peco | awk '{ print $NF }')

上記のように定義し、peco を通して快適にブランチの切り替えができるようになりました。

ググってみると同様のことは .zshrc に定義されている方が多かったのですが、 自分は tigrefs を真似たくて gitエイリアスとして定義した次第です。