Oct - 28th

CentOS5でErlangをビルドするときの対処

Posted at 11:17 am | Filed Under Linux

ここに書かれている通り。現行でもバージョンが同じだったのでメモ。

--- lib/ssl/c_src/Makefile.in	2008-03-27 13:43:04.000000000 +0300
+++ lib/ssl/c_src/Makefile.in	2008-03-27 14:03:27.000000000 +0300
@@ -38,7 +38,7 @@
 CC = @CC@
 LD = @LD@
 SHELL = /bin/sh
-LIBS = @LIBS@
+LIBS = @LIBS@ -lkeyutils -lselinux
 PLAIN_CFLAGS = @CFLAGS@

Read More>

Oct - 14th

pacoを導入

Posted at 2:18 pm | Filed Under Linux

yumのレポジトリからインストールするのに何かと不都合のあるケースがあり、たとえばPHPはどうしてもソースからビルドしたいのだが、ソースからインストールしたプログラムを管理する方法がなく、今まではmake installの結果を保存するなどしていた。しかしpacKAGE oRGANIZER略してpacoの存在をこの秀逸なエントリで知ったので、これは便利とさっそく導入した。

手元のCentOS 4.7ではgtkmmの2.12から2.4までが必要といわれる。

configure: error: Package requirements (gtkmm-2.4 >= 2.12) were not met:

yumで検索するとkbs-ContOS-Extrasにgtkmm20と24が見つかったのでとりあえず24をインストール。そしたらやはりだめで今度は

checking for GTKMM... Requested 'gtkmm-2.4 >= 2.12' but version of gtkmm is 2.4.11
configure: error: Package requirements (gtkmm-2.4 >= 2.12) were not met:

と怒られる。いったんremoveして考える。で、激怒しそうになってもう一度yum list gtkmm*の結果をみると、gtkmm20のバージョンは2.212-1になっているではないか。じゃあgtkmm22にしてくれよと思わないでもないが、まあ歴史的経緯というやつがあるのだろう。気を取り直してgtkmm20とgtkmm-develを入れてみた。が、やっぱりうまくいかない。

でも、READMEを読み返すとgtkmmはGUIインタフェース用とのことなので、サーバでは使わないだろうから

$ ./configure --disable-gpaco
$ make
$ make install

で十分なことに気づいた。探究終わり。それから、件の記事にもある通り、paco自体を管理するために

$ make logme

これでインストール完了。さっそく試しに何かやってみよう、というわけで標的になったのはREXMLのDoS攻撃に対する脆弱性のことはとりあえず無視してRuby-1.8.7-p72。普通にディレクトリを移動してconfigureしてmakeしたら

[root@selfkleptomaniac.org ruby-1.8.7-p72] # paco -D make install

で完了。

pacoはLD_PRELOADを使ってwrite(?)か何かのシステムコールをフックしているとのことなので、そういえば似たようなネタを読んだことがあるなあと思った次第。

Read More>

Sep - 29th

/proc/PID/statusのVmHWM(とVmPeak)

Posted at 9:23 pm | Filed Under Books, Linux

この有名なエントリで読んだ、プロセスが使用しているメモリサイズを調べる方法の話が「サーバ/インフラを支える技術」にも載っていた。

しかし、注意しなければいけない。VmHWMはたとえばCentOS 4.5でカーネルを更新していなかったりする場合は表示されない。

では、いつそんなものが表示されるようになったのか。さすがにそんなマニアックなことはちょっとわからなかったので調べてみた。Googleではなかなかヒットしてくれない。仕方がないのでkernel.orgから2.6.xxのChangelogだけwgetしてgrepで探してみたら、2.6.15

And there has been no collector of these hiwater statistics in the tree. The
new convention needs an example, so match Frank’s usage by adding a VmPeak
line above VmSize to /proc/ /status, and also a VmHWM line above VmRSS
(High-Water-Mark or High-Water-Memory).

という記述を発見。こいつだ。

Read More>

Sep - 1st

fshの代わりにsshを使う

Posted at 5:23 am | Filed Under Linux

fshがpython-2.4以降にちゃんと対応していないので、fshを使ったシステム構成は後で困ることになるなあ、となんとなく悩んでいたのだが、ふと調べてみると「Speeding up SSH: fsh vs. OpenSSH v4 」という記事を見つけた。そのエントリにリンクされている「Quick-Tip: Reusing OpenSSH connections to the same host 」という記事によれば、OpenSSHのバージョン4以降であればfshのようなコネクションプーリング用のプログラムなしでもコネクションの再利用が出来るらしい。やり方はいたって簡単。$HOME/.ssh/configを編集して下のような行を追加する。

