f

2016-12-05

Introduction of references about POSIXism (POSIX fundamentalism)

#posixismadvent この記事はPOSIX原理主義Advent Calendarの5日目だ。

POSIX原理主義を実践していくうえで参考になる文献・書籍・ツールを紹介する。

POSIX原理主義とは何であるかについて知りたい場合や,POSIX原理主義を実践していくうえでのシェルスクリプトの知識を身に付けたい場合,頼りになる文献が必要となる。押さえておけばよいと思われる文献をまとめたので,これらを参考にして勉強していこう。

POSIX原理主義の文献

POSIX原理主義について書かれた文献をまとめる。

論文

POSIX原理主義について発表された論文や発表スライドを紹介する。

ソフトウェアの高い互換性と長い持続性を目差すPOSIX中心主義プログラミング
項目内容
タイトル ソフトウェアの高い互換性と長い持続性を目差すPOSIX中心主義プログラミング
発表日 2016-07-08
学会マルチメディア,分散,協調とモバイル(DICOMO2016)シンポジウム
表紙画像
書誌情報 松浦, 智之; 大野 浩之 & 當仲 寛哲 (2016) : ソフトウェアの高い互換性と長い持続性を目差すPOSIX中心主義プログラミング, DICOMO, pp. 1328 - 1334. http://tsys.jp/dicomo/program/7A.html.
解説 POSIX原理主義の論文発表。6ページ。論文本体は非公開。Windows 10においてBashが使えるようになったことにも触れられている。現在発表されている全文献の中で最もPOSIX原理主義について詳しく書かれている。POSIX原理主義について参照したり言及するときはこの論文を引用しよう。
POSIX中心主義と情報科学教育
項目内容
タイトル IoT時代に資するユニケージ開発手法の普及啓発に関する研究(2)POSIX中心主義と情報科学教育
発表日 2016-03-11
学会情報処理学会第78回全国大会
表紙画像
書誌情報 [論文]松浦, 智之; 中村, 和敬; 大野, 浩之 & 當仲, 寛哲 (2016) : IoT時代に資するユニケージ開発手法の普及啓発に関する研究(2)POSIX中心主義と情報科学教育 , Vol. 2016 , No. 1 , pp. 421 - 422. https://ipsj.ixsq.nii.ac.jp/ej/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=163079&item_no=1&page_id=13&block_id=8.
[スライド]松浦, 智之; 大野, 浩之 & 當仲, 寛哲 (2016) : IoT時代に資するユニケージ開発手法の普及啓発に関する研究(2)POSIX中心主義と情報科学教育 , 情報処理学会第78回全国大会. http://www.slideshare.net/tomoyukimatsura/posix-59447685.
解説 POSIX原理主義の初めての学会での露出。論文・スライドとも公開。要旨は2ページと少ない。教育の分野でのPOSIX原理主義の適用を軸に理論を紹介。POSIX原理主義の理論はこの時点で確立していた。この時点ではPOSIX原理主義による開発ソフトのライセンスは現在のCC0と異なりPublic Domainだった。
書籍

POSIX原理主義やPOSIX原理主義を実践するテクニックについて解説された一般販売書籍を紹介する。

Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか
項目内容
タイトル Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか
発表日 2016-11-10
表紙画像
書誌情報 松浦, 智之 (2016) : Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか. http://richlab.org/coterie/pfb2.html.
解説 「すべてのUNIXで20年動くプログラムはどう書くべきか」の実質改訂第2版。論文で発表されてきたPOSIX原理主義の理論がきっちりと解説されている。また,POSIX原理主義を実践していくうえでのTipsが大量に掲載されている。特に,POSIX規格の正規表現の解説が参考になった。
Shell Script ライトクックブック 2014-2016
項目内容
タイトル Shell Script ライトクックブック 2014-2016
発表日 2016-08-14
表紙画像
書誌情報 リッチ・ミカン (2016) : Shell Script ライトクックブック 2014-2016. http://richlab.org/coterie/ssr2016.html.
解説 「20年動くプログラムはどう書くべきか」の下地となっている同人誌。POSIX原理主義の思想についても解説。書籍版と異なり,同人誌版は購入するとPDFの電子書籍版も入手できる。
すべてのUNIXで20年動くプログラムはどう書くべきか
項目内容
タイトル すべてのUNIXで20年動くプログラムはどう書くべきか
発表日 2015-08-04
表紙画像
書誌情報 松浦, 智之 (2015) : すべてのUNIXで20年動くプログラムはどう書くべきか. http://richlab.org/coterie/pfb.html.
解説 POSIX原理主義について初めて書かれた書籍。この頃は交換可能性というPOSIX原理主義の本質となる概念が考案されておらず,理論に未熟な部分があった。書籍の内容としては「Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか」の下位互換であるが,値段が安いというメリットがある。
スライド

