ノリックのIT生産性向上、ライフハック、プロマネのお仕事備忘録

IT系の仕事の事とか役立つツールとかプロジェクトマネジメントの事とかを記載していきます。

AutoHotKeyとripgrepとfzfとclipで辞書検索ツールを作って、最速人力リバースエンジニアリングツールに俺はなる。

 

 

苦戦中、でもそんなときは改善のチャンス!

 仕事で苦戦が続いている。20年前に誰が作ったかわからないソースコードの解析作業だ。ロジックの組み方が最悪だ。モジュール分割とか隠蔽化とか習ってなかったのか。永遠と一つの関数に処理が書かれる。コメントは殆ど無い。あってもどうでもいいコメントだ。

-- 間違いに気づいたので修正

 

変数名も最悪だ。

work_flag 

 

変数宣言を見ただけで先が思いやられる名前だ。働こうぜ!フラグか?働いたフラグか?どっちにしてもシステムの特性で労働を管理するシステムではないので働く意味ではないことは察している。追跡しなければならない。数百行下の方を見ると初期化処理があった。文字列のゼロを代入している。嫌な予感しかしないぜ。

work_flag='0' 

またしばらく数百行を読み込む。

オーマイガー!

work_flag='X'

なぜアルファベットのXを代入しているんだ。結局最後まで読み込んだが、

if work_flag = '0'   か if work_flag <> '0' 

でしか判定しなかった。だったら最初から数字の0か1にしてくれよと思うのだが、20年前の人にぼやいても仕方ない。ソースコードをハイライト表示すれば生産性が上がるかと思ったが、10連休明けの労働で生産性が落ちているとはいえ、激しく残業をしてしまった。社畜街道まっしぐらだ。

 

www.norick-matsumoto.com

 

  このままでは週明けからの仕事も負のスパイラルに陥ってしまう。なんとか改善策は無いものかと思ったのだが、私の担当しているシステムはとにかくテーブル名や列名が分かり辛い。そのせいかもしれないが、プログラム変数名も分かり辛い。特に区分やフラグがどんな値を取りうるのか、その意味は何かという事を一つづつ読み解いて行く必要がある。わかったものからテーブル定義書や、設計書のコメントとして

1:受注、2:キャンセル、3:出荷

 

って書いているのだが、読み進めていくうちに、あれ?この区分の1 ってさっき調べた時にメモったはずだけどどこだっけかと思い、テーブル定義書や別のプログラム設計書を開いて時間をロスしている。

!せや、急がば回れでまずは項目、区分フラグを整備した辞書を作ってそれを参照するるようにしよう!という当たり前なことなのだが、名案を思いついた。その段階で遅延はキャッチアップ出来るはずと思い金曜日は定時退社しつつ、どんな辞書ツールにするか思いを巡らせながら近所を散歩していたのである。

白鳥

白鳥のようになりたい

 白鳥だ。子供が可愛い。しかし美しい白鳥も水の下では激しく水かきをしているのである。そんな白鳥になりたいと思った。

項目辞書の構想

  1. いくら20年前とはいえ、元々はパッケージソフトだったのでパッケージにあるドキュメントからテキストファイルで項目辞書を作成する。これはエクセルマクロでなんとかなる。
  2. その項目辞書を高速なCドライブ(SSD)に配置しておく。
  3. よくわからない項目名(物理名)が出てきた時にショートカットでAutoHotKeyを呼び出し、項目名を入力する。
  4. AutoHotKeyから史上最速のGrepツールと評判のあるripgrepを呼び出し、入力した文字列で辞書を検索する。
  5. 多分複数ヒットするので最強のインタラクティブファジー検索ツールと評判のfzfで絞り込む。
  6. fzfで選択した行をfenrirのおまけで付いていたclipでクリップボードにコピーする。

うむ。良いのではないだろうか。

 

必要なツールのダウンロード

必要なツールをダウンロードしていない人は適宜ダウンロードしてほしい。後私の開発環境がWindows10 Pro であるのでそれに合わせたツールの作成になっている。

AutoHotKey

www.autohotkey.com

 

ripgrep

github.com

 

fzf

github.com

 

clip

hp.vector.co.jp

