増井ラボノート コロンブス日和

第6回Dynamic Macro

便利な予測インターフェース

計算機の上で同じ作業を何度も繰り返さなければならないことがよくあります。計算機は単純な繰り返し作業が得意なはずですが、つまらない作業を人間が繰り返さなければならないことは意外と多いものです。たとえばExcelの表の中の負の数字だけアンダーラインを付けたいときはどうすれば良いでしょうか? そういう機能はExcelには用意されているかもしれませんが、知らなければ使えませんし、同じような処理であってもシステムに用意されていなければどうしようもありませんから、この手の仕事があったときは泣きながら手作業で処理したり、頑張ってスクリプトを書いたりしている人が多いのではないでしょうか。

計算機上の操作を効率化するために予測インターフェースと呼ばれるシステムが広く使われています。スマホのテキスト入力を効率化する「予測入力システム」やブラウザのURL補完機能、エディタの補完機能のような簡単な予測インターフェースは最近よく使われていますし、これまでの購入履歴を基にして商品を推薦するシステムなども一種の予測システムと言えるでしょう。予測インターフェース研究の歴史はけっこう古く、1993年には予測インターフェースの研究をまとめた『Watch What I Do』という本が出版されていますし、最近は例示や予測だけでプログラムを作ってしまおうという研究も行われています図1⁠。

図1 予測インターフェースに関する書籍
Watch What I Do: Programmin  by Demonstration(Allen Cypher、The MIT Press、1993年) Your Wish is My Command:Programming By Example(Henry Lieberman、MorganKaufmann、2001年) No Code Required:Giving Users Tools to Transform the Web(Allen Cypher/Mira Dontchevam/TessaLau/Jeffrey Nichols 、Morgan Kaufmann、2010年)

左:Watch What I Do: Programmin by Demonstration(Allen Cypher、The MIT Press、1993年)
中:Your Wish is My Command:Programming By Example(Henry Lieberman、MorganKaufmann、2001年)
右:No Code Required:Giving Users Tools to Transform the Web(Allen Cypher/Mira Dontchevam/TessaLau/Jeffrey Nichols 、Morgan Kaufmann、2010年)

予測インターフェースシステムでは、アプリケーションに関連したデータベースやユーザの操作履歴などを基にして、ユーザの次の操作を予測することによってユーザの仕事を減らす工夫をしています。URL補完の場合はよく使われるURLのデータベースが利用できますし、プログラミング言語に関する情報を持っていれば、ユーザが次に入力する言語キーワードを予測できます。このような固定的なデータベースを用意しておくことも重要ですが、ユーザの操作履歴を予測のためのデータベースとして利用すると便利です。ユーザが一度訪れたサイトのURLを覚えておけば補完に利用できますし、予測入力システムではユーザが利用した単語やフレーズが次の予測に利用されます。前述のExcelの例のような場合、負の数字にアンダーラインを付ける操作が繰り返されていることをシステムが検出できればユーザの次の操作を予測できるでしょう。

編集作業の効率化

文章やプログラムのようなテキストを編集するとき、同じような操作を繰り返すことがよくあります。たとえば、連続する行の先頭に記号を挿入したいような場合はカーソルを1行ずつ動かして記号を入力していくのが普通ですが、たくさんの行に対して同じ操作を繰り返すのはたいへんです。行頭に記号を挿入するスクリプトを書けば良いのかもしれませんが、一度きりかもしれない処理のためにプログラムを作成するのは面倒ですし、プログラミングの知識が必要です。また、CSV(Comma Separated Values:カンマ区切り)データの桁を並び替えたいときはどうでしょうか?CSVデータをExcelなどで読み取ってから並びを変えて出力すれば良いかもしれませんが、方法を考えるのも実際に作業するのも面倒です。

キーボードマクロ

