WebP を試す

iOS14 でWebP に対応との情報を見かけたのでこれを機にとりあえずエンコードして試してみることにした。

エンコード環境の作成

docker コンテナ内にImageMagick をインストールして、使うことにする。

Dockerfile を作成する。 簡易的なテストのためのものなので、とりあえずapt でインストールしてみた。

FROM ubuntu:20.04

RUN apt-get -y update && \
    apt-get -y install imagemagick && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

続いてdocker image をビルドして、convert コマンドを実行してみる。

# docker image をビルド
$ docker build -t imagemagick .

# 動作確認
$ docker run -it imagemagick convert --version
Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP
Delegates (built-in): bzlib djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png tiff webp wmf x xml zlib

ここまでで準備は完了。

エンコード

エンコード対象の画像を /path/to/images/1.jpg とする。

特にパラメータを指定せずエンコードしてみる。

$ docker run -v /path/to/images:/images --rm -it imagemagick convert /images/1.jpg /images/1.webp

これでエンコードできた。 画像を並べて比較してみたところ、色味や粗さなど自分の肉眼では判別できないほど違いが分からなかった。

エンコード結果の確認

ファイルサイズはかなり違いがある。 とはいえ、これはパラメータ次第だと思われるので、大した参考にはならなさそう。

$ docker run -v /path/to/images:/images --rm -it imagemagick ls -l /images
total 6184
-rwx------ 1 root root 4101341 Oct 22  2019 1.jpg
-rw-r--r-- 1 root root 1908796 Sep 24 14:43 1.webp

ImageMagick に同梱されているidentify コマンドで画像の詳細をチェックできる。

$ docker run -v /path/to/images:/images --rm -it imagemagick identify -verbose /images/1.jpg
$ docker run -v /path/to/images:/images --rm -it imagemagick identify -verbose /images/1.webp

パラメータに関してはImageMagick と WebP がよくまとまっていた。 こちらの記事で概要を掴んで、Google の仕様書を読み込んでいくと詳細まで把握することができそう。

Linuxで作るVLAN変換サーバー

2015年12月17日に公開した記事を移動してきました。


L2 ネットワーク内で、ある VLAN タグが付いたフレームを、別の VLAN タグに付け替える Linux サーバーを作ってみます。 万人に使い道があるとは思えませんが、誰かの参考になると嬉しいですね。

概要

全体像

まずは VLAN 変換サーバーを含めた今回のお題とするネットワークを紹介します。

ネットワークには通常の Linux サーバーが二台 (Node1, Node2) と、VLAN 変換サーバー (VLAN-brige) を1台用意します。 VLAN 変換サーバーには Ubnutu14.04 を利用していますが、ディストリビューションはお好きなものを利用して構わないです。

f:id:ni_hi:20190927172910j:plain
図1: 検証NWの全体像

しくみ

VLAN 変換サーバーの仕組みについて説明します。

VLAN 変換サーバーは、内部に VLAN インターフェースと、bridge インターフェースを持っています。 変換対象となる VLAN インターフェースのペアを brdige インターフェースを使って論理的に接続します。

まず、VLAN 変換サーバーに到達した VLAN フレームは、VLAN インターフェースによって VLAN タグが外されます。 次にタグが外されたフレームは bridge インターフェースに到達します。 bridge インターフェースから、もう片側の VLAN インターフェースにフレームは転送され、元々付いていた VLAN タグとは異なる VLAN タグが付けられます。 この仕組を利用することによって、任意の VLAN タグが付いたフレームを別の VLAN タグに付け替えることができます。

f:id:ni_hi:20190927173008j:plain
図2: VLAN 変換サーバーの内部 NW

つくってみよう

それでは VLAN 変換サーバーを作ってみましょう。 サーバーは2台でも試験できますが、今回は分かりやすくするために3台用意します。

VLAN <-> VLAN 変換編

