2022-11-20

F#でコマンドレットを書いてる pt.7

krymtkts/pocof の話。 プロパティ指定の検索に対応しようとしていて、今日のはその思考整理のようなもの。 Add a property support. · Issue #2 · krymtkts/pocof

実は? jasonmarcher/poco を使ってたときから今に至るまで、プロパティ指定の検索をあまりやってこなかった。 可能性は感じていて何なら使いたかったけど、プロパティをいちいち覚えて打つとかできなくて、使いこなせなかった。 なので pocof でそれを実装するからには、障壁を取り除いて簡単に使える機能にしたい。 そのため、まず pocof が機能に対応したと仮定してどんな風に使うか手を動かすイメージをして、そのあと今の pocof との差を表出させるようなことをしている。

このアプローチだけでも色々足りないものが見えてきて面白い。 pocof の時から今の pocof に至るまでの自分の使い方が非常に限定的だったのがよく分かる。 今の自分のユースケースの殆どは、文字列化されたオブジェクトに対して正規表現でフィルタできたら、それで済んでしまうのがわかった。Where-Object でフィルタするタイミングを、実行してデータがわかったその時まで遅延させる、そんな使い方しかしてない。 だから今の pocof はほんとにそれを満たすだけのミニマルさになってて、欲を言えばツールが使用者に違った視点を与えるとかのフィードバックするとか、そいういうモノがないんやなと改めて感じている。

例えば、 poco の頃にあったスペース区切りで複数の and filter できる機能は pocof にはない。自分が使ってこなかったから作ってなかった。 でもプロパティ指定の検索をするとしたら、これは絶対に使いたい。 1 つのプロパティで絞り込んだとて満足な結果を得られることはないだろう。なんならこれらの複数のプロパティの絞り込みは and だけじゃなくて or でも結合させたい場面が出てくるだろう。 他にも、いま正規表現で .+dir/*+.js とか書いてるのもスペース区切りで置き換えて dir js でできたらタイプ数も減って楽でいいよなとか。(正規表現は正規表現で使ったらいいけどほとんどはもっと少ないルールに従ってフィルタできるであろうから)。 こんな感じで、ある 1 つの使い方から芋づる的に派生していく。 確信はないけど、こういった派生が自分の普段の使い方に変化をもたらす気配がしてる。

とりあえずこの複数のフィルタは composite query と(若干中二病的に)名付けて Issue を起こした。Support composite query · Issue #9 · krymtkts/pocof やることのイメージが膨れ上がりそうやし、プロパティ指定の検索に必要な最低限を細かく刻んで機能を追加して、その後の成長はまた別に考えるのが良さそうかと考えている。

はじめに述べたプロパティ指定の検索も、この「普段の使い方に変化をもたらす」気配がしてる。 例えば、わたしは仕事が AWS のリソースを探るのによく使う AWS Tools for PowerShell 。 Cmdlet の出力をフィルタするのやプロパティの確認なんかで、何度か結果を出力したり変数に格納したり、ステップを踏むことが多い。 でもこれが pocof のインタラクティブな検索で試行錯誤できるようになれば、何度もコマンドを実行しなくても粘土をこねるみたいに try & error しやすくなったりしないかな?とか。 選択したプロパティが列になって検索結果に表示されることでわかりやすさが向上しそうだな、とか。

個人開発では主にゴミスクリプトしか書かないのもあって、改めて自分用のツールを育てる面白さがわかりだした。 個人的な嗜好として、あまり長く同じやり方を続けることを良しとしないのだけど、自分で自分のツールを開発するのってコレとめちゃくちゃ相性良いのでは?と最近思ったりしてる。


全然関係ないけど .NET 7 出たし、 pocof もさっさと乗り換えてしまのが良さそう(今 .NET 6)。 prerelease なので気兼ねなくやれる。 .NET 7 対応した PowerShell 7.3 かなり速くなった気がするのよな(気だけ?)。その恩恵にあやかりたい。