vagrant global-status --pruneでゾンビ仮想マシンを削除する

このエントリーをはてなブックマークに追加
消したはずの仮想マシンが vagrant global-status で表示されてしまう場合、--pruneオプションをつければゴミ掃除してくれます。

vagrant global-status は、存在しない仮想マシンを表示してしまうことがある。

$  vagrant global-status
id       name    provider   state    directory
-------------------------------------------------------------------------
55f191d  default virtualbox poweroff /Users/DQNEO/hoge/kitchen
8486738  default virtualbox running  /Users/DQNEO/hoge/kitchen2
2aa592d  default virtualbox running  /private/tmp/chef-repo
97b443d  default virtualbox poweroff /Users/DQNEO/vagrants/emacs
4a39c61  default virtualbox poweroff /Users/DQNEO/vagrants/hhvm
e440391  default virtualbox running  /Users/DQNEO/vagrants/kqui-kitchen

The above shows information about all known Vagrant environments
on this machine. This data is cached and may not be completely
up-to-date. To interact with any of the machines, you can go to
that directory and run Vagrant, or you can use the ID directly
with Vagrant commands from any directory. For example:
"vagrant destroy 1a2b3c4d"
仮想マシンが6個も表示されていますが、本当はこのうち3個はサクジョ済みなので実在しないのです。

vagrant global-status --pruneでゴミ掃除

$  vagrant global-status --prune
/Users/DQNEO/vagrants/hhvm/Vagrantfile:5: warning: already initialized constant VAGRANTFILE_API_VERSION
/Users/DQNEO/hoge/kitchen2/Vagrantfile:5: warning: previous definition of VAGRANTFILE_API_VERSION was here
/Users/DQNEO/vagrants/kqui-kitchen/Vagrantfile:5: warning: already initialized constant VAGRANTFILE_API_VERSION
/Users/DQNEO/vagrants/hhvm/Vagrantfile:5: warning: previous definition of VAGRANTFILE_API_VERSION was here
id       name    provider   state    directory
-------------------------------------------------------------------------
8486738  default virtualbox running  /Users/DQNEO/hoge/kitchen2
4a39c61  default virtualbox poweroff /Users/DQNEO/vagrants/hhvm
e440391  default virtualbox running  /Users/DQNEO/vagrants/kqui-kitchen
ゾンビマシンが消えて、ちゃんと3個になりました!

cdせずに任意のgitレポジトリを操作する-Cオプションの紹介

このエントリーをはてなブックマークに追加
例えば、git pullとかするときはcdしてからgit pullする人が多いと思います。

たとえばrbenvをアップデートしたいとき、
$ cd ~/.rbenv
$ git pull
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
なんてしますよね。
でもいちいち cd するの面倒くさいと思いませんか?

実はgitには -C オプションというのがあって、これを使うと cd せずにレポジトリの場所を指定することができます。
git -C <レポジトリの場所> サブコマンド
という風に使います。

なので、さっきの rbenvを更新する例はこのように書けます。
$ git -C ~/.rbenv  pull
$ git -C ~/.rbenv/plugins/ruby-build  pull
シェルスクリプとかcrontabから git を実行するときは大変便利です。

改行に置換するためのワンライナー集(tr/sed/perl)

このエントリーをはてなブックマークに追加
ある文字を改行「に」置換する方法を紹介します。

事例:$PATHの中身が長くて見にいので、":"を改行に置換したい

$ echo $PATH
/Users/DQNEO/.rbenv/bin:/Users/DQNEO/.rbenv/shims:/Users/DQNEO/.plenv/bin:/Users/DQNEO/.plenv/shims:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/Users/DQNEO/bin:/usr/bin:/bin:/usr/sbin:/sbin
横に長いので、改行で区切りたい!

trで置換

こういう場合は、trコマンドを使うのが一番簡単です。
$ echo $PATH | tr ':' '\n'
/Users/DQNEO/.rbenv/bin
/Users/DQNEO/.rbenv/shims
/Users/DQNEO/.plenv/bin
/Users/DQNEO/.plenv/shims
/usr/local/opt/coreutils/libexec/gnubin
/usr/local/bin
/Users/DQNEO/bin
/usr/bin
/bin
/usr/sbin
/sbin

sedで置換

$ echo $PATH | sed 's/:/\n/g'
ただしMacOSX のsedの場合、これでは動きません。GNU sedを使いましょう。
"Homebrew を使って OSX に GNU sed を入れる - おともだちティータイム"

Perlで置換

PerlならMac / Linux などOS関係なく同じ挙動なので安心です。
$ echo $PATH | perl -pe 's/:/\n/g'

Emacsのshell,iTerm2,zshの組み合わせで変な制御文字が表示されてしまうバグ

このエントリーをはてなブックマークに追加
emacs-shell-iterm2-bug.png

Emacsのshell (M-x shell) をMax OSXのiTerm2で使うとこのような変な制御文字が表示されてしまいました。
^[]2;echo hello^G^[]1;echo^Ghello

原因が皆目検討がつかないので見て見ぬふりをしていたのですが、この制御文字があまりにもウザくて、いつの間にか M-x shell を使わなくなっている自分がいました。

これではいかんと一念発起して解決するまでの一部始終です。

