# テキスト差分 — 2つのテキストを並べて比較

2つのテキストを入れると、すべての違いが行単位・単語単位で印付きで出てきます。よそのサーバーに貼り付けるものは何もありません。

> 2つのテキストを比較して、すべての違いを行単位・単語単位で、左右に並べて、または1列で見ます。比較はブラウザの中で動き、アップロードは一切ありません。未公開のコードが手元の端末を離れることはありません。

これはhttps://abox.tools/ja/text-diff/にあるブラウザー用の対話型ツールです。ファイルはそのブラウザーを実行する端末上で処理します。意図した共有や任意の通信機能はページ内で説明します。以下は文章による説明です。利用するにはアドレスを開いてください。

## テキストは**ブラウザー内で処理**されます。処理のためのアップロードはありません。

比較は2つの文字列に対する計算で、このページの中で行われます。アルゴリズムはMyersのもの、つまり`git diff`が使っているのと同じもので、`src/diff.js`に手書きされていて、読むことができます。この道具にはどんなネットワーク機能もありません。取りに行く先も、送る先もありません。ここではそれが効いてきます。人が比較するものは契約書、設定ファイル、未公開のコードで、しかも必ず2つ一組だからです。

- ✗ アップロードなし
- ✗ 登録なし
- ✗ サイズ制限なし
- ✓ オフラインで動作
- ✓ ソース公開

## 2つのテキストをアップロードせずに比較する手順

1. **2つのテキストを貼り付けるか、ファイルを2つドロップします。** 元のものは左、変わったほうは右。選択欄に同時に落とした2つのファイルは、落とした順で左右に入ります。逆だったら、左右を入れ替えてください。
2. **読み方を選びます。** 左右に並べるか、1列か。スマートフォンは1列で始まります。並べて見るにはテキストの列が2本要りますが、スマートフォンにはだいたい1本分の幅しかないからです。どちらにしてもメニューはすぐそこにあります。
3. **どうでもいい違いは無視します。** 空白、大文字と小文字、空行。それぞれ別々に無視できるので、整形し直しただけのファイルが100個の変更のようには読めなくなります。既定では、変わっていない真ん中は数に畳まれ、各変更の前後3行だけが残ります。
4. **何が変わったかを読みます。** 削られた行は左側に、増えた行は右側に印が付き、変わった行の中では違う単語が強調されます。2つの段落の差分は、段落2つの丸ごとではなく、動いた単語を見せてくれます。
5. **パッチを持ち帰ります。** ダウンロードはunified形式の`.patch`で、コードレビューも`git apply`もあらゆる差分ビューアーも、期待しているのはこれです。コピーも同じものをクリップボードに入れます。

## 詳しい解説

