なんでも自動化
コンピュータのおかげで様々な仕事が楽になりましたが、つまらない操作を何度も繰り返さなければならないこともよくあります。たとえば以下のような処理は手作業で行なうのが普通ではないでしょうか。
ある規則に従って沢山のファイルの名前を変更する
例: 沢山のファイルの1文字目を大文字に変更する、ファイル作成日時をファイル名に追加する、など
特殊なテキスト修正処理を行なう
例: 連続する行の先頭に記号を挿入する、先頭要素と二番目の要素を入れ換える、など
一方、よく実行されるファイル操作やテキスト編集操作については、様々な機能を組み合わせて実行できることもあります。たとえば以下のような処理であればデスクトップやエディタの機能の組み合わせでなんとかなります。
10MB以上のムービーファイルをバックアップフォルダに移動する
⇒ ファイルをサイズと種類でソートし、必要なものを選択して移動する
文中のすべての「abc」を「def」に変更する
⇒ エディタの文字列置換機能を利用する
このように、似たようなレベルの仕事であっても、システムに機能が用意されているかどうかで手間が相当異なることがありますし、システムの機能を熟知して使いこなすのはなかなか大変です。
作業が単純ではっきりしている場合、繰り返される操作を小さなプログラムとして表現し、それを何度か繰り返して実行させることができれば良いと考えられます。「行の先頭に移動して記号を入力し、次の行に移動する」とか、「「abc」という文字列を捜し、みつかったら3文字削除して「def」を挿入する」といった処理をプログラムとして記述してすぐに使うことができるようになっていれば、特殊な繰り返し操作が必要になっても困ることはありませんし、エディタの文字列置換機能のようなものは必要なくなってしまうかもしれません。このようなちょっとした処理手順をユーザが定義する「操作マクロ」(キーボードマクロ)}を利用できるテキストエディタは多いですし、本格的なプログラミングが可能なEmacsのようなエディタもありますが、普通のユーザにとってこういったプログラミングは敷居が高く難しいものですから、面倒を我慢してこつこつ作業することが多いだろうと思います。 手軽にちょっとした自動化処理を指示できるといろんな場面で便利なはずなので、誰でも簡単なプログラミングを行なえるようにするため、エンドユーザプログラミングや例示プログラミングという考え方が提唱されています。本格的なプログラミングは難しいかもしれませんが、料理のレシピのような手順書であれば簡単に書いたり利用したりできますし、大抵の人はアナログ時計のアラームぐらいはセットできるわけですから、環境さえ用意すれば誰でも簡単なプログラミングができるようになる可能性は充分あるといえるでしょう。
エンドユーザプログラミング
簡単なプログラムを誰でも手軽に作って利用できるようにしようという考え方を「エンドユーザプログラミング」と呼びます。前述のような仕事はすべてちょっとしたプログラミングで解決できますから、JavaScriptやRubyのような汎用言語のプログラムを誰もが書けるようになれば、ユーザは面倒な処理をする必要がなくなるはずです。しかし多くの普通のパソコンユーザがプログラミングに関する知識を持って日常的に使うということは当分考えにくいので、この方針はまだハードルが高すぎるといえるでしょう。 テキストだけを利用してプログラムを表現するよりも図を併用した方がわかりやすいことが多いので、エンドユーザプログラミングシステムでは、図形を使ったビジュアルプログラミングシステムがよく採用されています。ビジュアルプログラミングの研究は長い歴史がありますが、まだ本格的なプログラミングに利用されているとはいえません。しかし、音楽家の間ではMaxというビジュアルプログラミングシステムが広く利用されていますし、Lego Mindstormsのような教育システムでもビジュアルプログラミング言語を採用することによって、プログラミングのハードルを下げるのに成功しています。 http://gyazo.com/e169f00f71e0bc1cce768b9f6a9b2469.png
Maxのプログラム例
http://gyazo.com/a31f6c41ce3ef3131858044ce47ed7d1.png
MindStormsのプログラミング
MacにはAutomatorという簡単なビジュアルプログラミングシステムが搭載されており、アプリケーション操作を自動化するプログラムを手軽に作れるようになっています。左の図は、人間を表現するアイコンへファイルをDrag\&Dropすることによってその人にファイルをメールで送るというプログラムをAutomatorで作成したものです。これは「顔アイコン](****)」というシステムで提案されている機能ですが、 Automatorを使うとこのように非常に簡単に実装することができます。
http://gyazo.com/cdf152c15c245cbb5b25941e5ff88576.png}
Automator
Automatorは高機能なシステムですが、Macユーザに広く利用されているとはいえないようです。ビジュアルにわかりやすいという利点はあるものの、プログラミングには違いありませんから初心者にはハードルが高いですし、テキストベースのプログラミングが得意な人はAutomatorを使わず、もっと一般的なプログラミング言語を使うからかもしれません。
例示プログラミング
プログラミングが難しいと思われているのは、抽象的思考が必要になるからかもしれません。一方、レシピを記述したり目覚まし時計をセットしたりする操作は具体的だからわかりやすいのでしょう。アナログ時計の文字盤の「7」に針をあわせるという操作は時刻が文字盤の上に具体的に表現されているのでわかりやすいのですが、昔のビデオデッキで番号を録画するときのように「7:00」のような数字を入力する操作が必要な場合、時刻やチャンネルの数字による表現が抽象的でわかりにくいため、ビデオの予約は難しいという印象が定着してしまったのでしょう。ビデオの録画予約が苦手な人でも、チャンネルを変えたり録画ボタンを押したりすることはできるでしょうから、このような具体的な操作だけで予約ができるようになっていればよかったのかもしれません。
抽象的な思考を必要とせず、具体例な操作を行なったり指示したりするだけでプログラムを自動生成してくれるシステムを例示プログラミング(Programming by Example, PBE)システムと呼びます。( 予測インタフェース、Programming by Demonstration (PBD)と呼ばれることもあります。) 例示プログラミングの手法を使うと、抽象的な表現を利用せず、具体的な操作だけをもとにしてプログラミングを行なうことができます。たとえば、「100.bak」というファイルを削除し、「101.bak」というファイルを削除し、「102.bak」というファイルを削除したら、次は「103.bak」を削除するだろうとシステムは予測できるでしょうし、システムが正しく予測を行なってくれるように意図的に操作を行なうこともできるでしょう。このとき、ユーザはシステムに対して操作例を示すことによって「bakという拡張子をもつファイルを順に削除する」というプログラムを作成できたことになります。 PBEシステムを利用すると、例を示すだけでプログラムを自動生成できるのは素晴らしいことなのですが、与える例が充分でなければ正しいプログラムを生成することはできませんし、システムが間違った予測を行なってしまう可能性を完全にゼロにすることはできません。前の例では、「10」で始まるファイルを順番に削除したいのか、「.bak」という拡張子を持つファイルを全部削除したいのか、これだけの例から判定することはできません。しかし充分な例を与えたり、生成されたプログラムが正しいかどうかをユーザが知らせるようにすることにより、少ない手間で正しいプログラムを生成することは可能です。
下図は、AppleにいたAllen Cypherが1990年ごろ開発したEagerというシステムで、ユーザがHyperCard上で同じような処理を繰り返したとき、それを検出して自動実行を助けてくれるというものです。ユーザが同じような操作を繰り返すと、画面に「猫」が出現してユーザの次の操作を予測して表示します。正しく予測してくれているようだと感じられれば、ユーザは猫に頼んで残りの処理を自動実行してもらうことができます。この例では、「1.」,「2.」とユーザが入力しているので、猫は次に「3.」が入力されるだろうという予測を行なっています。 http://gyazo.com/60b16b1ecec22247c5e1618d1970ea9b.png
Eager
猫は普段は隠れており、ユーザが同じような操作を繰り返したとき画面に出現するようになっています。しかし突然猫が出現するとユーザは驚いてしまいますし、常に正しい予測を行なってくれるわけではないので、Eagerは結局ほとんど流行しませんでした。IBMに移ったCypherはその後ブラウザの操作を自動化する「CoScriptor」などのシステムの研究を行なっています。このシステムを使うと、ブラウザ上での様々な繰り返し操作が自動化できますし、作成したプログラミングをWeb上で共有できたりするので便利です。 Dynamic Macro
高度な予測を行なうのはあきらめて、完全にユーザ主導で単純な繰り返し処理を自動実行させるようにすればシステムの動作にユーザが驚くことはありません。このような方針で私はDynamic Macroというシステムを開発しました。たとえば以下のようなテキストを編集する作業について考えてみます。 メールテキストを引用するとき
引用記号を先頭につけるのが
慣習ですが、
手作業で引用記号をつけるのは
面倒なものです。
このテキストに引用符をつけたいとき、まず以下のように手作業で最初の2行だけに引用符を付加します。
> メールテキストを引用するとき
> 引用記号を先頭につけるのが
慣習ですが、
手作業で引用記号をつけるのは
面倒なものです。
ここでユーザが「繰り返しキー」を押すと、Dynamic Macroはユーザの操作履歴を調べて繰り返し操作を検出し、「行頭に「> 」を挿入して次の行に移動する」という操作をプログラムとして自動登録して実行します。この結果テキストは以下のようになります。
> メールテキストを引用するとき
> 引用記号を先頭につけるのが
> 慣習ですが、
手作業で引用記号をつけるのは
面倒なものです。
繰り返しキーを連打すると、キー入力のたびにマクロが実行され、テキストは以下のように変化します。
> メールテキストを引用するとき
> 引用記号を先頭につけるのが
> 慣習ですが、
> 手作業で引用記号をつけるのは
> 面倒なものです。
Dynamic Macroの場合、連打が必要ではありますが、繰り返しキーを押さない限り特別なことは起こりませんからユーザが驚くことはありませんし、予測を間違う可能性は低いので、かなり実用的に利用することができます。
例示プログラミングシステムでは具体的な操作を行なうことによってプログラムを自動生成することができます。複雑なプログラムを作ろうとすると実行例を沢山与える必要がありますが、単純なプログラムを作りたい場合は有効な手法だといえるでしょう。「こう動いて欲しい」という例を示すだけでいろんなシステムがうまく動いてくれれば大変便利なはずですが、今のところ、こういうことができるのはパソコン上のテキストエディタやブラウザなどに限られています。将来的に全世界のセンサやアクチュエータを自在にプログラミングできるようになれば、「近くに友達がいれば連絡する」とか、「株価が上がったら株を売る」といったプログラムを誰でも簡単に作って利用できるようになるはずです。「近く」のような漠然とした概念は普通のプログラム言語では簡単に表現することができませんが、ビジュアルプログラミングや例示プログラミングを利用すれば簡単に指定できるかもしれません。ユビキタスコンピューティングにおける様々な自動化を支援する環境に今後期待したいところです。
例示プログラミングとデータ圧縮アルゴリズム
例示プログラミングシステムは、ユーザの操作履歴から次の操作を予測することによってプログラムを生成しています。既存のデータをもとにして新しいデータを予測するという方法は様々な場所で利用されていますが、データ圧縮アルゴリズムとして特に広く応用されています。 データ内容が片寄っている場合や、データ中に同じ内容が繰り返し出現する場合は、データを圧縮することが可能です。人間が扱う大抵のデータはこのような冗長性を持っているので、これをうまく抽出することにより効率的なデータ圧縮ができます。たとえば「abc」という文字列が10回続けて出現した場合、「abcabc...」と書くかわりに「「abcが10回」と書いた方が短いからです。逆に、効率的なデータ圧縮プログラムはデータの片寄りや繰り返しをうまく検出するのが得意だということになります。このようなアルゴリズムを利用すると、ゲームで相手の手を予測できる可能性があります。 効率的なデータ圧縮を行なうアルゴリズムとしてPPM(Prediction by Partial Matching)法というものがあります。PPM法では、データの中の文字列出現頻度を計算することによって次の文字の予測を行ないます。たとえば「abracadab」という文字の並びの次にどの文字が来るか予測する場合、 「a」は4回、「b」は2回出現している
「b」の後に「r」が続いたことがある
「ab」の後に「r」が続いたことがある
...
といった情報を累積して確率を推定します。この場合、 3から考えると次の文字は「r」である確率が高いと思われますが、1も考慮すると「a」の確率もある、という風に計算を行ないます。 PPMのようなアルゴリズムを利用すると、じゃんけん必勝システムを作ることができます。人間が同じようなパタンで手を出しているとシステムはその統計的性質を学習するので、長く勝負すると必ずトータルでは負けてしまいます。確かに効果的な予測が行なわれていることがわかります。 人間の行動や人間が目にするものは繰り返しで満ちています。毎日同じような行動をしていると、今日の行動記録は「昨日と同じ」のように圧縮可能になってしまうので、歳をとるとだんだん時間がたつのが速く感じられてしまうのでしょう(c.f. 時間感覚のコントロール)。繰り返しの少ない/圧縮しにくい人生を送るためにも、無駄な繰り返しを自動化するツールを活用したいものです。