Ubuntu Weekly Recipe

第328回 「違いがわかる人」になろう

この記事を読むのに必要な時間:およそ 6 分

Webページの差分を生成する

Webページの差分を取得するにはおもに2つの方法が考えられます。

まずはHTMLやその他のファイル一式をこれまで説明したやり方で差分を取る方法です。このとき,構成するファイルの種類によってやり方が変わります。HTMLだったらテキストの差分ですし,画像ファイルだったらバイナリの差分です。おそらくまずはディレクトリごと差分を取ることになるでしょう。

$ diff -ruN www1/ www2/

「-r」オプションはサブディレクトリも比較するオプションで,⁠-N」は存在しないファイルは「空のファイル」として扱うオプションです。これにより,新規に追加されたファイルの内容も表示できます。

もう1つは対象のWebページ全体を何らかの方法で画像化してしまい,⁠画像の差分を生成する」と同じように差分を取る方法です。Webページの画像化は,ブラウザの拡張機能を使うなどいろいろな方法が存在します。

CUIで画像を生成したいのであれば,WebKitエンジンを利用したCutyCaptが便利です。

$ sudo apt install cutycapt
$ cutycapt --url=https://gihyo.jp/ --out=gihyo.jp.png

図10 cutycaptでキャプチャした例。ちゃんとページの下のほうまで撮れている

図10 cutycaptでキャプチャした例。ちゃんとページの下のほうまで撮れている

これでWebページ全体をレンダリングしたものがgihyo.jp.pngとして保存されるので,あとは「画像の差分を生成する」と同じ方法で比較できます。何回か取得すると広告部分が変わるので,実際にどんな風に変わるかわかることでしょう。

Debianパッケージの差分を生成する

devscriptsパッケージに含まれているdebdiffコマンドを使うと,Debianパッケージの内容を比較できます。たとえば13.10と14.04のaptパッケージを比較してみましょう。

$ sudo apt install devscripts
$ curl -LO http://jp.archive.ubuntu.com/ubuntu/pool/main/a/apt/apt_0.9.9.1~ubuntu3.1_amd64.deb
$ curl -LO http://jp.archive.ubuntu.com/ubuntu/pool/main/a/apt/apt_1.0.2ubuntu2_amd64.deb
$ debdiff apt_0.9.9.1~ubuntu3.1_amd64.deb apt_1.0.2ubuntu2_amd64.deb
(中略)
Files in second .deb but not in first
-------------------------------------
(中略)
-rw-r--r--  root/root   DEBIAN/shlibs
-rwxr-xr-x  root/root   /usr/bin/apt
-rwxr-xr-x  root/root   /usr/lib/apt/apt-helper

前回紹介したように,aptコマンドそのものが追加されていることがわかります。

上記はバイナリパッケージを直接比較しましたが,ソースパッケージを比較することも可能です。最近セキュリティアップデートされたOpenSSLのソースパッケージを比較してみましょう注3⁠。

$ apt-get source openssl=1.0.1f-1ubuntu2
$ apt-get source openssl=1.0.1f-1ubuntu2.2
$ debdiff openssl_1.0.1f-1ubuntu2{,.2}.dsc
(中略)
--- openssl-1.0.1f/debian/patches/CVE-2014-0224-1.patch 1970-01-01 09:00:00.000000000 +0900
+++ openssl-1.0.1f/debian/patches/CVE-2014-0224-1.patch 2014-06-03 00:00:03.000000000 +0900
(中略)
diff -Nru openssl-1.0.1f/debian/patches/series openssl-1.0.1f/debian/patches/series
--- openssl-1.0.1f/debian/patches/series        2014-04-08 04:37:33.000000000 +0900
+++ openssl-1.0.1f/debian/patches/series        2014-06-03 02:56:46.000000000 +0900
@@ -36,3 +36,11 @@
 ppc64-support
 CVE-2014-0076.patch
 CVE-2014-0160.patch
+CVE-2010-5298.patch
+CVE-2014-0198.patch
+CVE-2014-0195.patch
+CVE-2014-0221.patch
+CVE-2014-0224-1.patch
+CVE-2014-0224-2.patch
+CVE-2014-3470.patch
+CVE-2014-0224-3.patch

debian/patches以下に新規にパッチが8つほど追加されていることがわかるでしょう。

注3)
Ubuntuのセキュリティアップデートでは,バージョンの最後に「.1,.2」という形で数字を増加していきます。リリース時のパッケージ(今回の場合はubuntu2)はそのままリポジトリに残るのですが,セキュリティアップデートとして提供されたパッケージ(ubuntu2.1)は,新しいバージョン(ubuntu2.2)が出ると削除されます。そこで今回はubuntu2とubuntu2.2を比較しています。

まとめ

コンピューターに限らずどんな分野でも,いつ何がどのように変わったのかを把握しておくことは非常に重要です。コンピューターの世界では差分が比較的簡単に取得できますので,ぜひ自分が普段使うデータフォーマットの差分の取得方法を把握しておくことをお勧めします。たとえばファイルタイプに合わせて今回紹介したコマンドを呼ぶようなシェルスクリプトを1つ作っておけば,⁠git diff⁠時にテキスト以外の差分も表示できるようになります。詳しいことは,⁠man git⁠「Git Diffs」を参照してください。なお,恋人の髪型の変化に気づく方法は自分でなんとかしてください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。