こちらの■ fenrir 0.75cをダウンロードしてdocs\omake.zipがあるのでそれを回答するclip.exeがあるのでそれをPathが通っているディレクトリに配置する。 

 

clip以外はchocolatery からインストールできるのでその方が簡単だ。

chocolatey.org

 

choco install autohotkey -y 
choco install ripgrep -y
choco install fzf -y

 

 動かした感じ

 AutoHotKeyで起動するからExcelとかで項目辞書を作るよりも軽い。検索も早いのではないかと期待しているが。

 


AutoHotKeyで項目辞書検索ツールをつくる

 

AutoHotKeyのプログラム

 ショートカットで起動できるので、自分がエクセルで作業していようが、メールしていようが、起動してサクッと検索できるのが良い。

;Ctrl + Shift + k(oumoku)で起動する#######################
^+k::
InputBox, OutputVar
Run, cmd /K rg -E sjis %OutputVar% C:\fenrir075c\data\path | fzf | nkf | clip

return

 

 今は自宅なので辞書のパスは会社で見直すのだが、辞書のテキストファイルを作るのが一番大変かもな。

 

文字化け対策 追記2019/05/16

 担当しているシステムのソースコードがSJISなのでripgrepはSJISのファイルを検索するオプションを付けていた。(-E sjis) ところがfzfに渡したときにコマンドプロンプトでは文字化けしていないのだが、クリップボードにコピーしたら日本語が文字化けをしていた。どうもfzfがUTF-8にしか対応してなさそう。なのでfzfにからclipにわたす前にnkfでSJISに変換する処理を噛ませたら文字化けしなくなった。

nkfのダウンロード、インストールについては以下の記事から。

www.atmarkit.co.jp

 

残課題、コマンドプロンプトが残ってしまうので毎回exitとタイプしないといけない。

→とりあえず下のスクリプトを別途作成した。Ctrl+Shift+Q(uit)でコマンドプロンプトにExitコマンドを送り込みEnterキーを押すスクリプトである。もうちょっとスマートに行きたかったが、用語のGrepができるようになってだいぶ調査もはかどるようになったぜ。

 

#IfWinActive ahk_class ConsoleWindowClass
^+q::
 sleep 500
 Send, exit{enter}
return
#IfWinActive 

 

辞書生成ツール

辞書ツールの作成方法は人それぞれの環境によって様々だろう。ここで示したのは渡しの場合の例であるので、マッチしない人はそれぞれ頑張ってほしい。

パッケージが持っているテーブル定義書はエクセルで作られていて最初に目次があり、テーブルごとにシートが別れている。各シートには行ごとに列の定義がされていて、その中に区分値の定義が書かれているので、すべてのシートを読み込んでマクロでテキストファイルに吐き出すことにした。

Sub createDictionary()
    

    Dim Ws As Worksheet
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim intFileNo As Integer
    
    Dim strFileName As String  '出力ファイル
    
    Dim strBuf As String
    
    
    i = ThisWorkbook.Sheets.Count
    
    strFileName = "C:\dict\dict_mst.txt"

    intFileNo = FreeFile
    'ファイル出力
    Open strFileName For Output As #intFileNo
    
    'シートの数だけ繰り返し
    For j = 2 To i
        Set Ws = ThisWorkbook.Sheets(j)
         k = 6
        Do While Ws.Cells(k, 1).Value <> ""
            strBuf = Ws.Name & "," & Trim(Ws.Cells(k, 1).Value) & "," & Trim(Ws.Cells(k, 2).Value) & "," & Trim(Ws.Cells(k, 3).Value) & "," & Trim(Ws.Cells(k, 4).Value) & "," & Trim(Ws.Cells(k, 5).Value) & "," & Trim(Ws.Cells(k, 6).Value) & "," & Trim(Ws.Cells(k, 7).Value) & "," & Trim(Ws.Cells(k, 8).Value) & "," & Trim(Ws.Cells(k, 9).Value)
            strBuf = Replace(strBuf, vbCrLf, "")
            Print #intFileNo, strBuf
            k = k + 1
        Loop
        
           
    Next
    
    Close intFileNo
    MsgBox ("終わり")
    

End Sub

 

 

最後に

AutoHotKeyが何かわかないという人や私のAutoHotKey愛を見たい方は以下を御覧ください。

 

www.norick-matsumoto.com