Show HN:OmniDiff – Rust で実装されたオープンソースで超高速なコンテキスト認識型 Git 比較ツール

2026/11/01 22:02

Show HN:OmniDiff – Rust で実装されたオープンソースで超高速なコンテキスト認識型 Git 比較ツール

RSS: https://news.ycombinator.com/rss

要約▶

日本語翻訳:

OmniDiff は、画像、フォント、アーカイブ、PDF などコードおよび非テキストファイルも堅牢に処理できる高速なコンテントウェアアウェアな差分ツールです。樹形座標器(tree-sitter)文法による構造化パースを介して C、C++、Go、Rust、Python、JavaScript、TypeScript といった 25 語以上に対応し、バイナリ形式に対してはピクセルレベルの解析を行います。標準ハードウェア(通常 p50 は 4.2ms)での中位パフォーマンスは 100ms 未満を実現します。正確性テストでは主要な全テストケースでゼロバイトの不一致が確認され、パフォーマンスも目標を一貫して満たしています(テストされたハードウェアでの p99 は約 177ms)。ユーザーはプレビルトバイナリまたはソースからインストールでき、主要なパッケージマネージャー(Homebrew、Debian/Ubuntu apt、Nix、Arch、Gentoo)、Git、および

jj
と統合されます。また、VS Code(将来的な API アップデート後にインタラクティブな差分がサポート予定)と Neovim にも対応しています。本プロジェクトは AGPLv3 ライセンスですが、ソースコードの開示を回避する必要がある組織向けに商業サブスクリプションも提供します。今後のアップデートでは VS Code との統合をさらに拡大する予定です。

本文

OmniDiff:高速・堅牢かつ正確な差異検出ツール

OmniDiff は、99.95% のコード変更を検出できる高品質な内容認識型の差異検出ツールです。

基本特性

  • 高速: 100ms 未満で完了(中位値)
  • 堅牢: コードの変更の 99.95% を検出可能
  • 正確:
    • 変更箇所の 98.8% は、内容特化アルゴリズムを使用して検出されます。
    • PDF などでは完全一致/ほぼ完全一致を達成しています。

対応対象と性能(概算)

カテゴリ速度 (相対値)正確性堅牢性
コード98%70%92%
画像96%69%91%
カーソル100%85%100%
フォント95%82%100%
アーカイブ88%87%87%
メッセージカタログ100%83%83%
PDF57%100%100%

※測定環境: 32GB RAM搭載の T14s (Intel Core i7-1370P) 上で実施。(詳細はリポジトリ参照) ※注意: PDF の判定テストケース数は 10 件未満です。

インストール方法

ソースコードからビルド

C コンパイラと Rust ツールチェーン (

rustc
1.92 以降) が必要です。

cargo install --locked omnidiff
  • 初回ビルド: tree-sitter グラムマタの C コンパイルと LTO の脂肪リリースプロファイル処理により数分かかります。

プリビルトバイナリ

Linux、macOS (Intel/Apple Silicon)、Windows 用は GitHub リリース に添付されています。

Homebrew (macOS/Linux)

brew install ivankovic/omnidiff/omnidiff

Debian と Ubuntu

.deb
パッケージは署名済みの apt リポジトリから入手可能です。

# キーリング登録
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://ivankovic.github.io/omnidiff/apt/omnidiff-archive-keyring.gpg \
  | sudo tee /etc/apt/keyrings/omnidiff-archive-keyring.gpg > /dev/null

# リポジトリ追加
echo "deb [signed-by=/etc/apt/keyrings/omnidiff-archive-keyring.gpg] \
https://ivankovic.github.io/omnidiff/apt stable main" \
  | sudo tee /etc/apt/sources.list.d/omnidiff.list > /dev/null

# インストール
sudo apt update && sudo apt install omnidiff

Nix および NixOS

nix run github:ivankovic/omnidiff
  • ** flakes 有効化が必要な場合**:
    --extra-experimental-features 'nix-command flakes'
    を追加してください。

Arch と Gentoo

  • packaging/
    ディレクトリにレシピあり。
  • Arch:
    PKGBUILD
    で
    makepkg -si
    。
  • Gentoo: ebuild は Overlay 即用。
  • 注意: 両者のパッケージ受入れサイクルは不規則です。

エディタとの連携

