何をしようとしているのか(より専門的かも版)


ほとんどすべてのパソコンユーザーは、パソコンを使って文字を操作していることでしょう。以前のワープロ専用機の代わりにパソコンを導入した原稿執筆を目的とするユーザーだけではなく、C++JavaBasic、アセンブリ言語などのプログラミング言語でプログラムを書くプログラマも、チャットやメールを楽しむネットワーカーも、入力フォームに数字を打ち込む経理マンも、キーボードに両手を置きながら画面を見ているときには、ほとんどのパソコンユーザーが文字を入力しているのです。

文字を操作するときの反復作業の自動化

しかし、文字を入力していると、なぜ自分はこんなに単調な反復作業をしているのだろうかと思うことがよくあります。たとえば、Webの掲示板に投稿する文章を書いたあと、改行コードを入れなければ画面上で行を折り返せない掲示板プログラムに合わせて、文章の途中に改行コードを挿入していくというようなことはよくあります。文章に紛れ込んだ半角カタカナをすべて全角に変換するために、画面とにらめっこしているという場面もよくあるでしょう。しかし、単調な反復作業は、コンピュータがもっとも得意な分野です。せっかくコンピュータを使っているのですから、単調な反復作業は、できる限りコンピュータに任せてしまいたいところです。

このように考える人は、あなたや私だけではなく、昔からたくさんいましたので、すでにさまざまな成果があります。それらの成果は、大きく2つに分類することができるでしょう。1つは、編集中の文書やプログラムを画面のなかで見ながら、メニューやツールバーに含まれているさまざまなコマンドで文書に変更を加えていくもので、ワードプロセッサ、高機能テキストエディタや対話的開発環境(Interactive Development Environment)と呼ばれるプログラム開発用プログラムなどに組み込まれています。たとえば、私が使っているシェアウェアのテキストエディタ(秀丸: http://www.maruo.co.jp/)には、マウスで選択した部分を全角ひらがな、全角カタカナ、半角カタカナのどれかに変換するコマンドが含まれています。FEPのなかでひらがなから全角カタカナに変換し損ねるということはよくありますので、このコマンドは重宝しています。

フィルタと呼ばれる小さなプログラム群

もう1つはこれよりもわかりにくいものですが、むしろ長い歴史を持つもので、指定されたファイルの内容を読み出し、決められた簡単な仕事を行って、その結果を画面に表示する小さなプログラムを使うというものです。プログラムの実行方法(コマンド行という1行の文字列。プログラムを起動するときには、かならずこの文字列を使います)の指定次第で、画面に対する出力は、ファイル(ただし、原則として読み出したファイルとは別のもの)に流し込むこともできます。

具体例を使って説明しましょう。この種のプログラムとしてはかなり強力なsedというプログラムがあります。sedUNIXで生まれたプログラムで、同じくUNIXで使われていたedというラインエディタの「ストリーム版」です。edには、「指定した行の後ろに指定した行を追加する」とか、「指定したパターンを指定した文字列に置き換える」といったコマンドがありました。操作の仕方がまだるっこしいことを除けば、このような対話的な操作は、先ほどの第1のプログラムとよく似ています。ただ、いかんせんハードウェアの能力が今よりも非常に非常に低かった時代の産物ですので、画面全体でファイルを表示することができず、基本的に行単位でファイルを操作していました(ですから、スクリーン: 画面エディタではなく、ライン: 行エディタなのです)。それはともかく、この方法にはもっと根本的なところでまだるっこしいところがあります。それは、プログラムを起動したあと、「指定した行の後ろに指定した行を追加する」とか「指定したパターンを指定した文字列に置き換える」といったコマンドをいちいち入力し、おそらく最後に「ファイルを保存する」というようなコマンドを実行しなければ、求める編集結果が得られないことです。しかし、10個ぐらいのファイルに対してまったく同じ順番で同じコマンドを実行するのだとしたら、コマンドの入力、実行という作業自体が単純な反復作業になってしまいます。

sedは、この単純な反復作業を自動化できるようにするために作られたプログラムです。エディタコマンドを別のファイルにまとめておいて、sedを実行するときに編集したいファイルと編集コマンドが格納されたファイルの2つのファイルを指定すると、次の瞬間には編集結果が得られます。たとえば、部分的に半角カタカナが使われているファイルがあり、その半角カタカナを全角カタカナに変換したいものとします(私が使っているメールプログラムは、メールのなかで半角カタカナを使っていると、メールを送ってくれませんので、このようなことがときどき必要になります)。次のようなコマンドファイル(一般にこのようなコマンドファイルはスクリプトと呼ばれますので、これからはスクリプトという言葉を使うことにします)を作ってtozen.sedとでも名前を付けて、(日本語対応の)sedに渡せば(sed -f  tozen.sedというようなコマンド行を指定します)、コマンドを起動した次の瞬間には目的を達することができます(なお、(中略)としてある部分には、その他の濁音と半濁音について、前後の行と同様のコマンドが含まれています)。

 

s/ガ//g

s/ギ//g

s/グ//g

(中略)

s/ペ//g

s/ポ//g

y/アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。「」/アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ、。「」/

 

さて、この一括自動変換型のプログラムには、面白い性格があります。先ほど、画面出力をファイルに流し込むことができると書きましたが、もう一捻りして、画面出力をほかの自動変換型プログラムの入力として渡すことができるのです(sed -f 1stscr.sed | sed -f 2ndscr.sedのように|、すなわちパイプ記号でつなぎます。このような形で複数のコマンドを組み合わせたコマンド行をパイプラインと呼びます)。たとえば、先ほどの逆で、すべての全角カタカナを半角カタカナにするスクリプトを作ったとします(先ほどのスクリプトの全角カタカナと半角カタカナを入れ替えれば、そのようなスクリプトが得られます)。さらに、全角ひらがなを半角カタカナにするスクリプトも作ります。入力ファイルをまず全角カタカナ→半角カタカナスクリプトを指定したsedに渡してから、その出力を全角ひらがな→半角カタカナスクリプトを指定したsedに渡すと、すべての全角かなが半角カタカナに変換されます。さらに、この出力を最初の半角カタカナ→全角カタカナスクリプトに渡すと、すべてのかな文字が全角カタカナになっている出力が得られます。手持ちのスクリプトがこの3種類だけだったとしても、このように工夫次第ですべての全角ひらがなを全角カタカナに置き換えられます。しかし、全角ひらがなを全角カタカナに変換するスクリプトを別途作れば、全角カタカナ→半角カタカナ、全角ひらがな→全角カタカナ、半角カタカナ→全角ひらがなの順で3つのスクリプトを実行することにより、ひらがなだった部分をカタカナに、カタカナだった部分をひらがなに変換することができるようになります。パズルめいていますが、プログラムを組み合わせると色々なことができるということはわかっていただけることと思います。一括変換型プログラムは、このような組み合わせ方ができるということから、フィルタと呼ばれています(なお、正確を期するために書いておきますが、先ほどの例は、sed3回起動しなくても、sed3つのスクリプトファイルを同時に渡す方法でも実現できます)。

Windowsでのフィルタの使いにくさ

 以上をまとめると、対話的なプログラムは直観的で個々の操作を確かめられるという長所を持つ一方で、単純な反復作業を必要としがちであるという短所を持ちます。一括変換型プログラムは、単純作業を自動化でき、コマンドを組み合わせて操作のバリエーションを広げられるという長所を持つ一方で、個々の操作を目で確かめられず、わかりにくいという短所を持ちます。片方の長所がもう片方の短所になり、片方の短所がもう片方の長所になっているわけです。ですから、そのときそのときの条件に合わせて両方を使い分けるというのが本来の姿だろうと思います。しかし、ここまで読んできて、2種類のプログラムがあると言っているけれども、一括変換型プログラムなどというものは使ったことがないなぁと思われた方が多いのではないかと思います。それは、一括変換型プログラムにもう1つの短所があるからです。一括変換型プログラムは、Windowsでは使いにくいのです。

 実は、Windowsには、sort.exeという組み込みのフィルタプログラムが含まれています。しかし、同じ組み込みプログラムでも、sortはメモ帳や電卓などと比べて知名度が高くありません。それは、sortがデスクトップアイコンやスタートメニューアイテムとして登録されていないからですが、もし登録されていても使いものにならないでしょう。もし登録されていたらどうなっていたかは、簡単に試すことができます。「スタート」メニューの「ファイル名を指定して実行」を選択し、オープンされたダイアログボックスにsortとだけ入力して「OK」ボタンを押すだけです。真っ黒で何も書かれていないウィンドウがオープンされたはずです。このウィンドウには、文字を入力することができます。たとえば、次のように入力してみましょう。

 

 

各行の行末では、[Enter]キーを押してください。このように4行のテキストを入力したあと、5行目では、[Ctrl]キーを押しながら[Z]キーを押します。すると、次のような表示になります。

 

^Z

 

最後にほかの行と同じように[Enter]キーを押すと、真っ黒ウィンドウはぱっと消えてしまいます。

実際には、[Ctrl+Z][Enter]というキーストロークは、入力の終了を表わします。sortプログラムは、このキーストロークを受け取ったときに、実は目にもとまらぬ速さで並べ替えを実行し、結果を出力しています。しかし、結果の出力と同時にsortプログラムは終了してしまいますので、ウィンドウもクローズされてしまいます。ですから、ユーザーは何よりも大切な処理結果を見ることができないのです。

この問題を取りあえず解消することはできます。「スタート」メニューで「プログラム」サブメニューを選択する(Windows 95/98/NT)か、「プログラム」サブメニューからさらに「アクセサリ」サブメニューを選択する(Windows Me/2000/XP)と、「MS-DOSプロンプト」(Windows 95/98/Me)または「コマンドプロンプト」(Windows NT/2000/XP)という名前のアイテムを選択すると、先ほどと同じような黒いウィンドウが表示されます。しかし、今度のウィンドウには、C:\>という文字が書かれています。ここにsortと入力してから、先ほどと同じことをしてみましょう(なお、「ファイル名を指定して実行」ダイアログボックスに、Windows 95/98/Mecommand /k sortWindows NT/2000/XPcmd /k sortと入力すると、sortコマンド実行後に、C:\>というプロンプトが表示されます)。

 

 

今度は、並べ替えの結果を見ることができます。しかし、このウィンドウにも、問題はあります。Windows 95/98/MeMS-DOSプロンプトの場合、画面サイズが80字×25字に固定されてしまいますので、結果が長くなったときには最後の部分しか見ることができません。Windowsに標準で添付されているもう1つのフィルタ、moreを使えば最初から順に見られるようになりますが(また、Windows NT/2000/XPのコマンドプロンプトなら、画面サイズを指定できますが)、それでもクリップボード操作がしにくいとか、ちょっとした操作ミスで出力が消えてしまうとか、結果をファイルに保存したときにそのファイルを改めて表示するのが面倒だといった問題は残ります。少なくとも、他のワープロやテキストエディタを使い慣れた目からは、不便で不自由に感じられるはずです。

MS-DOSプロンプトやコマンドプロンプトでのフィルタプログラムの実行にはもう1つ問題があります。それは、プログラムの動作を微調整するオプションやファイル名をすべてキー入力しなければならないということです。Windowsが普及する前は、この黒い画面が画面のすべてだったので、キー入力が面倒なことが問題だなどとは考えなかったものですが、Windowsが普及したあとは、ごく普通のGUIプログラムで編集対象のファイルの名前を入力するのは、そのファイルを初めて作って名前を付けるときぐらいのもので、一度名前を付けたファイルは、マウスをちょこちょこと操作すれば簡単にプログラムに渡すことができます。GUIプログラムでは、暗号めいた-aだの-iだのといったオプションを丸暗記しなくても、ダイアログボックスがオプションの意味を説明してくれますし、それでわからなければより詳しいヘルプウィンドウをボタン1つでオープンできます(もっとも、ヘルプウィンドウの説明自体がよくわからないこともよくありますが)。Windows 95が発売されるまでは、フリーソフトとしても盛んに開発されていたフィルタコマンドをすっかり見かけなくなった要因の1つは、このようなところにあると思われます。

フィルタにGUIフロントエンドを与える

 では、フィルタコマンドにウィンドウを与えてほかのGUIプログラムと同じようにすれば、使いやすくなるのでしょうか。確かにオプションを覚えなくても済むようになるとか、入力ファイルをキー入力しなくても済むようになるという点ではそうですが、フィルタコマンドの最大の特長である組み合わせ実行ができなくなってしまいます。

 PCKは、この問題を解決するために作られました。PCKの方法は、フィルタの単純なGUI化ではありません。GUIのないフィルタプログラムには、GUIがないからこそできること(パイプラインの組み立てやバッチファイルでの利用など)があります。ですから、フィルタはフィルタとして温存しておきます。その一方で、フィルタを駆動するGUIプログラム(GUIフロントエンドと呼ぶことにしています)を作ります。たとえば、Windows sortのために作ったGUIフロントエンドは、次のようになっています。

 

 

これを見れば、sortコマンドには/R/+/?オプションがあることがすぐにわかります。組み立てたコマンド行は、ウィンドウの最下部に表示されます。入力、出力ファイルは、それぞれのグループの「参照」ボタンを押せば、キーボードを使わずに指定できます。また、これらのファイルについては、エクスプローラからファイルをドロップして指定することもできます(出力ファイルを指定するときにはキーボードの[Ctrl]キーと[Shift]キーの両方を押しながらドロップ。入力ファイルは、それ以外のドロップで指定できます)。しかし、このプログラムは、テキストの内容をソートするための機能を一切持っていません。「実行」ボタンを押すと、「設定」ダイアログボックス(「設定」ボタンを押したときにオープンされるダイアログボックス)で指定されたフィルタプログラム(この場合は、sort.exe)が起動され、その出力が同じく「設定」ダイアログボックスで指定されたテキストエディタ(テキストファイルを読み出せるプログラムなら、狭義のテキストエディタでなくても、たとえばWebブラウザやワープロ、スプレッドシートでもかまいません)のなかに表示されます。しかも、入力ファイルは基本的に読み出し専用で使いますので、ほかのプログラムで編集中のファイルを入力ファイルとして指定しても、そのプログラムがファイルの共有についてよほど特殊なポリシーを持っていない限り、処理を実行することができます。そして、一度オプションと入力ファイルを指定してしまえば、「実行」ボタンを押すだけで、同じコマンド行を何度でも実行できます。ですから、あるファイルを編集しながら、そのファイルを入力とするGUIフロントエンドをセットアップすると、同じコマンド行を繰り返し実行し、編集結果が出力にどのように反映されるかを簡単に確かめることができます。

 このようにして組み立てたコマンド行は、パイプラインの組み立てにも使えます。コマンド行の右にある白い四角をドラッグして、pipe line)というプログラムにドロップします(あるいは、送り元のGUIフロントエンドで「コピー」ボタンを押してからの「貼り付け」ボタンを押します)。この作業を繰り返せば、それらのコマンドから構成されるパイプラインを組み立てられます。たとえば、次に示すのは、sortuniq(同じ行が隣り合って複数存在するときに、最初の行だけを出力して、繰り返しを省略するプログラム。sortの出力には、同じ行がいくつも連続して並ぶことが多いので、uniqを組み合わせると出力が見やすくなります)の2つのコマンドをドロップしたあとののウィンドウです。

 

 

ウィンドウの最下部に、sortuniq|でつないだsort |uniqというコマンド行が表示されていることに注目してください。sortと同じ機能を持つGUIプログラムとuniqと同じ機能を持つGUIプログラムがあっても、このように組み合わせることはできません。実際の処理をコマンド行プログラムにさせているので、このように簡単に複数のプログラムを組み合わせることができるのです。しかも、組み立てたコマンド行はバッチファイルとして保存できますので、次に同じsort |uniqを実行したいときには、再度コマンド行を組み立て直さなくても、からそのバッチファイルをロードすることができます(エクスプローラでバッチファイルを表示しているときには、そのファイルをダブルクリックするだけで、このパイプラインがセットされたが起動されます)。また、このファイルは通常のバッチファイルですので、MS-DOS/コマンドプロンプトで再利用することもできます。

PCKには、先ほどのsortフロントエンドのように特定のコマンド行プログラムを対象としたフロントエンドばかりでなく、任意のコマンド行を自由に指定できるcommand line)というプログラムもあります。

 

 

これを使えば、sortのような専用フロントエンドが用意されていないフィルタも、パイプラインに追加することができます。PCKが目指しているのは、このようなGUIと非GUIの間のちょっとした隙間を埋めることなのです。