古いシステムを調査するときに、どうしてもソースコードを見る必要がある。
自分が好きなことをして生きていこう!苦手なことをするのはやめよう!(勝間和代)
わかるよ。はっきり言ってソースコード解析は私の得意分野ではない。だったら誰かに頼めるとよいのだが、そこは中小企業で働く身の辛さ。人手がない。
だったらしかたない。俺がやるしか無いじゃないか。
今までいくつかリバースエンジニアリングツールを試したが、個人ベースで気軽に使えるものってなかなかない。
A5M2はそんな中でもデータベースに特化してなかなかに使えるツールだ。テーブル定義書の作成やER図の作成をデータベースからリバースエンジニアリングしてくれる。
A5M2については以下の記事で紹介しているのでもしよかったら読んでください。
-
-
A5:SQL Mk-2 神ソフトデータベースツール
2019/09/05 追記 仕事がOracleを使ったパッケージ開発なんだけどデータベースを参照するのにMS-ACCESS使っている人が多い。10年近く使っているのがA5:SQL Mk-2(以下 A5 ...
続きを見る
でも問題はそれ以外のロジック。PL/SQL、VB.netのソース。これを一生懸命解析している。20年前に誰が作ったかわからないソースコード。
ロジックの組み方が最悪だ。モジュール分割とか隠蔽化とか習ってなかったのか。永遠と一つの関数に処理が書かれる。区分値の意味をテキストファイルにメモしながら解析をすすめる。
しかし、今度はそのテキストファイルが膨大な量になってきた。そこで自分でGrepツールを自作することにした。
項目辞書の構想
- いくら20年前とはいえ、元々はパッケージソフトだったのでパッケージにあるドキュメントからテキストファイルで項目辞書を作成する。これはエクセルマクロでなんとかなる。
- その項目辞書を高速なCドライブ(SSD)に配置しておく。
- よくわからない項目名(物理名)が出てきた時にショートカットでAutoHotKeyを呼び出し、項目名を入力する。
- AutoHotKeyから史上最速のGrepツールと評判のあるripgrepを呼び出し、入力した文字列で辞書を検索する。
- 多分複数ヒットするので最強のインタラクティブファジー検索ツールと評判のfzfで絞り込む。
- fzfで選択した行をfenrirのおまけで付いていたclipでクリップボードにコピーする。
うむ。良いのではないだろうか。
必要なツールのダウンロード
必要なツールをダウンロードしていない人は適宜ダウンロードしてほしい。あと私の開発環境がWindows10 Proであるのでそれに合わせたツールの作成になっている。
AutoHotKey
ripgrep
fzf
clip
こちらの■ fenrir 0.75cをダウンロードしてdocs\omake.zipがあるのでそれを回答するclip.exeがあるのでそれをPathが通っているディレクトリに配置する。
clip以外はchocolatery からインストールできるのでその方が簡単だ。
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のダウンロード、インストールについては以下の記事から。
残課題、コマンドプロンプトが残ってしまうので毎回exitとタイプしないといけない。
→とりあえず下のスクリプトを別途作成した。Ctrl+Shift+Q(uit)でコマンドプロンプトにExitコマンドを送り込みEnterキーを押すスクリプトである。もうちょっとスマートに行きたかったが、用語のGrepができるようになってだいぶ調査もはかどるようになったぜ。
#IfWinActive ahk_class ConsoleWindowClass ^+q:: sleep 500 IME_SET(0) ;IMEをOFFに 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
どうせなら辞書登録ツールも作っておく
カスタマイズしている箇所でちょっとしたメモを残しておきたいときがある。そういうときにはその時に作っている機能仕様書だったり、テスト設計書に備忘録を書いておくんだけど、後でそのメモをどこに書いたか思い出す事が出来なくてまた調べるという時間のムダをしてしまうときがある。
だから調べた内容を辞書検索ツールがGrepするところにテキストファイルを作っておいておくだけのメモツールだが、それも合わせると更に生産性が上がった。
;辞書にメモを入力 ^+m:: InputBox, OutputVar FileAppend ,%OutputVar%`n ,c:\dict\mydict.txt, CP932 Return
まとめ
自分がよく参照するものをテキストファイルにして打ち込んでおけば後で簡単に検索できるようになった。
パッケージソフトを扱っているのでバージョンごとにGrepするフォルダを切り替えられると更に良くなりそうだ。
Autohotkeyがなにかよくわからないという方は以下を御覧ください。
-
-
AutoHotKeyでF1キーを無効にする~F1とイルカ~
私がシステムエンジニアとして仕事を初めた1998年。当時のマイクロソフトOFFICEにはF1キーでヘルプ画面を出そうとするとイルカが出現。そのために当時の低スペックなパソコンはハードディ ...
続きを見る