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ランク上のに上げようと思います。

Fedora15

これまでと同じ方法で、yumコマンドを使ってFedoraを14から15にアップグレードしました。

まず、fedora-release-15-1.noarch.rpmを入れるのですが、fedora-release-rawhide-15-1.noarchと依存関係があると言われるので、そちらも同時に入れました。
あとは今まで通りです。

# rpm -Uvh http://download.fedora.redhat.com/pub/fedora/linux/releases/15/Fedora/i386/os/Packages/fedora-release-15-1.noarch.rpm http://download.fedora.redhat.com/pub/fedora/linux/releases/15/Fedora/i386/os/Packages/fedora-release-rawhide-15-1.noarch.rpm
# rpm -Uvh http://download.fedora.redhat.com/pub/fedora/linux/releases/15/Fedora/i386/os/Packages/fedora-release-notes-15.0.0-1.fc15.noarch.rpm
# yum clean all
# yum -y upgrade

ここでエラーが出まくったので、エラーが出たプログラムを片っ端から削除。
特に普段使ってるようなものはなかったので……。そろそろ初めからインストールし直した方がいいのかなとも思いますが、面倒くさい。

再度yum -y upgradeを実行して、再起動……起動しない?!
ログインの手前で起動処理が止まってしまいました。

とりあえずデーモン達は動いているようで、HTTP、Samba、SSHなどは繋がり、ほっと一安心。
MySQLはエラーで起動していなかったのですが、/etc/my.conf に書いてある default-character-set=utf8 の書式が変わったのが原因みたいで、character-set-server=utf8 に書き直したらあっさり直りました。

前回アップグレードしたときもそうだったのですが、Perlのバージョンが上がったことで、CGIが動かなくなってしまっていました。
これはCPANでモジュールのアップデートを行えばだいたい直ります。

# cpan
cpan> upgrade

しかし今回はそれでもMySQLへのアクセスが上手くいかない。PHPは素直に動いてくれるのに……。

エラーログを見るとこんな感じ。

[Wed Jun 08 05:57:51 2011] [error] [client 192.168.0.2] install_driver(mysql) failed: Can't load '/usr/local/lib/perl5/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.16: cannot open shared object file: No such file or directory at /usr/lib/perl5/DynaLoader.pm line 200.

ググってみるとこれは、libmysqlclient.so.16 が見付からないために mysql.so が読み込めないということのようなのですが、/usr/lib/mysql を見ると、あるのは libmysqlclient.so.18 で数字が16から18になってる。

これを読み込むように指定している場所は、/etc/ld.so.conf なようで、中を見てみると ld.so.conf.d/*.conf をインクルードしている。
そこで /etc/ld.so.conf.d/ 以下を見ると mysql-i386.conf というのがあったので開いてみると、/usr/lib/mysql と書かれていた。
特に間違いはないように思える。
16という数字はどこから出てきたのだろう?

mysql-server や perl-DBD-MySQL をyumで削除して入れ直してみても状況は変わらず。

ホントにOSからインストールし直そうかなあ……。

■ 追記

どこに libmysqlclient.so.16 と書かれているのか探していたら、以下の場所にあったので、DBD::mysqlをインストールし直したらCGIは表示されるようになりました。

# find /usr/local/ -type f -print | xargs grep libmysqlclient.so.16
バイナリファイル /usr/local/lib/perl5/auto/DBD/mysql/mysql.so に一致しました
# cpan
cpan[1]> get DBD::mysql
cpan[2]> q
# cd ~/.cpan/build/DBD-mysql-4.019-r12r_n/
# ./Makefile.PL
# make
# make install

(cpanコマンドでmakeとinstallできるみたいだけど)

起動されない問題の方は、SSHでログインして startx すれば起動することがわかりました。
/var/log/boot.log を見ても何が原因で止まってるのかよくわからない。

■ 追記

起動時に途中で止まってGUIが起動しない理由がわかりました。
依存関係で適当に削除したときに、ログイン画面を表示するための gdm を削除してしまっていたようです。
これをインストールし直したらログイン画面が出るようになり、デスクトップが使えるようになりました。