VS Code

  • 拡張機能名:
    omnidiff-vscode
  • インストールコマンド:
    code --install-extension ivankovic.omnidiff
  • Open VSX (VSCodium, Cursor, Windsurf 対応) でも利用可能。
  • 注: 埋め込みの差分表示ビューを置換する機能は未提供(上流プロジェクト開発中)。

Neovim

  • プラグイン名:
    omnidiff.nvim

コマンドラインでの使い方

インタラクティブ TUI(ターミナルユーザーインターフェース)

# 空のビューアを開く(o を押してファイル指定)
omnidiff 

# 2 つのファイルを直接差分表示
omnidiff BEFORE AFTER
  • キーボード操作:
    ?
    で一覧を表示。
  • カラー:
    COLORTERM=truecolor
    の場合、24 ビットカラーを使用(デフォルト)。

ブラウザ上での使用

  • コマンド:
    codereview
    • 注意: 現在 v0.0.0 ベータ版です。ご自身の責任で使用してください。

Headless モード / バッチ処理

omnidiff --headless BEFORE AFTER
# または
omnidiff --batch BEFORE AFTER
  • 機能: TUI を開かず、差分をプレーンテキストで出力(スクリプト・CI向け)。
  • 自動発動: 標準出力がターミナルでない場合(
    | less
    やファイルリダイレクト)は自動的に発動。
  • 折りたたみ: デフォルトでは変更の両側にコンテキスト 3 行を表示(
    --context N
    で変更可能)。大きなファイル内の関数定義などをプレフィックスに追加。
  • カラー制御:
    • デフォルト:カラー有効
    • ANSI カラー無効:
      --color never
      または環境変数
      NO_COLOR=1

終了コード

  • 成功 (0): 正常終了
  • エラー (2): エラー発生
  • ファイル違い (1):
    • デフォルトでは 0 を返す(バージョン管理システムとの親和性のため)。
    • スクリプト用途で「違いを検知」したい場合:
      --exit-code
      フラグを指定。

JSON 出力

omnidiff --mode json BEFORE AFTER
  • 差分を 1 つの JSON オブジェクトとして出力(スキーマは
    src/tui/json_output.schema.json
    )。

Git との連携

OmniDiff は

git difftool
のバックエンドとして動作します。

構成設定 (手動)

# コマンド登録
git config difftool.omnidiff.cmd 'omnidiff "$LOCAL" "$REMOTE"'

# 使用開始
git difftool --tool=omnidiff

# デフォルトツールの指定
git config diff.tool omnidiff 

# プロンプト無効化(確認ダイアログを抑制)
git config difftool.prompt false

Git 動作の補足

  • git difftool
    : インタラクティブ TUI を開く。
  • git diff
    /
    git log -p
    : インタラクティブ TUI を開かず、TUI は非互換なパイプ出力となるためプレーンテキストフォールバック(Headless モード)へ。
    • インタラクティブ利用には必ず
      git difftool
      を使用してください。
  • 外部差分ツールとして:
    GIT_EXTERNAL_DIFF=omnidiff git diff
    

Jujutsu (jj) との連携

jj
は独自の設定が必要です。

# 登録とデフォルト設定
jj config set --user merge-tools.omnidiff.program omnidiff
jj config set --user merge-tools.omnidiff.diff-args '["$left","$right"]'
jj config set --user merge-tools.omnidiff.diff-invocation-mode file-by-file

# デフォルトフォーマッターへ
jj config set --user ui.diff-formatter omnidiff
  • diff-invocation-mode = "file-by-file"
    は必須です(ファイルごとの処理のため)。
  • 全画面 TUI:
    jj diff
    のみ非インタラクティブテキスト表示。
    jj difftool
    相当の機能はありません。

対応するコンテンツ

構造的言語 (tree-sitter グラムマタ)

以下 25 の言語は構造的に解析され、高精度な差分検出が行われます:

カテゴリファイル拡張子
C
.c
,
.h
C#
.cs
C++
.cc
,
.cpp
,
.cxx
,
.hpp
,
.hh
,
.hxx
CSS
.css
,
.scss
Go
.go
HTML
.html
,
.htm
Java
.java
JavaScript
.js
,
.mjs
,
.cjs
,
.jsx
JSON
.json
Kotlin
.kt
Lua
.lua
Perl
.pl
,
.pm
PHP
.php
Python
.py
,
.pyi
,
.pyw
R
.r
Ruby
.rb
Rust
.rs
Scala
.scala
Shell
.bash
,
.sh
Swift
.swift
TSX
.tsx
TypeScript
.ts
,
.mts
,
.cts
Vimscript
.vim
XML
.xml
,
.xht
,
.svg
,
.plist
など多数 (詳細はドキュメント参照)
YAML
.yaml
,
.yml

