Thursday, December 10, 2020 / VirtualBox, macOS, FreeBSD, Wnn7

Wnn7 を macOS Catalina + emacs 26.3 nox で使う, VirtualBox + FreeBSD 10.4 を利用

FreeBSD

随分前には ThinkPad X230 + Ubuntu + VirtualBox + Vine Linux + Wnn7 の組合わせで、運用していたこともあったが Wnn7 のためだけに VirtualBox をバックグラウンドで起動しておくのが負担になっていつしか使わなくなってしまっていた。

しかし、 M1 chip 搭載の Mac が登場したことで、バッテリー効率が飛躍的に良くなったらしい。 それならば M1 MacBook Air などで、Wnn7 を常用する環境つくることできるのでは? と思いリサーチを始めた。

もちろん、今のところ M1 chip で 動く仮想環境はない。 しかし、Parallels は対応表明しているし、Docker もいずれは動くようになるはず。 そうなれば、いつの日にかは、FreeBSD が動くようになるに違いない。

すると、なんと FreeBSD における Wnn 7 というすばらしいガイドページを発見。 しかも、Wnn7 としては 結構最近の情報です。 その他多数のネット情報をみながら、一日がかりで、Macbook Air 2020 Intel (Catalina) で Wnn7 + emacs 26.3 (nox) 環境を構築できたので、備忘録として残します。 この環境を使いたい、という需要がどれくらいあるのかとは思いますが、 個人的には Wnn7 + emacs はとても集中できる執筆環境なので、おすすめです。

まずは FreeBSD 10.4 上で完結して Wnn7 + emacs が使えるようにする

事細かに書いているととても長くなるので、ポイントだけ書いていきます。 それでも相当長いの覚悟が必要です。

必要なもの

  • 製品版 Wnn7 Personal for Linux/BSD Ver1.01
  • wnn7egg のパッチ
  • FreeBSD 10.4
    • http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/amd64/amd64/ISO-IMAGES/10.4/
    • FreeBSD-10.4-RELEASE-amd64-disc1.iso を使うべき
  • VirtualBox 6.1.16 (現時点での最新版)

FreeBSD はなるべく新しいものを使いたいのですが、Wnn7 のインストーラが使う pkg_add など古い pkg コマンドに対応できるバージョンとなると この辺りになるそうです。iso イメージは FreeBSD-10.4-RELEASE-amd64-disc1.iso を使います。

OSインストールとネットワーク設定

VirtualBox で仮想マシンをつくる。

  • メモリは 2G, HDDは 8G 程度を確保(実運用段階では メモリ1G 程度で、ビデオメモリは8M に設定)
  • ネットワークは NAT と Host Only Network の2つをセット
    • FreeBSD 上でしか emacs を使わないのであれば、NAT のみでもOK。あとからでも Host Only Networkは追加はできる。
    • ただし、ここでの説明は インストール後のセットアップ作業を ssh 経由で host mac のターミナルから行う前提なので、 Host Only Network 必須
  • FreeBSD-10.4-RELEASE-amd64-disc1.iso をセット

仮想マシンを起動して、FreeBSD 10.4 のインストールを普通に行う。

  • ホスト名は wnn7 とする(実際は何でもよいが説明の都合上)
  • パッケージ選択で lib32, ports, src を選択する必要あり
  • インストール後に host mac から ssh して作業するので、一般ユーザを作成しておく
    • 説明の都合上 一般ユーザ名は foo とする

FreeBSD Distribution Select

インストールが済んだら、マシンを停止。仮想マシンにセットしていた インストールディスク(FreeBSD-10.4-RELEASE-amd64-disc1.iso)を外してから、再度起動します。その後 root でログインして以下の設定をします。

  • ネットワークが作動しているか確認します

    • ifconfig するなど状況確認
    • ping www.google.co.jp などして インターネット接続確認
    • vi /etc/rc.conf で、Host Only Network にたいして固定 IP をセット、具体的には以下の二行を追加 (こちらの環境の例です。) ネットワークインタフェース名などは適宜環境に合わせること。
      • ifconfig_em1="inet 192.168.56.4 netmask 255.255.255.0″
      • defaultrouter="192.168.56.1″
  • sudo できるようにする

    • pkg install sudo
    • visudo して foo ALL=(ALL) ALL を追記

sudo を入れるには cd /usr/ports/security/sudo; make install してもよい。 こちらから入れれば、インターネットのない環境でもインストールできるのかと思ったが、そうでもなかった。

sudo できるようになったら、host mac のターミナルを起動して ssh foo@192.168.56.4 で接続できるか確認する。

Wnn7 をインストール

