Escape

みずしまさんのコメントから

この問題の根底にあるのは、初心者が
自分が扱っているデータ型(プログラミング
言語がサポートしているかどうかに関わらず
)を意識してないということだと思います。
例えば、HTMLの中に入力を埋め込むとき、
大半の場合、そのデータ型は単なる文字列
であってHTMLの要素(を表す木構造)では
ないはずなんですが、テンプレート
エンジンがその両者を区別していないせい
で面倒なことになっているというか。

まぁ、そこですよね。
ついでに書いておくと、初心者云々は別にしても、そもそもエスケープ処理というのがアレだと思うケースもあるんですよね。
HTML の場合は仕方がないとしてもだ。

<?php
$command = sprintf('find %s -type f', escapeshellarg($dir));
$output = `$command`;
?>

こんなの、なんかおかしいとか思わないんだろうか。
その escapeshellarg は本当にどのプラットフォームでも安全に動くのかという心配もあるのだけど、コマンドライン丸ごと文字列で受け付けるインターフェースしかないというのがどうよっていう。
パラメータを配列なり何なりで受け取れれるほうが絶対いいと思うのだがなぁ。例えばこんなの

<?php
$output = command_output('find', array($dir, '-type', 'f'));
?>

んでまぁ、ある程度 UNIX を知っていると「それ shell を経由する意味あるか」とか思うんだよね。pipe(2)+fork(2)+execvp(3)てな感じでいいじゃねぇかと。

パス長すぎ

なんか Ubuntu GutsyKDE4 入れてみたら KDE4 が起動しなくてなんでだろうと調べてみたら、klauncher が

Fatal error: can't create temfile

とかいってこけている。なんだこれ。kdelibs のコードを引っ張ってきて見てみると socket 周りが怪しい。さらに strace -f で追いかける。UNIX Domain Socket に bind しているところで失敗しているなぁ。お、なんか socket のパスがホームディレクトリ以下で長いな。数えてみたら 112 文字。bind の第3引数も 112 だ。
ん?112 文字? man 7 unix を見てみる。

#define MAX_UNIX_PATH   108

これか!とりあえず、/tmp にディレクトリ作って ~/.kde4 はそこへの symbolic link にしたら起動した。
しかし、ファイルサーバは afp でマウントするのも想定してあるのでホームディレクトリが長いんだよね。/Network/Servers/$(hostname)/Volumes/... とか

% (cd; pwd) | wc -c
64

長えよ。まぁ、ホームディレクトリが長すぎる環境もどうかと思うが、ホームディレクトリに socket 作るのもどうなんだろうと思わくもない。
ところで、kdelibs のコードをチラッと見た限りでは bind の第3引数は strlen(path) な感じになっている。ここは本来 sizeof(struct sockaddr_un) が来るはずなのではないかと思うのだけどどうなんだろう。