Ubuntu 16.04でSDICを使用するには

# はじめに

英文ドキュメントを読む時に、[GNU Emacs](https://www.gnu.org/software/emacs/) + [SDIC-Eijiro](http://www.namazu.org/~tsuchiya/sdic/) を活用していたのだ
が、なぜか、最近のUbuntuではSDICが上手く動作しない。

<img width="682" alt="sdic_does_not_work.png" src="https://qiita-image-store.s3.amazonaws.com/0/59920/498f5c10-a147-975a-7139-6da1ed6c7075.png">

もしかすると、[英辞郎](https://eow.alc.co.jp/) の辞書が古い(Ver.52)ことに原因があるのかも知れな
いが、[GNU Emacs](https://www.gnu.org/software/emacs/) + [SDIC-Eijiro](http://www.namazu.org/~tsuchiya/sdic/) の手軽さにが恋しい。

そこで、一念発起して、Ubuntu 16.04で、 [SDIC-Eijiro](http://www.namazu.org/~tsuchiya/sdic/) を動かすことにトラ
イしてみた。

# なぜ、パッケージ提供されているsdic-eijiroがubuntu16.04で動作しないのか

世の中同じように困っている方は見えるもので、[Hiroshi Tsutsui](https://mobile.twitter.com/htutui/status/620118210986127360)さんが原因
を以下のようにtweetしてくれている。

> 最新(2.21-2)のgrepはLANG=ja<sub>JP</sub>.UTF-8だとEUC-JPのファイル(gene.sdic)を
> バイナリだと認識してしまうらしい．grep 2.20-4.1にdowngradeするとsdicが
> 動いた．

# 対処

Ubuntu 16.04向けのgrep 2.20-4.1のパッケージが無いし、できれば、パッケー
ジは最新の状況を維持しておきたい。そこで、発想を逆転させて、
[SDIC-Eijiro](http://www.namazu.org/~tsuchiya/sdic/) をUTF-8対応させることにする。
対応方法は、後々のUbuntuの管理が容易になると考えて、Ubuntu 16.04の
sdic-2.1.3-22をベースにしたローカルパッケージを作成することにする。

下記の修正は、sdic-2.1.3-22へのパッチとして、<https://github.com/takushi1969/sdic-forUTF8.git>で公開する。

## SDIC-EijiroのUTF-8化

[SDIC-Eijiro](http://www.namazu.org/~tsuchiya/sdic/) のUTF-8化のポイントは2点。
1.  SDICが生成する辞書ファイルをUTF-8化する
2.  SDICが動作するコーディングをUTF-8とする

### SDICが生成する辞書ファイルのUTF-8化

SDICの辞書ファイルの作成は一概して、以下の手順を踏む。
1.  辞書データのEUC化
    eオプションを指定したnkfのインプットに辞書の元データを渡してEUC化
2.  辞書の生成
    1)の出力結果をパイプで(sdic-2.1.3/contrib配下にある)perlスクリプト
    に渡して、その処理結果を辞書ファイルに保存

本来は、1)でUTF-8化して、2)でUTF-8対応させたperlスクリプトで処理するこ
とが望ましいと考えるが、perlスクリプトの改造の手間を省いて、2)の辞書ファ
イルの保存前に、UTF-8化するためにnkfに-wオプションを指定したパイプを追
加する。

以下に改造の概要を示す。

    nkf -e 辞書の元データ | perlスクリプト | nkf -w > 辞書ファイル

調査の結果、修正対象は以下の6ファイルとなる。
-   Makefile.am
    Makefile.inを作成するためのインプットであり、かつ、Makefile.inが存在
    することから、本来は修正が不要か?
-   Makefile.in
-   contrib/gene.perl
-   contrib/eijirou.perl
-   debian/sdic-gene95.postinst
-   debian/sdic-eijiro.postinst

### SDICの動作するコーディングのUTF-8化

SDICが動作するコーディングは、変数：sdic-default-coding-system の値で
決まる。そこで、sdic-2.1.3配下で、sdic-default-coding-systemを設定し
ている箇所を洗い出して、Ubuntu 16.04 + Emacs 24の使用時には、utf-8とな
るよう設定する。
調査の結果、修正対象は以下の2ファイルとなる。
-   lisp/sdic.el.in
    sdic-default-coding-systemの初期値が、utf-8となるよう設定する。
-   texi/sdic.texi
    infoドキュメントのsdic-default-coding-systemの説明箇所の初期値をEUC
    からUTF-8に変更する。

# ローカル・パッケージの作成とインストール

UTF-8化したSDICのローカル・パッケージの作成手順を以下に示す。

1.  パッケージのビルド環境の構築
    
        $ sudo apt update
        $ sudo apt install build-essential
        $ sudo apt-get build-dep sdic
2.  正規SDICパッケージ・ソースの入手
    
        $ mkdir sdic
        $ cd sdic
        $ apt-get source sdic
3.  UTF-8化のパッチの入手
    
        $ git clone https://github.com/takushi1969/sdic-forUTF8.git
4.  正規SDICパッケージ・ソースへのパッチの適用とパッケージのビルド
    
        $ cd sdic-2.1.3
        $ patch -p1  < ../sdic-forUTF8/sdic-forUTF8.patch 
        $ dpkg-buildpackage -b -uc -us
5.  ローカル・パッケージの確認
    ビルドに成功すると、親ディレクトリにSDICの各種パッケージが生成され
    る。
    
        $ cd ..
        $ ls *deb
6.  sdicとsdic-eijiroのインストール
    
        $ sudo dpkg -i sdic_2.1.3-22-forUTF8_all.deb sdic-eijiro_2.1.3-22-forUTF8_all.deb

<img width="682" alt="sdic_work_correctly.png" src="https://qiita-image-store.s3.amazonaws.com/0/59920/0bb46d1b-1549-cbe8-0d77-1d21a9ab12b7.png">

# 後書き

目標としていたSDIC-Eijiroを無事動作させることができた。
また、オリジナルのパッケージでは参照できなかったSDICのinfoも参照できる
ように対応した。

<img width="682" alt="sdic_info.png" src="https://qiita-image-store.s3.amazonaws.com/0/59920/0fc1175f-7291-54bc-d9a8-56d7d041aa51.png">

ただ、以下の留意点があるので、注意されたい。
1.  UTF-8の辞書は、sdic-eijiro以外は未確認