host mac ターミナルから VirtualBox 上の FreeBSD に ssh できるようになったら、 scp などを使って Wnn7 のインストールファイル一式と wnn7egg のパッチ (wnn7-elisp-el-1.02-1.patch.gz) を転送しておきます。

Wnn7 のインストーラーを作動させるために必要な古い pkg コマンドが必要なので、それを使えるようにします。

$ ssh foo@192.168.56.4
// 以下は、FreeBSD上 での作業
$ cd /usr/src/usr.sbin/pkg_install
$ sudo make
$ sudo make install

これで pkg_add, pkg_delete, pkg_info などのコマンドが使えるようになりました。

それでは Wnn7 をインストールしましょう。Wnn7 のインストーラの入ったパスへ移動して、普通にインストールします。

$ cd /path/to/wnn7/cdrom
$ sudo ./Install

Full Install か Custom Install かの選択で Custom Install を選び、 Wnn7 XWindows Client package のみ n で他は全部 y でインストール。 (別に XWindows Client 系入れても害はないとは思いますが、使わないので除外し、それ以外は全部インストールする。)

インストールの最後に 以下のエラーが出ます。

[read_access_file] Cannot access ""

これは オフィシャルサイト に説明があるので、それにしたがって修正しましょう。

$ hostname
wnn7
$ sudo vi /etc/hosts

127.0.0.1 のある行の最後に wnn7 (ホストネーム) を追記するだけです。 その後、wnn7 サーバの起動処理をします。

$ cd /usr/local/etc/rc.d/
$ sudo ./dpkey7.sh start
$ sudo ./wnn7.sh start

dpkey7.sh はライセンスサーバの起動でこれは start させる必要は本当はない(なぜならすでに起動しているから)のですが、 念のため起動処理しておきます。すでに起動していれば、already running とか言われるだけで無害です。 次に、肝心の wnn7.sh をスタートさせて、先ほどのエラーが出ないで、正常起動することを確認します。

emacs を インストール

host mac 側の emacs を使うのであれば、FreeBSD 上に emacs を入れる必要はないです。 もちろんそのためには host mac 側に emacs がインストールされていることが前提です。 ここでは、FreeBSD に emacs を入れてそれを使って wnn7egg にパッチを当てたものをコンパイルする手順で進めます。

実のところ FreeBSD で emacs を入れるには、 cd /usr/ports/editors/emacs && sudo make install するだけです。 emacs 25.2 が入ります。 インストール途中で emacs のオプションパッケージ選択画面になりますが、 今回の目的を達成したいだけならば、 全部チェックを外し ましょう。 そうしないと依存パッケージのインストールが続きとても時間がかかります。

emacs options

wnn7egg (うんぬななたまご) に patch をあててコンパイル

先に転送済みの パッチファイル wnn7-elisp-el-1.02-1.patch.gz は事前に解凍しておきましょう。

gzip -d wnn7-elisp-el-1.02-1.patch.gz

次は、wnn7egg パッチをあてて 対象となる .el フィアルをコンパイルしなおします。

最初に対象なる .el ファイルのあるディレクトリをバックアップしておきましょう。

$ cd /usr/local/lib/wnn7/elisp
$ sudo tar cf ~/emacs20.tar ./emacs20

パッチは /usr/local/lib で当てることが前提になっているらしい、そこへ移動して patch します。

$ cd /usr/local/lib
$ sudo patch < /path/to/patch/wnn7-elisp-el-1.02-1.patch

そして、emacs を使って .el ファイルをコンパイルするのですが、その前に、 /root/.emacs.d/init.el を以下のように編集して、この wnn7egg へパスを通しておきます。