Host *
ControlMaster auto
ControlPath /tmp/%r@%h:%p

意味は、全てのホストでControlMasterを利用するように指定して、接続情報は/tmpに保存する、というものになる。いきなり/tmpだとマルチユーザのシステムではいかがなものかと思われるので、$HOME以下に適当な場所を指定する方がいいとのこと。まあ、その通りだ。autoのかわりにautoaskにすると、毎回接続を試みるたびにセッションを使い回すかどうか質問される。
実際に接続すると、ControlPathで指定した箇所に「リモートユーザ名@ホスト:ポート番号=」という名前のファイルが出来上がる。手元の環境でfsh、ssh共に適当な回数で実行してみたが、こんな結果になった。
まずはfsh:

localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null
real 0m0.607s
user 0m0.039s
sys 0m0.021s

localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null
real 0m0.121s
user 0m0.038s
sys 0m0.020s

localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null

real 0m0.117s
user 0m0.035s
sys 0m0.019s

localhost:~ yagi$ time fsh 192.168.x.xx ls > /dev/null

real 0m0.130s
user 0m0.036s
sys 0m0.021s

初回の接続だけ0.06秒かかったが、あとはおおむね0.01秒くらい。
続いてssh:
何もしないとおよそ0.3秒くらいかかる。ところが、ControlPathで指定したディレクトリにファイルが出来ると一気に

real 0m0.054s
user 0m0.004s
sys 0m0.005s

こんなスコアになってしまった。fshより早いってのはどういうことだ?

Read More>

Jul - 1st

crontabの責任者ちょっと来い

Posted at 4:34 pm | Filed Under Linux

crontabのオプションに「-r」というのがあるのをご存知だろうか。ご存知でしたか。そうですか。

manによれば、crontabについてこんな風に説明されている。

crontab コマンドは、IEEE Std1003.2-1992 (“POSIX”) に準拠している。この新しいコマンドのシンタックスは、 Vixie Cron の前のバージョンと異なっている (古典的な SVR3 シンタックスとも異なる)。

なるほど。作者のPaul Vixieという人の独断で作られたわけではないようだ。

しかし、このコマンド、とんでもなく人倫にもとる設計になっている。

みなさんがcrontabコマンドを利用するのは、たいてい編集(「crontab -e」)か閲覧(「crontab -l」)で、あとはせいぜいユーザを指定する(「crontab -u user -l」)くらいだろう。

だが、crontabのオプションにはもうひとつ「-r」というものがある。これは、

-r オプションは、現在の crontab を削除する。

という、実に問答無用なオプションで、編集の「e」のすぐ脇の「r」を押下してしまったが最後、あなたのcronは/var/log/cronにわずかな痕跡を残しただけできれいさっぱり消えてしまうのである。あなおそろしや。しかもご丁寧に何ら確認のメッセージを出すこともなく動いてしまう。rmやmvのように「-i」オプションをaliasに追加しておくようなせめてもの予防策さえない。

今日もどこかでcronの内容が意図せざる方法で消えているのだろうか。

Read More>

Jun - 25th

シェルスクリプトに無知なもので

Posted at 2:42 am | Filed Under Linux

bashで文字列を変数に展開するのにsedを何回も呼ぶのはいかがなものかと思ったので、なんとからなんかといじっていたら、文字列を分解して変数に展開するのは配列を使ってこういう感じでやるのかと気づいた。

$ cat test.sh
#!/bin/bash
TESTDATA="1 2"
DATA=(`sed <<< $TESTDATA -e s/[^0-9]/\ /g`)
echo ${DATA[0]}
echo ${DATA[1]}

$ ./test.sh
1
2

そこで他にもないか調べていたら、sedの呼び方は

$ echo $AAA | sed -e s/3/aho/g

より

$ sed <<< $AAA -e s/3/aho/g

の方が早いらしい

ちょっと計ってみた。

#!/bin/sh
MAX=1000
COUNT=1
while [ $COUNT -le $MAX ];
do
        echo $COUNT | sed -e s/[0-9]/hoge/g
        COUNT=`expr $COUNT + 1`
done

これと

