ksmakotoのhatenadiaryスマートフォン用の表示で見るksmakotoのhatenadiary2016-12-16POSIXとのつきあいかたコンピュータ関係の技術的なものや技術的でないもの(標準規格とかいったようなものの半分は技術仕様ですが、もう半分は業界政治で出来ていると言えるでしょう)との「つきあいかた」にはいろいろあります。私のこれまでの経験などから、POSIXとのつきあいかた、といったようなことについて、いくつかの事例を示してみたいと思います。Bashismとのたたかいまぁ、Bashismとの戦いという点では、おまえらPOSIXを守ってくれ、と言いたい側ではあります。(ash系)で盛大にコケるようなものが生態系として定着してしまうのはなんだかんだ言って脅威なわけで、過去にいくつかのプロダクトに向けてチケットを投げたりパッチを書いたこともあります。Bashismではないですがseqコマンドの代替をシェル関数として実装したりだとか。Project(heirloomとは遺産のこと)がメンテしている伝統的Unix由来の実装(これもportsから入れられる)、それぐらいを確認手段にしています。AWK依存だと割り切って書く、ということも必要でしょう。今の所自分がAWKで書いたプログラムにはありませんが、gawkを使いたくなりそうな点というとまずは多言語対応とかそのあたりでしょうか。StandardsGNU/Linuxシステムでよく使われているcoreutilsのユーティリティには、POSIXLY_CORRECTという環境変数を設定することによって、(おそらく各ツールの製作者がrationalと考えたものである)通常の挙動から、POSIXにより厳格に従った挙動に挙動を変更するものがあります。)の中には多くの場所で、POSIXへの言及があります(重複を除いてざっと二十数箇所ぐらい)。これはある意味で「GNUプロジェクトという立場からの『POSIXとのつきあいかた』」と言えるでしょう。その「POSIX」という名前をsuggestしたのはリチャード・ストールマンさんだ、という話があります*1。)は、POSIXの性格を示すコマンドの一つだと思います。tarとcpioという乱立に乱立を重ねた状態にあったアーカイブユーティリティについて標準化するにあたり、既存のものを標準化するのは諦め、さらにもう一つの(願わくば、混乱の収拾に至る道となってほしい)種を播いた、と言えるでしょうか。その種は、混乱の収拾に向けて、育っていると言えるでしょうか。ちなみに私は使って(使えて)いません。dateコマンドのオプションの無さ標準Cライブラリ(libc)にはいくつかの便利な関数がありますが、それをちょっと使いたい、といった時に、Cのコードを書いて試すのは少々ではありますが、手間です(Cインタプリタ、たとえばCINT*2などを使うことで少しは手間を減らせるかもしれませんが)。いった時、類似した機能が使えるコマンド、というのは結構便利です。123453039といった感じです。」という、あまりメジャーでないフォーマット文字列があります*3。オプションと、フォーマット文字列を指定する、という引数しか標準にはない)。後から指摘されたのですが、特に何かうまい代替手段も無さそうだったので、記事には注意書きを追加したのみです。これはPOSIXを追求しなかった例、という話でした。本題とは無関係ですが、私はMacr055*4というテキストマクロプロセッサを作っています。)マクロプロセッサではevalという組込みマクロで四則演算などの算術式の計算ができるので、同様の機能を実装したのですが、自分で実装するのは面倒だったので、外部のbcコマンドを利用することにしました。算術式の計算は、ベンチマークに利用するのに便利ですから、あまり重いのも嫌です。そんなわけでbcには、標準入力から入力を得て逐次その結果を標準出力に吐くモードがありますから、それを利用しました。処理対象が数式なのですから、ゼロ除算のような意味的エラーは別としても、構文エラーに対してはエラーを検出したいものです。bcがそのようなエラーを検出した時、そのメッセージが標準出力に出力されるのか、標準エラー出力に出力されるのか、実装によってまちまちになっています。)はstderrに吐いてきます。)したところ、この点に関して明示が意図的に存在しないような(としか思えない)書き方になっている、ということを見つけました。上から順番に関係しそうなものを見てゆきます。節には、「正常の場合の出力」のことのみが書いてあります。messages」とあります。messages」とあるのは何か、ということになりそうです。節が長く続いた後、最後にわずかにエラーに触れた記述があります。節で出力されるとされているのは、こちらのエラーのみということになりそうです。message」とのみあります。それをstderrに吐くべきかstdoutに吐くべきか、を示すような情報はどこにもありませんし、「should」ですから、絶対にそうしなければならないわけではない、ということでもあります。successfully.」とあって、標準入力からの入力についてはやはりボカしているような感じがあります。回避しました(この項、思い出したので追記)。まとめそういったわけで、他には、カーネルとのAPIに関してはLKML周辺の人々をウォッチしていれば、やはり時々、「POSIXとのつきあいかた」が見られるような話題を見ることができるでしょう。POSIXは、明確な参照実装が存在したりするような「仕様」とは、違うタイプの「標準」ではないか、と私は捉えています、というのが本稿の結論めいたもの、となるでしょうか。standard」「specification」、それぞれ微妙にニュアンスが違いますし、現実に存在しているものは、たとえば似たように「標準」と銘打っていても、それぞれ違った位置づけだったりするものです。