※グラマタ未使用の言語: Bazel, Dart, Emacs Lisp, Markdown, Protocol Buffers, SQL などは拡張子から認識されますが、構造的差分ではなくテキストベースで検出されます。

バイナリコンテンツ

ファイル名ではなく内容に基づいて差異を判定します。

コンテンツフォーマット検出方式
画像PNG, JPEG, GIF, WebP, BMP, ICO, TIFFピクセル単位(アニメーションはフレームごと)
アーカイブZIP, TAR, GZ, XZ など、JAR/Office 含むファイルごと・中身ベース
フォントTTF, OTF, WOFF, EOT などグリフ単位(フォント名・メトリクス含む)
カーソルCUR, ANI, X cursors, HLCサイズ・フレームごと
メッセージカタログMO, QMメッセージごと
PDFPDFページごと(各ページを描画して比較)

変更の分類

  • 不可視: バイトのみが異なっている。
  • 不可知: コンテンツの意味が不明確な変更。
  • アーティファクト: 圧縮や再サンプリングによる変化。
  • 編集済み / 再描画 / 置換: テキスト、空白、書式化などの具体的な変更。

画像表示について: TUI 内では

kitty
,
sixel
,
iterm2
プロトコルに対応します。Unicode ハーフブロックと全角ブロックの切り替えは
b
キーまたは
OMNIDIFF_GRAPHICS=halfblocks
で制御可能です。

ライセンス

  • GPL-3.0+ (AGPL): 自由ソフトウェア。ソースコード公開義務あり。
  • 商業ライセンス: GitHub Sponsors 経由で月額サブスクリプション提供可能(内部利用向け、ソース公開義務なし)。詳細は
    LICENSE-COMMERCIAL
    を参照。

開発ガイドラインとポリシー

AI ポリシー

  • 現在、Claude Code の大幅な AI アシスタンスを受けています。
  • コミット履歴には事実を隠さず Co-Authored-By とリンクを含みます。
  • AI 支援によるコントリビューションも同等に歓迎されますが、理解とサポートの責任は提出者にあります。

パフォーマンス目標(達成済み)

  • 速度: メジアン(p50)100ms、90% 分位(p90)1000ms を目標達成。
    • コード測定結果: p50=4.2ms, p90=35.1ms, p99=177ms。

堅牢性の測定結果

  • コード: 約 44 万ペアのうち 99.95% (442,322 ペア) が正常終了。
    • 失敗要因:予算超過(96 ペア)、メモリ制限超過(112 ペア)。
  • 多様コンテンツ: テキスト・コンテンツを含め全体の 98.8% を検出可能。

正確性の測定結果

  • コード: 0 バイト不一致のテストケース 90%, 最大 1% 不一致のテストケース 99%.
    • 全体コーパスでの不一致は 0.14%(
      --full
      モード)、0.07%(
      --minimal
      モード)まで改善。
  • 多様コンテンツ:
    • 画像:ほぼ完全一致 91%
    • カーソル:完全一致 100%

貢献者向け情報

詳細は

CONTRIBUTING.md
および AI エージェント用の
AGENTS.md
を参照してください。

同じ日のほかのニュース

一覧に戻る →

2026/11/02 0:58

Show HN: HackerBooks – ハッカートビューのように、HN で言及された本のためのサービス

## Japanese Translation: このテキストは、マウス使用よりも効率を優先したアプリケーション内でのキーボードナビゲーションの習得に必要な手順を提供しています。核心的なメッセージは、特定のキーが本間の移動や異なるコンテンツビューへの瞬時のアクセスを可能にする直接コマンドとして機能することです。例えば、`/` を入力するとフォーカス検索バーが有効化され、`j` または `k` を押すことで家(Home)行から手を離さずにリスト内で縦方向に移動できます。`Enter` を押すとフォーカスされた本が開かれ、`Esc` はウィンドウを閉じたり前の画面に戻ったりします。また、`g` の組み合わせ(例:`g h`, `g t`, `g m`)は、ホーム、全時間最高位、最も推奨されるなどの特定セクションへの直接ジャンプを可能にします。さらに、`?` はヘルプコマンドを表示します。これらのショートカットにより、マウスへの依存が軽減され、カテゴリへの高速アクセスやデジタルライブラリの滑らかな管理が実現されます。結果として、このシステムはユーザーに対しインターフェースに対する即時の制御力を付与し、基本的なナビゲーションタスクを迅速なアクションに変換することで、全体の生産性と使いやすさを向上させます。なお、このガイドは現在の機能への参照ツールとしての役割に限定されています。