シェルショッカーが公開しているスライドを掲載する。

恐怖!シェルショッカーのPOSIX原理主義シェルスクリプト
項目内容
タイトル 恐怖!シェルショッカーのPOSIX原理主義シェルスクリプト
発表日 2016-03-20
イベント歌舞伎座.tech#9「異種プログラミング言語格闘勉強会」
表紙画像
書誌情報 シェルショッカー日本支部 (2016) : 恐怖!シェルショッカーのPOSIX原理主義シェルスクリプト. http://www.slideshare.net/ShellShoccarJpn/posix-59780910.
解説 ニコニコ動画のドワンゴ主催のIT技術勉強会である「歌舞伎座.tech」での発表。この発表によりシェルショッカーの存在が世間に知れ渡るようになった。当時の発表の様子はニコニコ動画の有料会員になれば今でも閲覧可能歌舞伎座.tech#9「異種プログラミング言語格闘勉強会」 - 2016/03/20 13:30開始 - ニコニコ生放送)。POSIX原理主義の実績がふんだんに紹介されており,説得力のある素晴らしい発表だった。POSIX原理主義に興味があれば,まずこのスライドを見ることを強く勧める。
恐怖シェルショッカー一号男!
項目内容
タイトル 恐怖シェルショッカー一号男!
発表日 2014-10-11
イベントPHP Conference Japan 2014
表紙画像
書誌情報 松浦, 智之 (2014) : 恐怖シェルショッカー一号男!. http://www.slideshare.net/tomoyukimatsura/1-php-con2014-40134119.
解説 POSIX原理主義集団である秘密結社シェルショッカーの設立発表と怪人シェルショッカー第一号(ショッピングカート)の誕生。シェルショッカーの活動はここから始まったといえる。

POSIXとシェルスクリプトの文献

狭義のPOSIX原理主義であるPOSIXに極力準拠したプログラミングや,POSIX原理主義で主に使われるシェルスクリプトについての文献を紹介する。

POSIX規格

狭義のPOSIX原理主義を実践していくうえで最重要文献がPOSIX規格だ。1988年に公布されて以来,IEEE Standard 1003やISOなどの承認を受けながら,内容に問題がないことの確認とともに改訂が重ねられている。POSIX規格は以下のページで参照できる。

The Open Group Base Specifications Issue 7, 2016 Edition

POSIX規格はOSが最低限守るべきとされる共通規格であり,C言語のシステムコールも含んでいる。そのため,単にPOSIX規格を参照すればいいといっても量が多すぎる。実際のところ,重要度が高いと思われる箇所があるのでそのポイントを解説する。

まず,POSIX規格は以下の4種類から構成される。

POSIX規格の構成
種類略称略称の由来説明
Base DefinitionXBDX Base Definition規格全体で共通の用語や概念,C言語ヘッダーファイルの説明。
System InterfacesXSHX System Interfaces and HeadersシステムコールなどC言語の関数を説明。
Shell and UtilitiesXCUX Command and Utilitiesシェル・コマンドの説明。
XRATXRATX RATional上記3文書の解説。

参考:Preface - The Base Specifications Issue 7

これらの4文書における重要なポイントを以下の表でまとめた。

POSIX規格における重要なセクションの紹介
文書セクション解説
XBD1. IntroductionPOSIXから参照している標準規格を掲載。例えば,C99やASCII文字コード,FORTRAN77など。その他に規格の専門用語(undefined,unspecifiedなど)を定義。

