Diff · macOS

クラウドに上げない。手元で、速い。違うか、どこが。

社外に出せない画像、1,000万行のログ、契約書のPDF。どれも同じコマンドで、手元のマシンだけで、違うか・どこがを答えます。URLを渡さない限り、1バイトも外に出ません。

brew install mr-tabata/tap/mrdiff

ずっと無料・CLI / $29 買い切り・1ライセンスで最大2台

$ mrdiff app-09-12.log app-09-13.log
# 780 MB, 10,000,000 lines — 0.7 s
2 changed, 0 added, 0 removed
4999997   - 09:08:19 INFO  GET /api/items/3523 status=200
4999997 + 09:08:19 INFO  GET /api/items/3523 status=500

$ mrdiff before.png after.png
Images differ — 12,481 of 390,000 pixels (3.2%)

機能

画像:違うか、画素の何割か、最初はどこか

PNG・JPEG・HEIC・WebP・TIFF・PSD・カメラのRAWまで、OSのImageIOが読める形式を比べます。画素を数えるので、1画素の違いが「0.0%」に丸まりません。--toleranceで小さなずれを同じとみなすと、出力にそう書きます。

$ mrdiff before.png after.png
Images differ — 12,481 of 390,000 pixels (3.2%)
First difference at (412, 88)
largest per-channel gap: 41 — --tolerance=41 would call these the same

PDF:どのページの、紙の上のどこか

画素ではなくmmで答えます。ページごとに描いて比べるので、1語直しただけでファイル全体が組み直されても、校正で知りたい答えが出ます。--textを付けると、どの行の文言が変わったかが出ます。

$ mrdiff proof-v1.pdf proof-v2.pdf
PDFs differ — 1 of 12 pages
p.7  2 regions
     top 107 mm, left 25 mm, 71 × 14 mm
     top 205 mm, left 106 mm, 21 × 21 mm

バイナリ:違う箇所の数と、最初のオフセット

隣り合うバイトは1箇所と数えます。長さが違えば共通部分だけを比べ、余りは余りとして言うので、1バイトの挿入が「以降ぜんぶ違う」にはなりません。

$ mrdiff firmware-v1.bin firmware-v2.bin
Binary files differ — 47 regions, first at 0x1A3F
158 of 2,000,000 bytes differ

JSONとYAML:行ではなく、データとして

どのキー・値・配列要素が変わったかを、値つきで言います。キーの並び替えは数えず、配列の途中への挿入が後ろ全部のノイズにもなりません。

$ mrdiff config.json config-new.json
1 changed, 2 added, 0 removed
+ extra: "new"
+ items[3]: 4
~ version: "1.0" → "1.1"

公開中のサイトは、元のフォルダと合っている?

--siteは、gitで管理されているファイルを1つずつサイトから取ってきて、違うもの、サイトに無いものを言います。「デプロイし忘れてない?」がCIのチェックになります。

$ mrdiff --site https://example.com ./site
changed   index.html
not on site   pricing.html
1 changed, 1 not deployed, 0 could not be checked

SSH越しに、サーバと両方向で

--sshはツリー全体を両方向で比べます。サーバにあってリポジトリに無いファイル(古い書き出し、忘れたバックアップ)まで出ます。認証は手元のsshのもので、パスワードは聞きません。

$ mrdiff --ssh ./site deploy@host:/var/www
changed   config/app.yml
only local (not deployed)   pages/new.html
only on remote (left over?)   backups/customers.sql
1 changed, 1 only local, 1 only on remote
Pro

バイトを、左右に並べて見る

2つのファイルを16進数と文字表示で左右に並べ、違うバイトを強調します。差分一覧から該当箇所へ飛べ、1行の表示は8・16・32バイトから選べます。

2つのバイナリファイルを16進で左右に並べて比較するMrkDiff Hex。違うバイトが強調され、右に差分一覧がある
Pro

変わった行から、変わった文字まで

テキストは左右2画面で比較し、行の中で変わった範囲も強調します。選んだ差分は、左右どちらかへ適用できます(3-way mergeではありません)。

2つの設定ファイルをテキストで比較する画面。変わった行と、行の中の変わった文字が強調される
Pro

画像は、並べても、重ねても

2つの画像を、並べる・透かして重ねる・左右にスライドして見比べるの3通りで比較します。違う画素には印が付き、しきい値で小さなずれは無視できます。差分一覧には、位置・大きさ・画素数が並びます。

2つの画像を左右に並べて比較する画面。違う画素に印が付き、右に差分の位置と画素数の一覧がある

フォルダ・アーカイブ・Word・フォント

フォルダ2つはどのファイルが違うか、zip/xlsx/pptx/EPUBは展開せずに中のどのファイルが違うか、Wordは段落、フォントは字形の違いを答えます。

Terraform・SQLite

state/planは1つの大きなJSONではなく資源の単位で比べ、秘密の値は「変わった」とだけ言います。SQLiteはスキーマ(テーブル・列・索引)を比べます。

パイプラインに置く前提

--exit-codeは違えば1で終わり、--jsonは機械向けで訳しません。スクリーンショットの回帰や、生成物が変わったかの確認に使えます。

MrDiffは、1つのコマンドでどの種類でも

どの比較を走らせるかは、拡張子ではなく中身で決めます。無料のMrDiffに、すべて入っています(MITライセンス)。

ファイル

  • テキストとソース(文字単位のハイライト)
  • JSON・YAML(構造の差分)
  • 画像(ImageIOが読める形式すべて)
  • PDF(ページと位置をmmで)
  • バイナリ(領域の数と最初のオフセット)

場所

  • URL2つ(両方を取ってきて比べる)
  • クリップボード vs ファイル/URL
  • 公開中のサイトと元のgitフォルダ
  • 手元のディレクトリとSSH越しのサーバ
  • フォルダ2つ

中身を開いて

  • アーカイブ(zip・xlsx・pptx・EPUB・Sketch)
  • Word文書(段落ごと)
  • フォント(OTF・TTF・TTC、字形ごと)
  • Terraformのstate・plan(秘密は伏せる)
  • SQLiteのスキーマ

道具として

  • 違えば終了コード1(--exit-code)
  • 機械向けの--json
  • 出力は英語。MRDIFF_LANG=jaで日本語
  • シェル補完(bash・zsh・fish)
  • アカウントもテレメトリも無し

価格

MrDiff

違うか、どこが。

無料

ずっと無料・CLI

MITライセンス · ソースはGitHub

  • テキスト・JSON・YAML・画像・PDF・バイナリ
  • URL・サイト・SSH・フォルダ・アーカイブ
  • Word・フォント・Terraform・SQLite
  • 手元で完結、1,000万行のログで0.7秒
  • パイプライン向けの終了コードと--json
  • Homebrewでインストール
MrDiff をダウンロード

MrDiff と MrkDiff Hex の違い

MrDiffMrkDiff Hex
テキスト・JSON・YAMLの差分✓✓
画像・PDFの差分✓✓
バイナリの差分(要約)✓✓
URL・サイト・SSH・フォルダ・アーカイブ✓—
ターミナルで使える(パイプ・CI)✓—
Macアプリ(ウィンドウで見る)—✓
バイナリを16進で左右に並べる—✓
テキストの2画面比較・差分の適用—✓
画像の重ね合わせ—✓
価格無料$29 買い切り

まずは無料のMrDiffから。

brew install mr-tabata/tap/mrdiff