NetBSDで少し型落ちのドキュメントスキャナを利用してみる

[NetBSD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/netbsd) 13日目の記事です。今日はNetBSDでドキュメントスキャナを使ってみる話をしようと思います(現在では単に「スキャナ」と言うと、脆弱性調査用のセキュリティスキャナを意味する場合もあるのでややこしいですね…)。

## NetBSDでドキュメントスキャナを使う

紙のまま保管しておくほどではないけど、後で確認する必要が発生した時のために残しておきたい書類、というものはままあります。そういった書類をドキュメントスキャナでスキャンし、画像として保存しておく(デジタル化してかさ張らないようにする)と便利です。私も[CanoScan LiDE 200](https://canon.jp/support/products?pr=2701)という製品を利用しているのですが、いささか古い機種なのか、現在のWindowsやmacOSでは対応してない状態です…。新しい機種に買い替えれば良い、というのはごもっともですが、まだまだ問題なく動作するものを買い替えるのは(お財布的にも)気が引けます。

そのような場合、NetBSDのような自由に使えるOSであれば、ドライバ等がまだまだサポートされていることも多く、今回のケースでも問題なくドキュメントスキャナが利用できました。このような「最新のWindowsやmacOSではサポート外の古い機材が家にあるけど、特に壊れているワケではないので何とか使いたい」というな場合にNetBSDは一つの選択肢となるのではないでしょうか。

## NetBSDをドキュメントスキャナサーバにする

私の環境では、これまた古いi386マシン上でNetBSD-i386を稼働させ、そこでドキュメントスキャナを使用しています。スキャン動作自体に時間がかかるため、ある意味では最新の早いマシンを使用するよりかは用途にマッチしているのかもしれません。

そして、このi386マシンにVNCで接続し、GUI環境だけ手元のWindowsマシンに表示し、そこからドキュメントスキャナを[Xsane](https://wiki.archlinux.jp/index.php/SANE)(GUIフロントエンド)で操作しています。ある意味ではNetBSDをドキュメントスキャナサーバ(？)として利用している、と言えるかもしれません。

## ドキュメントスキャナサーバの構築

ドキュメントスキャナサーバの構築手順を紹介します。NetBSDの対応アーキテクチャに依存しないはずなので、現在ならRaspberry Piを使うという手もありそうです。

NetBSDの[Using Scanners on NetBSD](https://wiki.netbsd.org/scanner/)というドキュメントには、 `scanner` グループを作成し、 `/dev/usb*` と `/dev/ugen*` にグループの書き込み権限を付与するという手順になっています。ただ、私の環境ではこの手順ではうまく動作しなかったため、(ホントはちゃんと適切なグループに権限を絞るべきですが) `root` ユーザでドキュメントスキャナを操作しています。

そのため、環境構築手順としては単にVNCとXsaneをインストールするだけとなっています。

### VNCをインストールする

リモートからGUI操作を行えるようにするため、まずはVNCをインストールします。必要なパッケージをインストールした後、任意のウインドウマネージャを起動させる設定を `~/.vnc/xstartup` に追記すればOKです。

```sh
$ sudo -i pkg_add -v \
    bash \
    libSM \
    libICE \
    libX11 \
    libXext \
    xauth \
    xterm \
    tigervnc \
    ja-sazanami-ttf \
    scim-uim \
    scim-anthy \
    leafpad \
    fluxbox
$ sudo -i bash
#
# # ~/.vnc以下にデフォルト設定ファイルを生成させるため、
# # いったんVNCサーバを起動してすぐ止める。
# vncserver :0
# vncserver -kill :0
#
# cat <<_EOF >> ~/.vnc/xstartup
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &

export GTK_IM_MODULE=uim
export QT_IM_MODULE=uim
export XMODIFIERS=@im=uim
export XIM=uim
/usr/local/bin/mozc start
uim-xim &

exec fluxbox
_EOF
```

### Xsaneをインストールする

次にドキュメントスキャナのGUIフロントエンドであるXsaneをインストールします。こちらも必要なパッケージをインストールするだけでOKです。

```sh
$ sudo -i pkg_add -v xsane sane-backends sane-frontends
```

`sane-find-scanner` を実行すると、ドキュメントスキャナの接続状態が確認できます。

```sh
$ sudo sane-find-scanner
...
found USB scanner (vendor=0x04a9 [Canon], product=0x1905 [CanoScan], chip=GL847) at libusb:000:002
  # Your USB scanner was (probably) detected. It may or may not be supported by
  # SANE. Try scanimage -L and read the backend's manpage.
...
```

また、 `dmesg` にも以下のようなログが記録されるので、こちらでもドキュメントスキャナが認識されているかどうかを確認できます。

```sh
Apr 22 18:15:59 scanner /netbsd: [ 3145.7506571] ugen0 at uhub0 port 2
Apr 22 18:15:59 scanner /netbsd: [ 3145.7506571] ugen0: Canon (0x4a9) CanoScan (0x1905), rev 2.00/6.03, addr 2
Apr 22 18:16:06 scanner /netbsd: [ 3152.9807598] ugen0: detached
Apr 22 18:16:06 scanner /netbsd: [ 3152.9807598] ugen0: at uhub0 port 2 (addr 2) disconnected
Apr 22 18:16:08 scanner /netbsd: [ 3154.7507948] ugen0 at uhub0 port 2
Apr 22 18:16:08 scanner /netbsd: [ 3154.7507948] ugen0: Canon (0x4a9) CanoScan (0x1905), rev 2.00/6.03, addr 2
Apr 22 18:16:11 scanner /netbsd: [ 3157.4808289] ugen0: detached
Apr 22 18:16:11 scanner /netbsd: [ 3157.4808289] ugen0: at uhub0 port 2 (addr 2) disconnected
Apr 22 18:16:12 scanner /netbsd: [ 3159.2508614] ugen0 at uhub0 port 2
Apr 22 18:16:12 scanner /netbsd: [ 3159.2508614] ugen0: Canon (0x4a9) CanoScan (0x1905), rev 2.00/6.03, addr 2
```

## スキャンしたドキュメントのサイズ調整

ここまででドキュメントスキャナを利用する環境が構築できましたが、スキャンしたドキュメント(画像)は `グレースケール＋600dpi` でも `4168x5509` の画像サイズで、1枚あたりのファイル容量は `11M` ほどあります。画像の状態で文字が読めれば良いくらいのサイズでよいため、スキャンしたあとに画像を縮小します。

```sh
# file img.png
img.png: PNG image data, 4168 x 5509, 8-bit grayscale, non-interlaced
# ls -lh img.png
-rw-r-----  1 root  wheel   11M Nov 20 12:16 img.png
```

画像の縮小は[ImageMagick](https://imagemagick.org/index.php)の `convert` コマンドで行います。この例では、画像サイズを `50%` に縮小しています。

```sh
# convert -geometry '50%' img.png converted/img.png
```

画像サイズも `4168x5509` → `2084x2755` になり、ファイル容量も `11M` → `2.4M` と約5分の1くらいまで小さくなっています。ここまでできれば、あとは通常のファイル整理の形でスキャンしたドキュメント(画像)を保管しておくだけです。

```sh
# file img.png converted/img.png
img.png:           PNG image data, 4168 x 5509, 8-bit grayscale, non-interlaced
converted/img.png: PNG image data, 2084 x 2755, 8-bit grayscale, non-interlaced
#
# ls -lh img.png converted/img.png
-rw-r--r--  1 root  wheel  2.4M Nov 20 13:21 converted/img.png
-rw-r-----  1 root  wheel   11M Nov 20 12:16 img.png
```

## まとめ

NetBSDでドキュメントスキャナを使用する手順を紹介しました。OSが更新されると古い機材のサポートは対象外になってしまうことがありますが、NetBSDのようなフリーOSを利用することで、まだ動作するのに家に眠っている機材を活用できそうです。