[2つのJSONファイルを比較する方法](https://abox.tools/ja/guides/compare-two-json-files/): 両方のファイルを同じように整形し、キーを並べ替えてから比較します。生のJSON差分がほとんどノイズである理由、ブラウザで両側を正規形にする方法、そしてパッチまで生き残るもの。

## 箱の中のほかのツール

- [Base64エンコーダー・デコーダー](https://abox.tools/ja/base64/): Base64、パーセントエンコード、HTMLエンティティ、16進、バックスラッシュのエスケープを双方向で。よそのサーバーに貼り付けるものは何もありません。
- [テキストとファイルの共有](https://abox.tools/ja/share-text/): 共有はこの開いたタブの中だけに存在します。読む側は暗号化された内容をあなたのブラウザから直接受け取り、タブを閉じれば終わり。どのサーバーにも何も残りません。
- [QRコード・バーコード作成ツール](https://abox.tools/ja/qr-barcode/): 打ち込めば、そのままコードになります。作るために何かを送ることはありません。
- [QRコード・バーコード読み取りツール](https://abox.tools/ja/qr-barcode-reader/): コードにカメラを向けるか、写った画像を置いてください。読むのはここだけ、ほかのどこでもありません。

## よくある質問

### テキストはどこかにアップロードされますか？

いいえ。比較は、お使いのブラウザの中で、お手元のハードウェアで動く関数です。この道具にはどんなネットワーク機能もありません。何かを取りに行くことも、送ることもありません。ページの`Content-Security-Policy`には接続してよいアドレスがすべて書かれていて、そのどれもこのサイトのものではありません。契約書や設定ファイル、未公開のコードをここで扱う理由はそれです。そういうものを他人の差分ツールに貼り付けるのは、両方の版を一度に渡すのと同じことだからです。

### 比較は実際に何をしていますか？

左のテキストを右のテキストに変える、いちばん短い編集の組み合わせを見つけます。Myersのアルゴリズムで、`git diff`が使っているのと同じものです。いちばん短いことこそが差分を読みやすくします。途中に1行足したのなら、1件の挿入として出るべきで、それ以降の全行が変わったように見えてはいけません。変わった行の中では、違っている語にも印が付きます。段落を2つ比べたときに、段落まるごと2つではなく、動いた語が見えるのはそのためです。

### 貼り付けではなく、ファイル2つを比較できますか？

できます。2つとも同時に選択欄に落とせば、落とした順で左右に入ります。読むのはお使いのブラウザで、行き先はこのページだけです。順番を間違えたら、左右を入れ替えてください。

### 比較からは何が出てきますか。適用もできますか？

ダウンロードされるのはunified diff、つまり`@@ -3,5 +3,5 @@`の形式で、`git apply`も`patch`も、どのコードレビュー用の道具も読めます。コピーも同じものをクリップボードへ入れます。画面に出ているのはその表示で、左右に並べるか1列にするかを選べ、変わっていない部分は件数にまとめてたたまれます。すべて見たいときはそう指定してください。

### 空白や大文字小文字、空行を無視できますか？

できます。それぞれ別々にです。空白を無視すれば、整形し直しただけのファイルは変更なしとして比較されます。大文字小文字を無視すれば、`Error`と`error`は同じ単語として扱われます。空行を無視すれば、何も載っていない行は飛ばされます。そのとき結果の上のカウンターは、「無視するよう頼んだ違いを無視すれば2つは同じ」と言います。これは「同一」とは別の主張で、このページは2つの主張を混ぜません。

### どれくらい大きい比較まで扱えますか？

ここに上限は設けていません。その費用を払うサーバーが存在しないからです。2万行のテキスト2つに変更がひと握りなら、一瞬で比較が終わります。本当の仕事が始まる前に、共通の先頭と末尾を切り落とすからです。共通点がまったくない2つのテキストの比較は、当たり前のことを証明するのに1分かける代わりに、早めに打ち切ってその旨を伝えます。とても長い比較は、はじめの数千行を描き、残りはダウンロードしたパッチに任せます。

### 無料ですか。アカウントは必要ですか？

無料です。アカウントも、ログインも、試用期間もなく、貼り付けられる量にも制限はありません。このサイトには広告があり、それが費用を賄っています。広告にテキストの情報が渡されることはありません。

### オフラインでも動きますか？

動きます。ページを一度読み込んでから通信を切っても、そのまま使えます。何もアップロードされていないことを示す、いちばん簡単な方法でもあります。比較のためにテキストをどこかへ送っている道具なら、線を抜いた瞬間に止まるからです。

## この主張を確かめる方法

- **処理はこのブラウザー内で行います。** 入力と結果はブラウザー内で処理し、処理コードはそれらを処理用にアップロードしません。Content-Security-Policyは資源と接続先を制限しますが、許可済みの相手はリクエストを受け取れます。内容は検査せず、何も送られないことを単独で証明しません。具体的な操作の要求とソースを比較するか、切断中にローカル操作を完了してください。
- **ここからは何も取りに行きません。** `src/`のどこにも`fetch`も、`XMLHttpRequest`も、`sendBeacon`もありません。比較は、2つの文字列を受け取って何が変わったかを返す、このページの中の関数です。
- **アルゴリズムは標準のもので、全部読めます。** Myersの最短編集スクリプトのアルゴリズム、`git diff`が使っているのと同じものを、判断の理由をコメントに残しながら`src/diff.js`に手書きしています。`tests/js/text-diff.test.js`のテストは、削除が左のテキストを、挿入が右のテキストを組み立て直すことを証明します。差分にとって「正しい」とはそういう意味だからです。
- **Googleが読み込むものと、渡されないもの。** 広告と計測のスクリプトはGoogleから、寄付ボタンはBuy Me a Coffeeから来ています。そのどれにも、あなたのテキストは1文字も渡されません。テキストを読み、解析し、書き出すコードはすべてこのオリジンから配信され、リポジトリに載っています。
- **オフラインで動きます。** 通信を切ってもこの道具は何も変わりません。もともと通信する段階が存在しないからです。これがいちばん単純な証明です。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、そして`src/diff.js`を読んでください。Myersのアルゴリズム、変わった行の中を単語単位でもう一度なぞる処理、そして病的な比較がページを固めてしまわないようにする3つの安全装置がそこにあります。