3. DefinitionsPOSIX規格で使われる用語を定義している。ファイル名に使える文字や,規格で登場する用語utilityの意味などが定義されている。POSIX規格で意味のわからない用語が出てきたら,このセクションを検索して該当項目を読もう。

8. Environment VariablesPOSIXで定義されている環境変数が定義されている。ロケールに関する環境変数も定義されている。ただし,POSIXで使える環境変数はこれが全てではないことに注意する。実際には,2.5.3 Shell Variables - XCUとXCUの各種コマンドのページでも環境変数が定義されている。XCUのコマンドで特に重要になる環境変数はshコマンドの環境変数だ。shはシェルスクリプトの起動元(#!/bin/sh)となるので,影響範囲が大きい。

9. Regular Expressions正規表現について定義。BRE(Basic Regular Expression)とERE(Extended Regular Expression)が存在する。これらは他のプログラミング言語で使われる正規表現のサブセットである。BREとEREさえ理解できれば,どの言語でも使える正規表現を書けるので極めて重要度が高い

10. Directory Structure and DevicesPOSIXで存在が保証されているディレクトリや,デバイスファイル/dev/nullなどが定義されている。

12. Utility Conventionsコマンドの引数やオプション仕様について定義。一部ロングオプションなどこの規定の範囲外の挙動もするが,世間で出回っているコマンドは基本的に暗黙の内にこの規約に準拠されている。コマンドのオプションを指定する場合や,コマンドを自作する場合に重要になる
XSH
ひたすらC言語の関数について記載されている。細かい挙動について理解するには重要だが,ひとまず後回しでもよい。
XCU
シェルスクリプトの構文とコマンドが定義されており,ほぼ全ての内容が重要3. Batch Environment Servicesのセクションのみ重要度が低い。また,175個のコマンドが定義されているが,全てが重要というわけではない。grepやsedなど主要なものを押さえていけばよいと思う。まずはこの規格をよく読んでシェルスクリプトの構文やコマンドの使い方を理解しよう。
XRAT
XBD,XSH,XCUの個別の項目について,歴史的経緯などより詳細な解説がなされている。補足説明として読むとよい。理解が不十分の場合,こちらの該当箇所の解説も読むことを勧める。例えば,2.5.2 Special Parameters - XCU$@$*の違いなど,具体例が掲載され詳しく説明されている。

POSIXで定義されているコマンドは全部で175個となる。文量が多く一度に全て把握することは困難なので,何度も見返しながら少しずつ理解を深めていくのがよいだろう。

シェルスクリプトの文献

POSIX原理主義の主なプログラミング言語はシェルスクリプトである。そこで,シェルスクリプトを記述するうえで参考になる文献についても紹介する。

入門UNIXシェルプログラミング
項目内容
タイトル 入門UNIXシェルプログラミング
発表日 2003-02-05
表紙画像
書誌情報 ブルース ブリン (2003) : 入門UNIXシェルプログラミング. http://www.sbcr.jp/products/4797321946.html.
解説 発売日が2003年と古い書籍だが,内容がとてもしっかりしている。未だに有用。これはPOSIXに準拠すれば,時間に関係ない知識を得られるということを示している。紙書籍版しかないのがとても残念。シェルスクリプトをやるなら一冊手元にほしい。
入門bash 第3版
項目内容
タイトル 入門bash 第3版
発表日 2005-10-26
表紙画像
書誌情報 Newham, Cameron & Rosenblatt, Bill (2005) : 入門bash 第3版. https://www.oreilly.co.jp/books/4873112540/.
解説 bashについて書かれた書籍。内容は「入門UNIXシェルプログラミング」とよく似ている。こちらはPDFの電子書籍があるのがありがたい。「入門…」が入手できなければこちらでも代用がきくと思われる。ただし,bashの独自拡張がいたるところで使われているので,POSIX規格と合わせて読むことを勧める。「入門…」ではhistoryファイルなどのbashの設定については一切記載がない。bashはLinuxの標準シェルとして広く普及している。bashの設定についても書かれており,POSIX原理主義とは離れるが役に立つ部分がある。個人的にはLinuxでシェルを初めて使う人にはこの本を勧めたい。
bashクックブック
項目内容
タイトル bashクックブック
発表日 2008-09-23
表紙画像
書誌情報 Albing, Carl; Vossen, J. P. & Newham, Cameron (2008) : bashクックブック. https://www.oreilly.co.jp/books/9784873113760/.
解説 シェルスクリプトにおいてある特定の作業を行いたいというときの対処方法がレシピの形で掲載されている。全19章645ページにわたりひたすらレシピが書かれている。情報量としては相当なもので,実作業で疑問に思ったことがあればこの本を読めば参考になる情報が掲載されている可能性が高い。
基本的にはbashを前提とした解説になっているが,シェルスクリプトの互換性を高めるためのテクニックも掲載されており,POSIX原理主義を実践するうえでも参考になる部分がある。また,bashでなされる処理をPOSIX原理主義でやる場合ならどうやればいいか?という視点で見ることもでき勉強になる。
Effective AWK Programming
項目内容
タイトル Effective AWK Programming 4th Edition
発表日 2015-0313
表紙画像
書誌情報 Robbins, Arnold (2015) : Effective Awk Programming. http://it-ebooks.directory/book-1491904615.html.
解説 AWKについて書かれた書籍。AWKが使えればできることが一気に広がる。英語版は無料で入手可能。日本語版も古いが公開されている。
その他の書籍

その他に有用と思える書籍を紹介する。

UNIXという考え方
項目内容
タイトル UNIXという考え方
発表日 2001-02
表紙画像
書誌情報 Gancarz, Mike (2001) : UNIXという考え方 - その設計思想と哲学. http://amazon.co.jp/o/ASIN/4274064069/.
解説 シェルスクリプトやPOSIX規格とは関係ない話が多いが,UNIXの設計思想について書かれており,シェルスクリプトでのプログラミングで参考になる部分がある。本自体も分厚くないので手元に一冊もっておいてもよいと思う。
詳解UNIXプログラミング第3版
項目内容
タイトル 詳解UNIXプログラミング第3版
発表日 2014-04-21
表紙画像
書誌情報 Stevens, W. Richard & Rago, Stephen A. (2014) : 詳解UNIXプログラミング 第3版. http://amazon.co.jp/o/ASIN/B00KRB9U8K/.
解説 UNIXにおける標準Cライブラリが提供するシステムコールなどC言語の膨大な関数について詳細に解説している。POSIX原理主義においてはC言語の部分の知識の補強にとても役に立つ。その他,POSIXや関連規格の歴史について第2章で詳しくまとまっている。POSIXは1988年に公布されてから何回か改訂がなされている。しかし,この経緯や関連規格との関係などはあまり文書にまとまっていない。POSIX規格とは何であるかを知るうえでこの書籍はとても役に立つ。値段が高いので,第2章だけ見たければGoogle Booksでみてもよいかもしれない。

ツール

最後にPOSIXに準拠したシェルスクリプトを書く上で役に立つツールを紹介する。

参考:シェルスクリプトのlint - Qiita

POSIX man

POSIX原理主義を実践していくうえで,以下の2項目を確認したいことが頻繁にある。

  • 使用したいコマンドがPOSIXに準拠しているか
  • どのオプションがPOSIXに準拠しているか

きちんと確認するにはPOSIX規格を確認するべきだが,毎回Webブラウザーを開いて確認するのは煩雑だ。これを解消する手段として,POSIXのmanがある。

Debian系OSであれば,manpages-posixパッケージをインストールすれば,manコマンドでPOSIXのmanを閲覧できるようになる。Ubuntu 16.04で確認した。

sudo apt install manpages-posix manpages-posix-dev

manコマンドでPOSIXのmanを見たいコマンドのセクション番号のあとにpposixの先頭から数語を付ける。

man 1p psman 1po grep
man 3posix clock

これでPOSIX Programmer's Manualがmanコマンドで閲覧できる。なお,このPOSIX Programmer's Manualはオンラインのmanページでも閲覧できる。

参考:Linux man pages online

インストールしたパッケージに何が含まれているかは以下のコマンドで確認できる。

apt show manpages-posix-dev
apt show manpages-posix
POSIXのmanに含まれるもの
パッケージ内容
manpages-posix1p: command
manpages-posix-dev3p: library call
7p: header files

なお,RedHat系OSでは最初からPOSIX manはインストールされているようだった。パッケージをネットで探したが見つからず,少なくともCentOS 7ではデフォルトでインストールされているようだった。

参考:linux - How to install man pages for C standard library functions in Ubuntu? - Super User

checkbashisms

POSIXに準拠しているかどうかをチェックするcheckbashismsというPerlで作られたプログラムがある。

checkbashisms download | SourceForge.net

ただ,bashやkshの独自拡張を使っているかどうかのチェックだけのようで,構文の誤りまではチェックしない模様。

なお,2.0.0.2をダウンロードして試したところ,以下のような警告が出た。

cat <<- EOT >> sh.sh
#!/bin/sh -u A=b [[ "$A" = "a" ]] && echo OK
EOT
./checkbashisms sh.sh
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/
            # the exec should either be "eval"ed or a new statement
            (^\s*|\beval\s*[\'\"]|(;|&&|\b(then|else))\s*)

            # eat anything between the exec and $0
            exec\s*.+\s*

            # optionally quoted executable name (via $0)
            .?\$0.?\s*

            # optional "end of options" indicator
            (--\s*)?

            # Match expressions of the form '${1+$@}', '${1:+"$@"',
            # '"${1+$@', "$@", etc where the quotes (before the dollar
            # sign(s)) are optional and the second (or only if the $1
            # clause is omitted) parameter may be $@ or $*.
            #
            # Finally the whole subexpression may be omitted for scripts
            # which do not pass on their parameters (i.e. after re-execing
            # they take their parameters (and potentially data) from stdin
            .?(\${ <-- HERE 1:?\+.?)?(\$(\@|\*))?/ at ./checkbashisms line 422, <IN> line 3.
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/
            # Match scripts which use "foo $0 $@ &\nexec true\n"
            # Program name
            \S+\s+

            # As above
            .?\$0.?\s*
            (--\s*)?
            .?(\${ <-- HERE 1:?\+.?)?(\$(\@|\*))?.?\s*\&/ at ./checkbashisms line 448, <IN> line 3.
possible bashism in sh.sh line 3 (alternative test command ([[ foo ]] should be [ foo ])): [[ "$A" = "a" ]] && echo OK

使用しているPerlはv5.22.1,OSはUbuntu 16.04。原因がよくわからないが,このようなエラーが出るようではソフトウェア自体も当てにならない。

ShellCheck

checkbashismsと同じようにPOSIXに準拠しているかどうかのチェックツールとして,ShellCheckがある。こちらは,Haskellで作られたもので,Webアプリ版とコマンドライン版の2種類が用意されている。

ShellCheck – shell script analysis tool

Webアプリ版のShellCheck

例えば,先ほどのコードを貼り付けると以下のように警告を出してくれる。

ShellCheckの結果例

よくできている。checkbashismsを使うくらいならこちらを使ったほうがよいだろう。ただ,残念ながらこのShellCheck自体がPOSIXに準拠して作られていないという問題がある。したがって,こうしたツールはあくまで一時的な確認として使う程度にし,自分の知識を磨きツールに依存しないようにしよう。

まとめ

POSIX原理主義を実践していくうえで役に立つ文献について紹介した。学ぶべきことは多いが,やる価値は十分にある。

POSIX原理主義にしたがえば,一度書くだけでいつでもどこでも実行できる(Write once, Run anytime anywhere),時空を超える力が手に入る。ちょっとした知識であっても,一生使えるのならばそれは大きな知識につながる。早く始めれば始めるほど得られる便益は大きくなる。

僕もまだまだ勉強を始めた身であるので,これらの文献を読んでしっかり勉強していく。

0 件のコメント:

コメントを投稿