#!/bin/sh
MAX=1000
COUNT=1
while [ $COUNT -le $MAX ];
do
        sed <<< $COUNT -e s/[0-9]/hoge/g
        COUNT=`expr $COUNT + 1`
done

これで計測した結果。

MAXを1000にしたら
echo      :real 0m4.470s
ヒアドキュメント:real 0m3.679s

MAXを10000にしたら
echo      :real 0m43.403s
ヒアドキュメント:real 0m36.990s

とっても素直な結果だ。

Read More>

Jun - 24th

CiscoのVPNクライアント(Linux版)でがっくり

Posted at 7:24 pm | Filed Under Linux

CiscoのVPNクライアントを使わなければいけない環境でWindows用クライアントしかもらえず、それでもLinuxマシンをクライアントにしたい人用のメモ。

事前にこれだけは知っておかないといけない。

・SMP対応カーネルだとビルドできない
・パッチは出てるけど2.6.19以降のみ対応

上の条件に当てはまってしまった場合はカーネルの再構築やらなにやらいろいろ作業が発生するので大変に面倒くさい。VPNクライアントが動いたのに他に問題が起きたら嫌だから回避、という選択も間違っていない。というか、自分ではやらない。みなさんにもお勧めできない。

Read More>

May - 27th

Microsoftからの刺客、その名もWIMP

Posted at 3:09 pm | Filed Under Apache, Linux, PHP, Windows

LAMPに対抗して、MicrosoftがIIS上でPHPを動かす環境を宣伝している。MSSQLではなくMySQLやPostgreSQLを宣伝するというのも愉快ではあるが。

それより何より、やはり気になるのは

Linux + Apache + MySQL + Perl(PHP, Python…) = LAMP

に対抗したキャンペーンの略称が、

Windows + IIS + MySQL + PHP = WIMP

になってしまっていることだろうか。

英辞郎より

wimp
【名】

弱虫、作話症{さくわしょう}、意気地なし、怖がり、勇気のないやつ、すぐあきらめるやつ
・You’re such a wimp. : 気が小さいね。
・That tequilla shot has been sitting there an hour, are you too much of a wimp to drink it?

さすが世界のMicrosoftはユーモアを忘れていない。

Read More>

Apr - 16th

へたれな疑問

Posted at 10:03 pm | Filed Under Linux, PHP

Gnome端末でもPuttyでも、表示をEUC-JPに設定していてもメールをprocmailから標準入力で受け取ってMIMEデコードしただけのJIS(ISO-2022-JP)の文字列をきちんと表示する。あれ?と思ってただのJISを表示させたら、やっぱり文字化けしない。

$ cat test.php
<?php
$str = 'ダライラマ';
print(mb_convert_encoding($str, 'JIS', 'EUC-JP') . "\n");
?>
$ php -q test.php
ダライラマ

この原理がわからない。JISのエスケープを見つけたらせこせこ処理してくれているんだろうか。viだとちゃんと文字化けする。

日本語環境の設定で苦労したのももう今は昔の話なので、この手の問題についてはぜんぜんわからなくなってしまった。

Read More>

Apr - 14th

telnet.exeのリトライ回数を制御できないか?

Posted at 7:51 pm | Filed Under Linux, Windows

knockdを使ってクライアントマシンが接続するポートの順番を決めて、そのとおりにアクセスしてきたクライアントにだけssh経由の接続を許可しようとすると、Mac OS XやLinuxマシンをクライアントにした接続では問題ないのに、WindowsXPからのログインだけが成功するときと失敗するときがあって、あるときはWindowsファイアーウォールをオフにしたら繋がったり、またあるときはぜんぜん失敗ばかりだったり、とにかく安定しない。仕方がないので、ソケット通信をサポートするスクリプト言語ならなんでもいいので、そっちで接続すると、問題なくすべてのステージをクリアできる。

問題はtelnet.exeにあったようで、会社の同僚が調べたところ、telnet.exeは何回か接続をリトライするらしく、そのため例えば5回リトライするなら、最初のポートへの5回目の接続と次のポートの1回目の接続はたまたまうまくいくため、最初のステージ(knockdでは一回ごとの「ノック」をステージと呼ぶ)だけはクリアして、後は失敗していたのが判明した。つまりtelnetのリトライ回数を制御できないとどうやっても駄目らしい。じゃあなぜうまくいったときがあったのかが謎だ。

Read More>

keep looking »