Linuxでは発生しない?

まず、詳しそうな友人に聞いてみたところ、「僕のLinuxでは発生しない」とのことでした。
確かにLinuxでは発生しませんでした。
友人いわく、「zshかscreenかiTerm2が、ウィンドウのタイトルを自動設定しようとしているのが原因じゃないか」とのこと。

iTerm2のときだけ発生する

Mac OSXの標準のターミナルでは発生しませんでした。iTerm2のときだけ発生しました。

Zshを使うと発生する

M-x shellしたあとに、"bash"と入力してインタラクティブシェルをbashに切り替えると直りました。
どうやらzshが原因のようです。

ここまでで、「MacのiTerm2でEmacsのshellでzshを使った時に発生する」ということがわかりました。

ただ、ここで行き詰まってしまいました。

.zshrcに原因がある

はてな人力検索で質問してみたら、「私の環境では再現しない」とのコメントをいただきました。
なるほど?これはもしかして .zshrcの内容に原因があるかもしれないと思いました。
.zshrcにごちゃごちゃ設定を書いていたので、「.zshrcを消して素のzshを起動するとどうなるだろう」とやってみたところ、現象が直りました。

そこで、.zshrcの真ん中あたりに"return"を書いてみて、二分探索の手法でどこで不具合が起きるのかを調べました。

oh-my-zshが原因だった

oh-my-zshを外してみたら直りました。どうやら oh-my-zshを使っているのが原因でした。

テーマを変更しても発生する

oh-my-zshのテーマが悪いのかと思いテーマをいろいろ変更してみましたが、どのテーマでも発生しました。
どうやらテーマに関係なくoh-my-zsh自体に原因がありそうです。

DISABLE_AUTO_TITLE="true"にしたら直った!!

oh-my-zshの設定を見ていると、下記の設定があることに気づきました。
# Uncomment following line if you want to disable autosetting terminal title.
# DISABLE_AUTO_TITLE="true"
こ、これは・・・!!
冒頭で友人が言っていたことと関係がありそうです。

というわけでこのコメントを消して DISABLE_AUTO_TITLE="true" を有効にしたところ、見事に解決しました!!

よかったよかった。

Wikipediaのバブルソートの例が糞コードだったので書きなおしてみた

このエントリーをはてなブックマークに追加
http://ja.wikipedia.org/wiki/バブルソート

なぜか実装例がPHPのコードで書かれていたのですが、ちょっとひどいコードだったので書きなおしてみました。
下記の1ファイル目がWikipediaに載ってたコードで、2ファイル名が私が書き直したコードです。

※昇順か降順かをオプションで指定できる機能は本質的じゃないと思ったので、仕様削減しました。

だいぶすっきり。
(比べてみて思いましたが、糞というほど悪くはなかったかも・・・)

やってみよう!VagrantでUbunt14.04にHHVMをインストールしてHello Worldするまで

このエントリーをはてなブックマークに追加
意外と簡単にできました。

Vagrantを使ってUbuntu14.04の仮想マシンを起動する

mkdir /tmp/hhvm
cd /tmp/hhvm
vagrant init ubuntu/trusty64
vagrant up
# ここで20-30分ほど待たされる
vagrant ssh
これで、Ubunt14のマシンが起動してsshログインできます。

Chefのtemplateでincludeをする方法

このエントリーをはてなブックマークに追加
例えば、httpd.conf.erb の中で ssl.conf.erbをincludeしたい場合、下記のようにします。

httpd.conf.erb
<%= render "ssl.conf.erb" %>
ファイル名は templates/default/ が基点になるようです。
従って、"templates/default/etc/httpd/conf.d/ssl.conf" を読み込みたい場合は、
<%= render "etc/httpd/conf.d/ssl.conf" %>
とします。

他にもオプションをいろいろ指定したりできるようです。
詳しくは公式マニュアルの "Partial Templates" という項目に書いてあります。

https://docs.getchef.com/essentials_cookbook_templates.html#partial-templates

Mac OSXのsedで"sed: RE error: illegal byte sequence"

このエントリーをはてなブックマークに追加
Mac OSXでsedを使って置換しようとしたら変なエラーが出ました。
$  sed -i -e 's/foo/bar/' file.html
sed: RE error: illegal byte sequence
環境変数 "LC_ALL=C" をセットしてあげたらちゃんと動きました。
$ LC_ALL=C sed -i -e 's/foo/bar/' file.html
ちなみに、Linuxの場合は"LC_ALL=C"とかしなくてもちゃんと動きます。

OSXとLinuxでsedの仕様がだいぶ違うみたいですね。
OSXでもGNU sedを使ったほうがよさそうです。
Homebrew を使って OSX に GNU sed を入れる

git logで今月の自分のコミットを時間順に表示する

このエントリーをはてなブックマークに追加
今月の自分の活動を振り返りたいときに使えます。
git log --author=DQNEO --since=2014/10/1  --branches --tags --remotes --date-order

git logを時間順にソートする

このエントリーをはてなブックマークに追加
git logはデフォルトでは親子関係(=オブジェクトグラフ)をもとに表示順番が決まります。
時間順にソートするには"--date-order"オプションをつけます。
git log  --date-order
購読する

最近の人気記事

人気記事