ヘルプシステムで正規表現を使う
2019/10/18
増井俊之
慶應SFC / Nota Inc.
概要
正規表現を「展開」してヘルプシステムに使う
「展開ヘルプ」
ヘルプシステムの憂鬱
情報がみつからないので誰も使わない
https://gyazo.com/efc1f5968418a0cc86e5da62a34d1567
「Vocabulary problem」
https://gyazo.com/054f6057e71b7135a4871cb62610a68f
何かを表現するとき思いうかべる単語は人によって相当違う
同じ単語を思いうかべる確率は1/8
だから無限に表現を用意しておかなければならない
Generate & Filter
データを網羅的に生成し、それをフィルタリングすることで答を得る
c.f. Generate & Test
あらゆるQueenのパタンをリストして8-Queenを解くとか
全部の並びを全部出力してからgrepしてポーカーの役を数えるとか
re_expand
正規表現展開ライブラリ (gem, npm)
code:test.sh
% cat test.rb
require 're_expand'
"(a|b)*".expand { |s,a|
puts s
}
% ruby test.rb
a
b
aa
ab
ba
bb
aaa
...
展開アルゴリズム
教科書的に状態を生成してbreadth-first的に生成
効率わるし
展開ヘルプ
https://gyazo.com/b1e3cd189c7f183c203c75ff0c48c529 http://www.pitecan.com/papers/Interaction2012/ExpandHelp.pdf
ユーザが質問しそうなあらゆるテキストを正規表現から生成して、ユーザの質問でフィルタリングする
ヘルプ検索結果をすぐ実行できる
曖昧検索実行可能
ヘルプエントリと実行コマンドの表現
ヘルプエントリの正規表現
(時計|時刻)を(1?[0-9])時に(設定|セット)する
実行コマンドの表現
setdate {$2}:00
Macでの実行
MacRuby (RubyMotion) で実装
https://gyazo.com/8020a4a08f2ef72eafd21d6074385c0d
Macでの実行
https://gyazo.com/8fcdebb4b4d6de2de55ad0a893b3cb23
曖昧検索
https://gyazo.com/db956b3f16611687456a2cbdbf12d320
曖昧検索
abcaに対するマッチング
http://gyazo.com/33d3ba9323939d1f9426a25d24184078.png
曖昧検索
https://gyazo.com/1a1203c2f1ee29415c1ea55c54fc9d9d
GitHelp
難しいGitコマンドを実行できる
データベースはScrapbox上に書く
記述例
$ 現在の「(#{files})」ファイルを(#{numbers})日前のものを(比較する|比べる)
% git diff HEAD '@{#{$2} days ago}' #{$1}
展開されたテキスト
現在の「Makefile」ファイルを3日前のものを比較する
現在の「test.c」ファイルを3日前のものを比べる
...
数字パラメタ
コマンドラインに数字があれば{#numbers}を置換
code:numbers.rb
def numbers(argv=ARGV)
a = []
argv.each { |arg|
if arg =~ /^(\d+)^\d*$/ then a << $1
end
}
a.length > 0 ? a.join("|") : '1'
end
記述例
$ (#{numbers})時間前(から|以降に)(#{modified})ファイルをリストする
% git diff --name-only '@{#{$1} hours ago}'
記述例
$ (#{params})という文字列がはじめて出現した(バージョン|コミット)の情報を(#{display})
% git log -1 git rev-list --all | xargs git grep '#{$1}' | tail -1 | ruby -e "STDIN.each {|line| puts line0..39 }" シソーラス
code:glossary.rb
def delete; "消す|消去する|削除する"; end
def display; "表示する|見る|リストする"; end
def change; "変更|修正|編集"; end
def modified; "(#{change})(された|があった)"; end
IME的動作 (Node版)
https://www.youtube.com/watch?v=B4RQHHS3-cs
デモ: GitHelp (Ruby版)
Helpfeel
https://gyazo.com/05ddaef205470d84377ae4e8dec8728b
Scrapboxのデータベースにヘルプを正規表現で記述
実行部分は使わない
ヘルプページを見せるだけ
Demo: Helpfeel
https://gyazo.com/316fcf09f837281b8fc3c2a27f13820e https://helpfeelapp.com/SFCHelp/
Helpfeelデータ例
おまけ: GitHelp論文投稿
あっさりリジェクト
誰もGitなんか使ってなかったことが敗因か