まずは終端となる2台のサーバーに異なる VLAN インターフェースを作成します。 Node1 に VLAN 番号 100 のインターフェース、Node2 に VLAN 番号 200 のインターフェースを作成します。 ここでは、eth1 のサブインタフェースとして作成してみます。

Node1

# サブインタフェースの追加をする
$ vconfig add eth1 100

# 作った eth1.100 に IP address を割り振って
$ ip addr add 192.168.0.100/24 dev eth1.100

# eth1 インターフェースを起こして
$ ip link set eth1 up

# eth1.100 インタフェースを起こす
$ ip link set eth1.100 up

Node2

Node2 も同様に 200 番の VLAN インターフェースを作成して、IP address を付けておきます。

$ vconfig add eth1 200

$ ip addr add 192.168.0.200/24 dev eth1.200
$ ip link set eth1 up
$ ip link set eth1.200 up

VLAN 変換サーバー

VLAN 変換サーバーは、前述した通り、VLAN インターフェースの他に brige インターフェースを作成するので、brctl コマンドを利用します。

# eth1.100 インターフェースを作っておいて
$ vconfig add eth1 100
$ ip link set eth1 up
$ ip link set eth1.100 up

# eth1.200 インターフェースも作っておいて
$ vconfig add eth1 200
$ ip link set eth1 up
$ ip link set eth1.200 up

# br1 という名前で bridge インターフェースを作って
$ brctl addbr br1

# br1 に eth1.100 を論理的に接続
$ brctl addif br1 eth1.100

# br1 に eth1.200 も論理的に接続
$ brctl addif br1 eth1.200

# br1 インターフェースを起こす
$ ip link set br1 up

これで準備は整いました。 Node1 と Node2 でお互いの IP address に ping を送信してみましょう! ping が到達するのが確認できましたか?

到達が確認できたら、VLAN 変換サーバーで各インターフェースを tcpdump で眺めてみると面白いかもしれないですね!

VLAN <-> Nested VLAN 変換編

おまけです。 ほとんど変わらないですが、任意の VLAN フレームと Nested VLAN フレームも同じように変換できます。

Node1

# サブインタフェースの追加をする
$ vconfig add eth1 100

# 作った eth1.100 に IP address を割り振って
$ ip addr add 192.168.0.100/24 dev eth1.100

# eth1 インターフェースを起こして
$ ip link set eth1 up

# eth1.100 インタフェースを起こす
$ ip link set eth1.100 up

Node2

Node2 は Nested VLAN インターフェースを作っておきます。

$ vconfig add eth1 200
$ vconfig add eth1.200 300

$ ip addr add 192.168.0.200/24 dev eth1.200.300
$ ip link set eth1 up
$ ip link set eth1.200 up
$ ip link set eth1.200.300 up

VLAN 変換サーバー

# eth1.100 インターフェースを作っておいて
$ vconfig add eth1 100
$ ip link set eth1 up
$ ip link set eth1.100 up

# eth1.200.300 インターフェースも作っておいて
$ vconfig add eth1 200
$ vconfig add eth1.200 300

$ ip link set eth1 up
$ ip link set eth1.200 up
$ ip link set eth1.200.300 up

# br1 という名前で bridge インターフェースを作って
$ brctl addbr br1

# br1 に eth1.100 を論理的に接続
$ brctl addif br1 eth1.100

# br1 に eth1.200.300 も論理的に接続
$ brctl addif br1 eth1.200.300

# br1 インターフェースを起こす
$ ip link set br1 up

これで準備は整いました。 Node1 と Node2 でお互いの IP address に ping を送信してみましょう!

感想

仕組みさえ分かってしまえば意外と簡単でした。 ただ、変換サーバーの冗長化はめちゃくちゃ苦労したので、興味のある方はぜひ挑戦してみてくださいね!

ネットワークの勉強をするときには、どの地点でパケットやフレームにどういったヘッダーが付いていて、それらが着信したインターフェースによってどう処理されるかをひとつひとつしっかり考えることが一番の近道だと思います。 繋がったときに楽しさ倍増なので、tcpdump をバンバンしましょう!