Linux & Server」カテゴリーアーカイブ

Gitのブランチ名をzshのプロンプトに表示する (軽量版)

前に、Git のブランチ名を zsh の右プロンプトに表示する方法を書いたが、職場で使っている一部のマシンでは、それが思うように動かなかった。

ひとつは、zsh/regex が無いのが原因で、それは grep コマンドで代替できたのだけど、もうひとつは、git status コマンドが重くて、プロンプトでエンターを押す度に1秒ほど固まるのだ。

そこで、軽量版を考えた。
git status は使わずに、ブランチ名だけを表示する。
表示を変更するタイミングは、cd コマンドが実行されたときだけにする。

というわけで、更に直したのがこちら。

シェルスクリプトは不得手なので、もう少しスマートに書けるかもしれない。
書ける方は、fork して下さい。

APCを入れてみた

PHP を高速化する APC っていうのを入れてみました。

CentOSの場合、PHP 5.3 に対応した APC を yum からインストールすることができなかったので、pecl からインストールしました。
そのとき必要な、pcre-devel っていう正規表現のライブラリも入れてます。1

# yum install pcre-devel
# pecl install apc
# vim /etc/php.d/apc.ini

extension=apc.so
apc.shm_size = 64M

# service httpd restart

Necleus側でもキャッシュを効かせてるので、個別記事のページはそれほど早くなった感じはしませんが、管理者でアクセスしたときの速度が体感的にも速くなりました。

  1. 'apc_regex' has no member named 'preg' というエラーが出たので。

Gitのブランチ名をzshのプロンプトに表示する

基本的にはここに書いてある通りにしたんだけど、このままだと動かなかったので、少し手を加えている。

まず、ブログに書かれているコードより、gistに書かれている内容の方が新しいので、そっちを使う。

しかし、re_match_pcre を指定すると、zsh/pcreモジュールが無いといわれ、エラーになる。