(add-to-list 'load-path "/usr/local/lib/wnn7/elisp/emacs20")

これでコンパイル準備できたので、root でログインしなおして該当ディレクトリまで移動 emacs を起動します。

# cd /usr/local/lib/wnn7/elisp/emacs20
# emacs 

あとは M-x byte-compile-file して対象 .el ファイルをそれぞれコンパイルします。

  • wnn7egg-cnv.el
  • wnn7egg-com.el
  • wnn7egg-jsymbol.el
  • wnn7egg-rpc.el
  • wnn7egg.el
  • wnn7egg-edep.el
  • wnn7egg-leim.el
  • wnn7egg-lib.el

警告は出ますが、作動にはとりあえず問題ないようです。全部コンパイルできたら emacs を終了。

これで準備は整ったので、emacs を起動して作動を確かめます。 今度は root ではなく、普通のユーザ(ここでは foo で)テストします。

foo ユーザの ~/.emacs.d/init.el を設定しておきます。

(add-to-list 'load-path "/usr/local/lib/wnn7/elisp/emacs20")

(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)

(setq enable-double-n-syntax t)

(global-set-key "\C-\\" 'toggle-input-method)
(load "wnn7egg-leim")

(set-input-method "japanese-egg-wnn7")
(set-language-info "Japanese" 'input-method "japanese-egg-wnn7")

(define-key wnn7-henkan-mode-map " " 'wnn7-henkan-select-kouho-dai)

設定を保存したら emacs を起動して wnn7 で変換できるか試します。 長い道のりでした。

なお、Wnn7egg は、こちらから入手可能です。 各ファイルの説明などもあります。一通り目を通してと良いと思います。

残りのいくつかの問題

問題1) 初回の日本語変換ができない

解決策はこれです。

/usr/local/lib/wnn7/elisp/emacs20/eggrc-wnn7 を編集

以下の2行をコメントアウトするだけです。

; (wnn7-add-notrans-dict (concat wnn-usr-dic-dir "/katakana") 15 t)
; (wnn7-add-bmodify-dict (concat wnn-usr-dic-dir "/bunsetsu") 15 t)

問題2) Symbol’s value as variable is void: last-command-char の回避

良く理解していません。 日本語入力ではなく、そのまま文字を入力するとこのエラーが出て入力できなくなるのです。

ここに解決方法があったので、それでこの環境では回避できています。

~/.emacs.d/init.el の最後に以下を追記。

(define-obsolete-variable-alias
   'last-command-char
   'last-command-event
   "at least 19.34")

問題3) VirtualBox のCPU使用率が 100% 近くになり Macbook Air のファンがうるさく回る問題

host mac がスリープから復帰したときに起りやすい、とか。原因はわかりません。 対策は、最新のVirtualBox にして、FreeBSDのゲストマシンの設定で、サウンドを disabled にする、です。 その他 USB とか不要な設定はすべて外しておきましょう。 とりあえずのところ、これでこの問題は抑止できているようです。

問題4) 予測変換ができない(未解決)

~/.emacs.d/init.el の設定で、予測変換関連のものがある。

(egg-use-input-predict)
(setq egg-predict-realtime nil)
(setq egg-predict-mode "inline")
;(setq egg-predict-mode "window")

これらを有効にすると、意図通り作動しない。調査中。

host mac の emacs で Wnn7 を使って日本語入力する

host mac への emacs のインストールはこちら を参照してください。 たぶん、homebrew とかで入れた emacs でも問題ないとは思います。試していませんが。

host mac の emacs で使うには、以下の2つの作業が必要です。

  • FreeBSD 上の /usr/local/lib/wnn7/elisp/emacs20 を host mac の適当なディレクトリにそっくりコピー
    • ここでは説明の都合上 /path/to/emacs20 に配置したことにします。
  • ~/.emacs.d/init.el を編集

~/.emacs.d/init.el は、load-path を host mac 側に合わせるのと、 wnn7-server-name の指定を追加して IPアドレスを VirtualBox 上にインストールした FreeBSD を指すの2点の変更です。

(add-to-list 'load-path "/path/to/emacs20")

(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)

(setq enable-double-n-syntax t)

(setq wnn7-server-name "192.168.56.4")

(global-set-key "\C-\\" 'toggle-input-method)
(load "wnn7egg-leim")

(set-input-method "japanese-egg-wnn7")
(set-language-info "Japanese" 'input-method "japanese-egg-wnn7")

(define-key wnn7-henkan-mode-map " " 'wnn7-henkan-select-kouho-dai)

これで host mac 側で Wnn7 日本語入力できるようになるはずです。 なお、host mac 側の emacs のバージョンは Gnu Emacs 26.3 です。

host mac 側の emacs で Wnn7egg をコンパイルし直す

FreeBSD 側の emacs のバージョンと host mac のそれとでバージョンが違うと気持悪いかもしれないので、 host mac 側で再度コンパイル( byte-compile-file )すれば良いと思います。

そもそも emacs は host mac 側でしか使わない場合 FreeBSD 側で emacs を入れる必要はなく、 host mac 側に入れた emacs で、パッチ適用済みの Wnn7egg をコンパイルして使えばよいだけです。

最新版にアップデートする

まとめ

以上です。 2001年にリリースされた Wnn7 がいまだに使えるのはうれしいですね。 オープンソースさまさまです。🙏

実運用では、VirtualBox上の FreeBSD は メモリ割り当て 1G くらいで足りますので、16G ある Macbook ではあまり問題ないのではないかと思います。 バッテリー持続時間への悪影響は気になりますが、VirtualBox で Headless 運用している状態では、そんなに急激にバッテリー減るという感じはないです。 M1 chip 搭載の MacBook Air でこの環境が構築できる日がはやく来るといいですね。