HeaderLogo
← Works一覧に戻る

差分ツール作成

差分ツール作成

概要

大手証券会社の業務において、確認作業を効率化するため、Pythonを用いた自動化ツールを開発しました。差分箇所のスクリーンショット撮影からExcelへのまとめ作業までを完全自動化し、手作業による業務工数を大幅に短縮化しました。

使用技術

pythonvscodewinmergegit

詳細

差分作成ツールを自作しました!

以上の画像のように、ソースコードの差分を再帰的に見つけ、エクセルのシートに自動的に作成されるようになっています。

目次付きです。

作ろうと思ったきっかけ

「やってられるかー!!!」私は思いました。

日々の業務の中で、差分のエビデンスを作成して提出する業務が何回か発生していました。

しかし、そのやり方はかなり人海戦術でした。


1.WinMergeで差分を確認する。

2.ソースコードが長いと、スクリーンショット1枚に収まらないのでレポート作成機能からHTMLファイルを生成する。

3.拡張機能のFireshotでスクリーンショットを撮影する。

4.Excelに張り付けてファイル名をシート名にする。

この4ステップをやる必要がありました。確かに2.3個のファイルやフォルダ―ならば、大した時間にはなりませんがこの差分が何百個

という件数があるため、この一連の流れをスムーズにできたとして、1ファイル3分ぐらいはかかります。

200個あればおよそ、10時間かかる計算になります。

しかもこれは、一回のミスもなく休憩もしない最高速度で稼働した理論値となります。なのでバッファをとっても3人日ぐらいの工数をとっていました。

このような単純作業は苦手です。しかも私は、こういう作業になるとミスを多発するという性質があることをしっています。

なので何とかしてオートメーション化できないか頭をひねることにしました。

技術選定

やはりOSやExcelなどをいじくるのに相性がいいのはPythonです。

Pythonは「スクリプト言語」ならではの身軽さで、Javaのようにコンパイルや面倒な環境構築(ビルドツールの設定など)を必要とせず、書いてすぐに実行・テストができるフットワークの軽さは、手作業をサクッと自動化したいシーンに最適です。

それに今回は画像処理とか自動化をしたい場合は、強力なライブラリが存在します。

大規模で堅牢なバックエンドシステムを構築するなら型の厳格なJavaの強みが活きますが、今回のように「日常の面倒な作業を、画像判定なども交えつつスピーディーに自動化・短縮化する」という目的においては、Pythonの記述の短さとライブラリの豊富さがベストマッチします。

必要になるなぁと思ったのは以下です。

wkhtmltoimage.exe

wkhtmltoimage.exe は、HTML を画像(JPG/PNG など)に変換する Windows 用のプログラムです。

difflib

difflib(ディフリブ)は、2つのテキストやファイルの内容を比較して「どこが変わったか(差分)」を見つけ出してくれる、Pythonの標準ライブラリです。 今回のツールでは、変更前と変更後のソースコードを比較し、「どの行が追加・削除されたか」が一目でわかる色付きのHTMLデータを自動生成するために活躍しています。Pythonに最初から組み込まれているため、面倒なインストール不要ですぐに使えるのも優秀なポイントです。

imgkit

imgkit(イメージキット)は、HTMLファイルを画像(JPGやPNGなど)に変換するためのPythonライブラリです。 このライブラリ単体で動くわけではなく、先ほど紹介した wkhtmltoimage.exe をPythonのコード上から操縦するための「リモコン」のような役割を果たします。difflib で作った差分のHTMLをこの imgkit に渡すことで、ブラウザを開くことなく綺麗なスクリーンショット画像を裏側で作り出しています。

openpyxl

エクセル操作に使ったライブラリ(pandas, xlwingsなど)に名前を変えてください openpyxl は、PythonでExcelファイル(.xlsx)を操作するためのライブラリです。 今回のツールにおける最終工程である「シートを新規作成し、そこに生成した差分のスクリーンショット画像を貼り付ける」という自動化作業を担っています。手作業でペタペタと画像をエクセルに貼る苦痛な作業から解放してくれた立役者です。

処理の流れ

具体的には、以下のようなステップでプログラムが動いています。

1. 差分データの生成 変更前と変更後のソースコードを読み込み、difflibを使って差分を抽出。「どこが変わったか」が色付きで分かるHTMLファイルを裏側で生成します。

2. スクリーンショットの自動撮影(画像化) 生成した差分のHTMLを、imgkit(裏側で wkhtmltoimage.exe が稼働)に渡してJPG画像に変換します。これが手作業でやっていたスクショ撮影の代わりになります。

なので今回はWinMergeは使用しません。

3. Excelへの自動貼り付け openpyxlを使って指定のExcelファイルを開き、処理中のファイル名で新しいシートを作成。そこに先ほど生成した画像をペタッと貼り付けます。

4. 全ファイル自動ループ あとは、フォルダ内にある何百というファイルに対して、1〜3の工程をプログラムが自動で繰り返してくれます。人間がコーヒーを飲んでいる間に、完璧なエビデンスExcelが完成するという仕組みです!

苦労したところ

デフォルトの設定のままだと、pngとして保存されるのでファイルサイズがとんでもなく大きくなってしまう。

なのでconfigを引数にとる。

config = imgkit.config(wkhtmltoimage=WKHTMLTOIMAGE_PATH)

options = {
    'format': 'jpg',
    'quality': 85,
    'width': 2000,
    'encoding': 'UTF-8',
    'quiet': ''
}

こんな感じでクオリティを少し下げて、画像が物理的に大きすぎると横スクロールが発生して見づらいので、Widthは2000というところで設定している。

ほかにも、フォルダとファイルをごちゃまぜにしてもファイルの時はそのまま差分比較して、フォルダだったら再帰的にぐるぐる差分を確認するようにしたのもプラスで頑張ったところです。

結果と学び

結局なにをどのように探索したのかも視覚化したかったので、ターミナルに実際にスキャンしたものをずらーっと出力するような機能も追加しました。

このツールをつくってから、目次付きの差分エビデンスがぽちっとEnterキーですべてをやってくれるのは非常に費用対効果がよいと感じました。精神衛生上も。

そして、3人日かかっていた作業が1分でおわるようになりました。

一瞬で終わるぞー!やったー!


本件を通じた最大の学びは、「客観的な視点の重要性」です。 IT企業であっても、日々の業務に追われる中で非効率な手順が定着・属人化しているケースは少なくありません。そこに外部のエンジニアとして参画したことで、既存の枠組みにとらわれず、フラットな視点で課題を発見し、改善を実行することができました。

ただコードを書く技術力だけでなく、「第三者の視点で組織の当たり前を疑い、最適化する」という自身の強みを大いに活かせた経験になったと感じています。


github: https://github.com/marufoy/diff_to_excel