RandomThoughts

RandomThoughts

Unix的GUIツール

Contents:
  1. コマンドラインから実行して、何かをして、終わる
  2. インターフェースはargv, stdin, stdoutで行指向のテキスト
  3. Unix的GUIツールの利点となぜそんな事を考えたか
  4. Unix的GUIツールの欠点
  5. 既存の例
  6. 例題:てきすとでっきのアーカイブ機能
    1. 作ってみた、htmnix
  7. 関連リンク等

  • mdvcat
  • mdvtbl
  • guash (これは不完全で、完全にはUnix的に出来なかったのだが)

などは、GUIツールでありながらUnix的な使い方を想定している。 その特徴に「Unix的GUIツール」という名前をつけて、それがどういうものか示しておきたい。

なお、以下はこのページを書いていて思いついたものだが、同じコンセプトを共有している

コマンドラインから実行して、何かをして、終わる

GUIツールがUnix的に使える為の条件としては、何か一つのタスクを実行して終わる、という前提がある。 そしてこの終わるまではシェルの実行はブロックされて、終わると次に進む。

逆にずっと立ち上がり続けるツールは「Unix的GUIツール」としては作れない。

インターフェースはargv, stdin, stdoutで行指向のテキスト

インターフェースを行指向のテキストと引数になるように頑張って考える。 しかも行指向のテキストはUnixの他のコマンドで作りやすいフォーマットを考える。

Unix的GUIツールの利点となぜそんな事を考えたか

GUIのアプリを書くのはかったるい。 でもスクリプトなどでちょっとした選択のインターフェースなどはGUIを使いたい、という事は良くある。

PowerShellのOut-GridViewやpercolはシェルスクリプトのパイプラインの中に組み込んで便利に使える。 だがこれらのツールで解決出来る問題は限られている。

これらのツールと同じように、別の問題も似た形で解決出来ないか?というのが「Unix的GUIツール」というアイデア。

Unix的GUIツールは、ツールとして使い方を使う人が選びやすい。 入力のテキストをgrepやsedでコンバートしたり出来るので、 入力の対象が違うドメインにもそのまま使えるし、 結果をシェルスクリプトで操作出来るので、違う結果にも使いやすい。 だから他人が作ったものを使いやすいと思う。

GUIツールは少し仕様が目的と違うだけで使いづらいので、細かいツールは各自がバラバラに自分用に作る、となりがち。 でもUnix的GUIツールのインターフェースだと、プログラムのインターフェースはだいたいGUIの機能から直接導ける形になっていて、 ドメインに依存する部分はその前後のシェルスクリプトで解決されるので、 より皆が同じツールを使いやすいのでは無いか。

また、ちょっとした書き捨てGUIツールを作る時に、その作った結果の部品を集めてツールボックスとして使えるようにしていけないかなぁ、という考えもあり、自然と使い回せるGUIツールボックスとしていく為の考え方として「Unix的GUIツール」とシェルスクリプトという問題の分解方法を思いついたというのもある。

使いまわしの他にも、バグりにくくて変更の必要性が少なくて簡単につくれる、という利点もある。 入出力の強い制約により、出来ない事が多い代わりに実現するものはこれ以外には無い、 と思えるような安定したインターフェースになり、個々のコマンドは変更の必要性が少ない。 単純なのでバグりにくく早く完成して、一度完成するといじる必要性が無い。 変更が必要なのはGUI的なツールよりはglueとなっているスクリプト側がほとんどで、 これらは変更が容易になっている。

Unix的GUIツールの欠点

まず一つの作業をしたら終わる、というのが、ある種のタスクでは使いづらい事がある。 GUIのツールではずっと立ち上がっていて欲しいものが多い。 それを毎回起動するのは面倒もある。

Unix的GUIツールを作る手頃な方法が無い。 現状はFSharp+photinoでシングルバイナリにしてhomebrewで配る、 という方式を取っているが、もうちょっとここもUnix的にならんものか。

適当なコンベンションに従ったhtml片を書くとこの手のツールが作れる、というツールを作れないか? >htmnixと名付ける。

既存の例

PowerShellのOut-GridViewは同じ特徴を持つ。

Out-GridView (Microsoft.PowerShell.Utility) - PowerShell - Microsoft Docs

percolもGUIツールと呼んで良いかは分からないけれど、同じように使える。mooz/percol: adds flavor of interactive filtering to the traditional pipe concept of UNIX shell

例題:てきすとでっきのアーカイブ機能

てきすとでっきには、古くなったメモのアーカイブ機能が無い。 現状はテキストエディタで別ファイルに手動で移動していて、こういう事が出来るのがてきすとでっきの良い所でもあるけれど、 GUIでポチポチ選んでアーカイブ、とやりたいという気持ちもある。

こういう時に、てきすとでっき自体に機能を追加してくのでは無く、この作業をする「Unix的GUIツール」を作れないだろうか?

てきすとでっきはプレーンテキストを空行で区切ったブロックとして扱う。 だからGUIとしてもブロックを複数選択してアーカイブ、とボタンを押したらアーカイブされて欲しい。

こうした事を行うUnix的GUIツールとはどうあるべきか?

ブロックを表示して選択する、というのは汎用的に思う。一方でブロックの定義は空行とは限らない気はする。 定義は行数のリストだとどうだろう?これならgrepなどで作る事が出来る。

出力はどうだろうか? やりたい事は選ばれたブロックを削除して、その内容は別ファイルに移動する、という感じになる。 そういうGUIツールは作れるけれど、ちょっと機能が複雑過ぎる気もする。

例えば選ばれたブロックの始めと終わりの行数を出力していく、とかならどうだろう?

ファイル名とブロックの開始と終わりの行数のタプルのリストがあった時に、やりたい事は簡単に出来るだろうか?

  • ファイル名と行数のリストから、そこだけを出力するコマンドを書く
  • ファイル名と行数のリストから、そこだけを削除した(そこ以外を出力する)コマンドを書く

この2つはまぁまぁ簡単に出来る気はする。

Unix的GUIツールにする、とは、

ブロックを選んで、選ばれたブロックを削除しつつ別のファイルに書き出す

という問題を、

ブロックを選んで、選ばれたブロックの行数を出力する

という問題とそれ以外の問題に分けて、前者をGUIツールとして解決する考え方。

作ってみた、htmnix

htmnixという名前のツールを作り、これでてきすとでっきのアーカイブ機能を実装してみた。 htmnix以外の部分は既存のてきすとでっきのコードをひっぺがして、nodeで処理するコマンドを作るという形で解決した。

nodeでの処理はいまいちで、適切な言語を使えばもっと短く簡単に書けるとは思ったが、既存のコードがあるのでまぁいいか、という結論。

htmnix自体は数時間で作れるような簡単なツールで、最初に作ったあとはほとんど修正が必要無かった。 開発時間のほとんどはその上のnodeやシェルクスクリプトの試行錯誤なので、 アーカイブ機能を持ったGUIの開発という問題を、ちょっとのGUIツールの開発と大多数の通常のUnixシェルスクリプトの開発という問題に分解出来た気がする。

関連リンク等