このような作業を簡単にするために「キーボードマクロ」という機能が用意されているエディタがあります。キーボードマクロとは、一連のエディタ操作を1つのキー操作に割り当てることにより、複雑な編集操作を楽に実行しようというものです。たとえば「行頭に記号を挿入してから1つ下の行に移動する」という処理を[A]というキーに割り当てておけば、⁠A]を連打することによって連続する行の先頭に記号を入力していくことができますし、⁠カンマで区切られた部分を選択して移動してから次の行に移動する」という処理を[B]というキーに割り当てておけば、⁠B]を連打することによってCSVの桁を入れ替えていくことができます。

Dynamic Macro

キーボードマクロは便利な機能ですが、キーボードマクロの定義開始と終了のための操作が必要であるうえに、処理を正確に登録するのが難しいという問題があります。たとえば前述の例の場合、⁠1つ下の行に移動する」処理を定義に含めることを忘れてしまうと正しく動きません。

キーボードマクロの機能をもっと簡単に使えるようにするため、私はキーボードの繰り返し操作から次の操作を予測して、自動的にキーボードマクロとして登録できるDynamic Macroというシステムを作って長年Emacsの上で利用しています。

Dynamic Macroの原理は非常に単純で、

  • 「同じ編集操作を2回繰り返したあとで[CTRL][t]を押すと繰り返された操作が再実行される」

というものです。⁠二度あることは三度ある」と言うように、同じことが二度あればもう一度あるのは世の中でごく普通のことです。二度実行した操作をもう一度実行することもよくあることですので、この方法はたいへん効果的です。

Dynamic Macroの利用例

Emacs上に実装したDynamic Macroの利用例を示します。図2はEmacsでabcabcと入力したところです。

図2 Emacsでabcabcと入力
図2 Emacsでabcabcと入力

ここで[CTRL][t]を押すと、Emacsのキー操作履歴から「abcの入力」の繰り返しが検出され、キーボードマクロとして登録されて実行され、図3のようにもう1つabcが挿入されます。

図3 ⁠CTRL][t]キーでもう1つabcが入力される
図3 [CTRL]+[t]キーでもう1つabcが入力される

再度[CTRL][t]キーを押すと、図4のようにまたabcが入力されます。

図4 ⁠CTRL][t]キーでさらにもう1つabcが入力される
図4 [CTRL]+[t]キーでさらにもう1つabcが入力される

これは単純な例でしたが、Dynamic Macroはもっと複雑な編集操作でも使うことができます。

図5のようなテキストの上から2行を図6のように編集したとします。

図5 Dynamic Macroでもっと複雑な編集操作
図5 Dynamic Macroでもっと複雑な編集操作

図6は、行頭にputs "を入力してから行末に移動して"を入力して次の行に移動するという操作を2回繰り返した結果ですが、ここで[CTRL][t]キーを押すと、この操作の繰り返しが検出されてマクロ登録されて実行されるので、画面は図7のように変化します。

図6 テキストを編集してみる
図6 テキストを編集してみる
図7 ⁠CTRL][t]キーで入力補完
図7 [CTRL]+[t]キーで入力補完

さらに[CTRL][t]キーを何度か押すと画面は図8のように変化します。

図8 ⁠CTRL][t]キーを何度か押してみる
図8 [CTRL]+[t]キーを何度か押してみる

このように、複雑な操作であっても、同じ操作を2回繰り返したあとではDynamic Macroで何度でも連続実行できることになります。

Dynamic Macroの特徴

Dynamic Macroは繰り返し操作を効率化するシステムですが、予測インターフェースの考え方をキーボードマクロに応用したものだともいえます。ユーザの繰り返し操作を基にして次の操作を「予測」し、それをキーボードマクロのように利用できるからです。予測と言っても繰り返し操作からの「予測」ですので、誤った予測をしてしまう可能性はほとんどありません。

キーボードマクロと比較すると、Dynamic Macroには次のような利点があります。

  • 使うキーが[CTRL][t]1つだけである
  • 定義の開始と終了を正確に指定する必要がない
    • →繰り返し操作中のどこで[CTRL][t]を押しても操作が再実行される
  • 操作を行ったあとで繰り返し実行を指示できる
    • →普通のキーボードマクロを利用する場合、これから繰り返し操作を行うぞ、と意識して登録を開始する必要があるが、Dynamic Macroの場合は操作のあとで繰り返しに気づいて再実行させることができる