2026/10/30 13:17

Nibnib:解凍速度が極めて高速な画像圧縮

## Japanese Translation: nibnib イメージ形式は、RP2350 マイクロコントローラ上で高速かつ決定論的なデコードを目的とした専用圧縮方式である。入力バイト 1 つあたり 2 ピクセルの並列デコードを行い、約 6 クロックサイクルで 1 ピクセル当りのデコードを完了し、4bpp の圧縮比を実現する。絶対値カラーを保持する標準的なパレット形式とは異なり、nibnib はパレットにカラーデルタを格納し、Floyd-Steinberg エラー拡散法を用いて人間の視覚感度特性をモデル化することで滑らかな領域での画質向上を図る。デコード処理は完全に決定論的であり、直前までにデコードされた最終ピクセルを 2 倍とし、ストリームからバイトを読み込みパレットでアップルックして加算し、入力バイト 1 つあたり 2 ピクセルの 16bpp(RGB 565)を生成する。一方、エンコーディングは非対称であり大幅に低速である。可能となるパレットとコードワードの組み合わせに対して探索を行い、立方体を小さなデルタ値および加重付きガウスランダムエントリで構成した初期化から始め、高品質な複製へデコード可能なエンコーディングを選択する。その貪欲的な左から右への探索手法のため、現時点ではシャープなエッジの右側に残留アーティファクトが生じるが、将来のバージョンでは右から左またはブーストロホン方式によるエンコーディングによりこの影響を低減することが可能である。イメージのレイアウトは、2 バイトで幅と高さを格納するヘッダー、256 エントリの 32 ビットパレット、そして各行が 2 ピクセルに続き ((width − 2)/2) バイトのパレットインデックスを持つ構成となっている。追加的なメタデータフィールドは存在せず、この形式はアーカイブストレージではなくリアルタイムレンダラーとの緊密な統合を意図している。元々 RP2350 での DVI 出力実験として開発された nibnib は、Apache License 2.0 または MIT ライセンスのいずれかを選択して vic-2350 リポジトリで入手可能である。

2026/10/28 18:46

AFL++ を活用したより効果的なファスティングテストのためのヒント

## Japanese Translation: 6 年間の約 1,000 プロジェクトのテストに基づき、著者は AFL++ が Linux 上の C/C++ fuzzing プラットフォームとして決定版であると主張し、ファジー化されていないソフトウェアにはほぼ間違いなくバグが含まれていることを確認しています。速度を損なうことなく脆弱性の検出を最大化するためには、公式文書で強調されている特定のハイパフォーマンス構成を採用すべきです。主要な最適化策には、クラッシュ間でプログラムの状態を維持するパシストンモードの利用(通常は 10 倍ほど高速化)、`afl-gcc-fast` とともに `-fsanitize=address,undefined` および他のフラグでサニタイザーを設定することが含まれます。具体的なチューニングも不可欠であり、デフォルトの 4KiB リミットを超えて `max_malloc_fill_size` を増やすことで use-after-free エラーを検出し、`detect_stack_use_after_return` を有効化し、GCC の libstdc++ で `-D_GLIBCXX_DEBUG` を用いてコンテナオーバーフローを検出します。さらに、単一の翻訳単位(instrumented target と uninstrumented library)でビルドすることで静的関数の設定を簡略化でき、テスト設計ではグローバル状態の干渉を最小限に抑え、ASan による読み取りミスを防ぐために直接バッファ渡しを避け、ファイル入力は `memfd_create` を使用する必要があります。これらのターゲット指向な調整により、デフォルト設定で見逃されがちな重要なメモリ安全性の問題を発見でき、大規模な fuzzing キャンペーンの徹底的さを大幅に向上させます。

Show HN:OmniDiff – Rust で実装されたオープンソースで超高速なコンテキスト認識型 Git 比較ツール | そっか~ニュース