regexp と Hash


所謂エンタープライズ系システム(止まったら数名が割腹する系システム)とは、今や冷蔵庫みたいなCPUをごっそり積んだのマシンの上で商用 UNIX が動くものだったり、Linux がサーバビジネスを変える! といった一時期のおかしいまでの礼賛ムードがあったり、Win2000 や MacOS までも UNIX(そのものだったり、思想だけだったりするけど)がベースになったりで、OS のコアとしての UNIX は、アーキテクチャ的にも、ソフトウェア資産的にも、インターネットへの親和性的にも、総じて使いやすいとされている、という観察はできますやね。

ところが一方では、UNIX をどう使えば『私的に』便利で楽しくてじゅるりと来るのかについてはいまいち浸透していないように思っています。ある程度、研究上、業務上 UNIX を用いたことのあるエキスパートが、同じプラットフォームで、勉強中や仕事中などに、娯楽性のあることをしようとした際に考え出されたいくつかの仕組みはあっても、それがエンドユーザーにインパクトを与えるほどの仕組みであるかは疑問です。例えば、どんなに MS Word より出力と文書構造が美しかろうが、TeX で全部代替できるから UNIX が便利ですヨ、とはすぐには言えないだろうし。「UNIX はちっとも POP じゃない」と言ってもいい。

つうことで、UNIX を使うと、コンピュータは楽しいなあと思う瞬間を俺なりに考えてみます。もちろん、みんなで同時に使う、だとか、サーバ立ち上げるのもUNIXの醍醐味だけど、ここでは情報処理環境としての醍醐味に限定して。

結論から先に言うと、UNIXは、UI としての shell においては、

情報の処理ということでは、 ことが文化であり楽しみであり醍醐味だと思ってます。(もう少し付け加えると、標準入力と標準出力を扱うことも特徴かも)

では、なぜそれが醍醐味で他の OS では得られがたいのか? それは、これら手段で情報を扱うと、入力や出力は単なるテキストファイルなのに、文書や表、書籍といった表現とは全く違う概念で情報を扱うことができることにあるから。もうひとつは、これら手段で処理するためのコマンド群、プログラミング言語環境が揃っているから、てなところです。(コマンド補完やファイルネーム補完はそれら操作を直感的にするためのサポートかな)

プログラミング開発環境がある、と言っても、選択肢はあまたあります。が、手続き型プログラミング言語のエッセンスは、C も VB も C++ も Perl も Ruby も、データの型は違えど、if や while や switch..break みたいな単純な制御構造からなっているという点では一緒で、あとはそれをどう書くか、どれで書くと早いか、速いか、どれで書くと後々便利か、で選択すればいいだけです。そうなると必然的に、私的に使うプログラムがそんなに C でガチガチに高速である必要はありませんし、GUI で優しいコンピューティング! を最初から指向することもありません。てことで、俺としては sed, awk, shell script, Perl, Ruby などをふにゃふにゃ書いて自分のために使うことから初めてはどうかしら、と思います。

で、正規表現と連想配列は何なの? ですが、これは UNIX の CUI インタフェースである shell をいじる上では避けて通るといいことがない概念(データ構造の考え方)であり、そして避けて通ると Windows の shell や Mac の Finder より面倒なことが多いもの、と言えばいいでしょうか。(理論的なところはBNF記法やオートマトン、ハッシュなどで説明ができるのだけど、それは必ずしも必要ないと思う。詳しく説明したページはないかな〜と探してたらみっけたのが ここ。よいページです)

この正規表現を文書編集のためにマクロ言語として扱えるようにしたところが、sed の偉いところ、それに連想配列と制御構造を含めたのが awk の偉いところ、それをさらにシェルスクリプト風文法と統合して、system call も使うような面倒なことをスクリプトで処理できるようにしたのが Perl の偉いところ、Perl がやりたかったことをむちゃくちゃシンプルにしたのがRubyの偉いところ、であり、これら言語を規模に応じて好きに使って、ちょこざいなことを実現するのが UNIX の楽しみそのものだと思ってます。

例えば、
「あるディレクトリの中にある『なんとか.txt』のうち、ファイルの中身に『A??D』(?=何か一文字)と含んでいるものは、全部『なんとか.txt.a-d』と名前を変えたい(なぜなら後で % ls *.a-d とやるとすぐ分類できるから)」
てな処理は(現実問題としてあるかどうかは別にして)、少しのコマンドとパイプで、

% grep -le 'A..D' *.txt | xargs -i mv {} {}.a-d
なんてやるとうまくいって溜飲が下がりまくるのです。もちろん他のやり方で、shell script で for i in *.txt 〜 なんて式を使ってもいいです。「同じことをするのにいくつものやり方があったら、どれが最適かは自分で選ぶ」という、自分のためのプログラミングには許される原則があるので、ここでは好きな手段を使えばいいわけです。

結局のところ、プログラミング的思考でコンピュータを扱いたい、もしくはプログラミングアイデアをすぐカタチにしたいプラットフォームとして、UNIX とそれを取り巻く資産(ソフトウェア環境、情報量など)は、圧倒的に他のOSより充実していることから、この特徴を活かして『情報処理で遊びたい』人には、UNIX はそりゃもう奥深くて面白く、そうでない人には、CUI は古くさく、GUI はヤボったい or 前衛的すぎるとしか映らないだろうけど、まあしょうがないな、と思ってます。とにかく、私的に使う上で、修行して使うようなモンじゃない、と舐めてかかればいろいろ拡がりますえ。


ピカメケもどる| ピカサムシング