Emacsでの実装

Dynamic Macroは最初はEmacsの上で実装されました。Emacsでは(recent-keys)という関数を使って、最近のキー操作履歴を知ることができるので、⁠CTRL][t]が押されたときに、この機能を使ってキー操作履歴を取得し、繰り返し操作が見つかれば、それをキーボードマクロとして登録して実行すれば良いことになります。

dmacro.elを改良したndmacro.elというシステムもsnj14さんによって公開されています。ndmacro.elでは1, 2, 3と入力したあとで[CTRL][t]を押すと4, 5, 6,……のように、連続する文字列を入力していくことができます。

Atomでの実装

GitHubが開発しているAtomというエディタが最近プログラマの間で人気が出ています。AtomはJavaScriptとブラウザ技術をベースに作成されたモダンで高機能なエディタで、ユーザが自由にJavaScriptやCoff eeScriptで拡張機能を作成できます。Atomの拡張機能を利用することによって、Atom上でもDynamic Macro[1]を利用できます図9⁠。

図9 Atomエディタのマクロ「atom-dynamic-macro」
図9 Atomエディタのマクロ「atom-dynamic-macro」

Atomには(recent-keys)のような履歴保存機能は用意されていないので、addEventListener()のような機能を使って、操作履歴を自力で覚えておくようにしています。

予測インターフェースの難しいところ

予測インターフェースは便利なものですが、あくまで「予測」ですので、システムの予測がユーザの意図と異なる可能性が常に存在します。ユーザが1, 2, 3, 1, 2, 3と入力したとき、ユーザが次に入力したいのが1なのか4なのかはユーザ本人にしかわかりません。高度な予測を行おうとすると、予測を間違える可能性が高くなりますし、複数の予測結果から希望するものを選択する必要が出てくるかもしれませんから、機能と使い勝手のバランスが重要になってきます。

予測入力システムの場合、ユーザが入力したい単語が常に第一候補として提示されるわけではありませんが、欲しい単語が候補リストに含まれている可能性が高ければ、それほどユーザは不満を感じません。一方、正しく予測されることへの期待が大きいのにもかかわらず、頻繁に間違った予測が実行されてしまうようであれば、ユーザの失望が大きいため、予測システムの利用をあきらめてしまうかもしれません。予測インターフェース研究の歴史は長いにもかかわらず、最近まであまり利用されていなかったのは、こういう理由が大きいと思われます。Dynamic Macroの場合、まったく同じ操作を繰り返すだけですので間違った予測が実行されることはほとんどないのですが、それでも間違えることが皆無ではありません。もっと微妙な予測の場合は、システムが間違った予測をしてしまうことは多いでしょう。

Dynamic Macroのような予測機能は、実世界のさまざまな場所で使える可能性があります。同じ設定で2回動かしたらその設定を繰り返せる洗濯機が売られていたことがありますし、同じフレーズを2回弾いたら何度も繰り返してくれるピアノがあれば便利かもしれません。いろいろな予測機能を有効に使うことによって、世の中の単調作業を何でも効率化していきたいものです。

Software Design

本誌最新号をチェック!
Software Design 2022年9月号

2022年8月18日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)

  • 第1特集
    MySQL アプリ開発者の必修5科目
    不意なトラブルに困らないためのRDB基礎知識
  • 第2特集
    「知りたい」⁠使いたい」⁠発信したい」をかなえる
    OSSソースコードリーディングのススメ
  • 特別企画
    企業のシステムを支えるOSとエコシステムの全貌
    [特別企画]Red Hat Enterprise Linux 9最新ガイド
  • 短期連載
    今さら聞けないSSH
    [前編]リモートログインとコマンドの実行
  • 短期連載
    MySQLで学ぶ文字コード
    [最終回]文字コードのハマりどころTips集
  • 短期連載
    新生「Ansible」徹底解説
    [4]Playbookの実行環境(基礎編)

おすすめ記事

記事・ニュース一覧