rprompt-git-current-branch:2: failed to load module `zsh/pcre': /usr/lib/zsh/4.3.17/zsh/pcre.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
rprompt-git-current-branch:2: -pcre-match not available for regex

そこで、re_match_pcre の指定を外し、zsh/regexモジュールを使う。
zsh/regexモジュールでは、POSIXの正規表現しか使えないので、正規表現を書き換える。12

あと、Gitが出力するメッセージが変わったみたいなので、それに合わせて正規表現のパターンを変更しておく。

というわけで、直したのがこちら。

■ 追記

スマートな解決法発見。

  1. (?m)が使えないので、trコマンドを使って改行を削除し、それに対してzsh/regexで正規表現をかける。
  2. grepコマンドを使う方法に変更。

Ctrl+左右キーでvimのタブ切り替えをする

前回、Ctrl 左右キーでscreenのウィンドウ切り替えをする方法を書きましたが、今度はvimのタブを同様にして切り替えられるようにしたいと思います。
これができたりできなかったりして、詳しいことはよくわかってないのですが、とりあえず記しておきますね。

まず、vim のタブですが、これは :tabe コマンドで開くことができます。
vim を起動したら、試しに次のように入力してみて下さい。スクリーン上部にタブが表示されます。

:tabe ~/.vimrc

PuTTYなどのクライアントを使っている場合このタブは、コマンドあるいは .vimrc で次の指定をすることで、マウスクリックでも操作できるようになります。

set mouse=a

タブを閉じたいときは、スクリーンの右上、タブの右側端にある X をマウスでクリックするか、次のコマンドを打ちます。

:tabc

あるいはこう打っても大丈夫です。

:q

タブを閉じてもバッファには残ったままですので、完全に閉じるには、バッファを閉じるか、vim 自体を終了させて下さい。1

タブについて詳しくはこの辺のサイトとかを見て下さい。

さて次に、簡単なファンクションキーに機能の割り当てをしてみましょう。
これは昔どこかのサイトで見つけた書き方を真似したものなのですが、.vimrc に次のように書くと、F3キーを押したときに、:tabn が実行され、右のタブに切り替わります。

map <F3> <ESC>:tabn<CR>

同様にして、Ctrl+左右キーにも機能を割り当ててみましょう。
.vimrc に次のように書きます。この際、^[ は vim では、Ctrl+v の後に ESCキーを押して入力しますので注意して下さい。

map ^[[C <ESC>:tabp<CR>
map ^[[D <ESC>:tabn<CR>

.screenrcの設定をしたときと同じで、^[[Cは、Ctrl+左キーを表します。

.screenrcの時に書きましたが、termcapinfoの指定があると、うまくい効かないことがあるようです。
termcapinfoが具体的に何をしているのかは、僕にはまだ解っていません。

という風にして、screen のウィンドウ切り替えを Alt+左右キーで、vim のタブの切り替えを Ctrl+左右キーで行えるようになりました。

■ 追記

PuTTYのバージョンが v0.59 以下だと Ctrl+左右キー への割り当ては動作しないようです。
ごった煮版の v0.60 に上げたら動作しました。

マウス操作も0.59だと満足に動かないようなので、この際バージョンアップしてしまうのがいいでしょう。
ごった煮版 v0.60 の背景を透過させて使いたい場合は、こちらをご覧下さい。

  1. バッファの中身は :ls コマンドで確認でき、:bw 1 と番号を指定すれば閉じられます。

Ctrl+左右キーでscreenのウィンドウ切り替えをする

GNU screenでウィンドウを切り替えるときに、本来なら C-a p や C-a n を入力するのですが、キーの位置が直感的でなく、2回キーを押さなければならなかったりと、なかなか馴染めませんでした。
そこで、調べてみたところ、この機能を割と簡単に Ctrl + 左右キーや、Alt + 左右キーに割り当てられることが分かりました。

まず Ctrl + 左右キーに割り当てる方法です。
.screenrc に次のように書きます。^[ は普通に ^ と [ を入力すれば大丈夫です。

bindkey "^[[C" next # Ctrl + Right
bindkey "^[[D" prev # Ctrl + Left

この ^[[C という文字列がどうして分かったかというと、ググって出てきた文字列をそのまま採用したわけですが(汗)、tail コマンド実行中など、カーソルキーを受け付けないモードの時にカーソルキーを押すと、これと同じような文字列を確認することができます。
例えば右キーだと、

^[[C

Ctrl + 右キーだと

^[OC

Alt + 右キーだと

^[^[[C

Ctrl + Alt + 右キーだと

^[^[OC

となります。

なんとなく規則性が見えますね。
ただ、.screenrc の bindkey で設定する値と、Ctrlキーの押す押さないが逆なのが気になります。

さて、これがどこで定義されているのかというと、infocmp というコマンドで確認することができます。

$ infocmp | grep kcu
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,

たくさん出て来るので grep して省略してありますが、この4つが上下左右のキーを押したときの値を決めています。
これを見ると、右キーである kcuf1 の値は \EOC つまり ^[OC なので、先ほどの tail コマンドで確認したときと逆。つまり .screenrc の bindkey で設定する値の逆の逆で、同じことになりますね。

tail コマンドで確認したときになぜ逆になるのかは分かりませんが、なんとなく見えてきました。
これを応用して、Altキーを使ってウィンドウを切り替えたい場合は、次のようにすればいいと分かります。

bindkey "^[^[OC" next # Alt + Right
bindkey "^[^[OD" prev # Alt + Left

ところで、この方法について検索すると、次のような命令を .screenrc に書くように指示している記事もあります。

termcapinfo xterm* "ks=\E[?1l\E:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C"

これを書くと、先ほど tail で試したときのように、screen に対してCtrlキーの効きが逆になります。(確認できたのは screen に対してであって、tail で試しても逆にはなりませんでした。)
なので、^[[C を指定してしまうと、右キーを押しただけでウィンドウが切り替わってしまいます。
こうなると、.screenrcを編集し直すのも大変ですが、vim なら hキーと lキーでカーソルを移動できます。あるいは、Ctrlキーを押しながらカーソルキーを押しても大丈夫なようです。それでなんとか編集し直して下さい。

さて、この謎の指定ですが、termcapinfoというのは、先ほど確認した infocmp で見られる情報を変更する命令です。
ku、kd、kl、krがそれぞれ、上、下、左、右のキーを表しています。
ここのページを見ると、ksはキーパット送信モードにするという意味らしいのですが、それと Ctrlキーとの関係や、どう効果があるのかは分かりませんでした。

ひとまず今日調べて分かったのはここまで。
次は vim でも同じようにして、修飾キー + カーソルキーでタブやバッファを切り替えられるようにしたいのですが、こっちはだいぶ難しそうです。

ServersManでコンパネもろもろはやっぱりdaemonユーザーで動かす

先日こんな記事を書きました。

これは、ここの説明にそってsmadminをアップデートしたら、コントロールパネルもろもろに繋がらなくなってしまったため、その対策をと試行錯誤した結果を書いたものなのですが、やり方が間違っていたというか新しい方法が用意されていたようです。

@serversman-vps
ご利用ありがとうございます。先日のリリースで修正されておりますので、初期化かアップデートしていただくと、設定が変更されます bit.ly/gM9O5E
10月3日

新しいバージョンでは、smadminはApache(httpd)とは別のプロセスで動くそうで、ポートにHTTP標準の80番ではなく、9510番を使います。1
なので、接続するURLは、http://xxx.xxx.xxx.xxx:9510/serversman/ となるようです。

あと、実行するサービス名は、smadminではなく、smadmdのようです。
以下、前回変更した状態から、元に戻してコントロールパネルに繋がるようにするまでにやったことをメモしておきます。

  1. なのでiptablesで塞いでる場合は9510を開ける必要があります。

ServersManでコントロールパネルもろもろをapacheユーザで動かす

ServersMan@VPSの標準設定では、httpdのユーザーとグループが daemon になっています。
しかし、httpdに関するファイルで一部、ユーザーとグループが apache となっているものがあり、正常に動作しない場面がありました。
どんな場面だったのかよく覚えていないのですが……。

それで、/etc/httpd/conf/httpd.conf の231行目辺りのUserとGroupをapacheに変更していたのですが、そうするとServersManのコントロールパネル(http://xxx.xxx.xxx.xxx/serversman)が正常に動作しないという問題が起こります。
それで、そのコンパネに関するファイルのパーミッションを変えていったのですが、忘れない内にここにメモっておこうと思ったのです。

ちなみにOSはCentOSです。

zshでHomeキーとEndキーとDELキーを使う

bashからzshにしたところ、Homeキー、Endキー、Delキーが使えなかったので、使えるようにキーバインドを設定しました。
文頭にカーソルを移動させるときはCtrl+a、文末に移動させるときはctrl+eで移動させてる人も多いと思いますが、Windows使ってるときの癖が残ってたり、ctrl+aはscreenと被ったりするので。

設定は、.zshrcに以下のように書きます。

bindkey "^[[3~" delete-char
bindkey "^[[1~" beginning-of-line
bindkey "^[[4~" end-of-line

"^["というのも特殊な文字ではないので、普通にコピペして大丈夫です。

レンタルサーバー借りました

これまで www.yuuan.net へのアクセスは自宅サーバーに繋がってたんですけど、この度ServersMan@VPSのレンタルサーバーを借りまして、そちらに繋がるように設定し直しました。
pingdomというサイトで、サイトを表示するまでの速度を計測してみたところ、これまで12秒くらいかかっていたのが、8秒くらいまで短縮されました。
Entryプランなのに。

これでしばらく様子を見て、負荷が高そうであればVPSのプランを1ランク上のに上げようと思います。