有馬総一郎のブログ

(彼氏の事情)

2021年04月10日 16:02:16 JST - 7 minute read - Linux

yaskkserv(Yet Another SKK server)でskkでの日本語入力を快適にする(はずが…)

skkでGoogle日本語入力の辞書を使うには Google IME SKK サーバー 作った - hitode909の日記とか使わなきゃいけないと早合点していた。

Google IME SKK サーバーについてはruby 1.9.3でないと上手く起動しなかったり、python製の google-ime-skk-py · PyPIも動かなかったりで、ほぼ諦めていた。

しかし 2020年版。SKKでGoogle日本語入力の辞書を使う - sasasin’s blogにあるとおり wachikun/yaskkserv: Yet Another SKK serverなるものがあって、それでもGoogle日本語入力の辞書を利用することが可能だ。

既に wachikun/yaskkserv2: Yet Another SKK serverというRust製のyaskkservがあるのに、今更だが、こちらのインストールと設定をまとめておく。


追記 2021-05-03
入れてみた。 Rust製のSKKサーバーyaskkserv2をインストールして今度こそ快適に使う
追記ここまで


yaskkserv作成、インストール

Ubuntuならなんと!?sudo apt install yaskkservでインストールできちゃう1のだけど、コンパイルしてインストールしてみた。

$ git clone https://github.com/wachikun/yaskkserv.git
$ sudo apt install ccache libssl-dev gnutls-bin
$ cd yaskkserv
yaskkserv$ ./configure --enable-google-suggest
pkg-config (found)
GNU Make (make)
compiler g++ (9.3.0)
iconv.h (argument "char *" found)
SSL OpenSSL
SSL OpenSSL RAND_poll() (found)
*** Warning : SD_LISTEN_FDS_START and sd_listen_fds are not found
MSG_NOSIGNAL (found)
RESOLV_RETRANS_RETRY (found)
timer_create() (found)
pthread (found)
c++11 supported
ccache (found)
************************************
** enable google japanese input ! **
**     enable google suggest !    **
************************************

基本gitに書いてあるままだが、デフォルトではgoogle suggestが無効なので./configure --enable-google-suggestとオプションを付ける必要がある。

また、自環境でそのまま./configureしたときは

*** Warning : GnuTLS not found(or disable)
*** Warning : OpenSSL not found(or disable)

が出たのでsudo apt install ccache libssl-dev gnutls-binしている。

*** Warning : SD_LISTEN_FDS_START and sd_listen_fds are not foundについては単純にアプリをインストールしたり、環境変数を定義すれば解消される話でもなかったようなので、無視した。

yaskkserv$ make
yaskkserv$ sudo make install_hairy
mkdir -p /usr/local/bin
install /home/arimasou16/git/yaskkserv/var/bsd_cygwin_linux_gcc/release/yaskkserv_make_dictionary/yaskkserv_make_dictionary /usr/local/bin/yaskkserv_make_dictionary
mkdir -p /usr/local/sbin
install /home/arimasou16/git/yaskkserv/var/bsd_cygwin_linux_gcc/release/yaskkserv_hairy/yaskkserv_hairy /usr/local/sbin/yaskkserv

yaskkserv_simpleだとgoogle suggestとかオプションが使えなそうなので、yaskkserv_simpleyaskkservという名前でインストールするためmake install_hairyを実行した。yaskkserv_simpleyaskkserv_normalyaskkserv_hairyと使い分けるならmake install_all

専用の辞書を作成

yaskkserv_make_dictionary /usr/share/skk/SKK-JISYO.L /home/arimasou16/.config/fcitx/skk/SKK-JISYO.L.yaskkserv

systemdを使ってユーザーサービス登録(結果fcitxが起動しなくなる)

systemd の socket activation を利用する

examples ディレクトリにある unit ファイルをインストールすることで、systemd の socket activation を利用して起動することができる。

良く分からんかったが、 サーバー起動時に非rootユーザーでsystemdを使ってサービスを立ち上げる - Qiitaということらしい。なるほど、完全に理解した。

yaskkserv/examplesにあるservice、socketファイルを$HOME以下の適当な場所にコピーして ExecStartを自分の環境、用途に合わせて書き換える。

yaskkserv.service

[Unit]
Description=Yet Another SKK server
After=yaskkserv.socket
Requires=yaskkserv.socket

[Service]
ExecStart=yaskkserv --google-japanese-input=notfound-suggest-input --google-suggest /home/arimasou16/.config/fcitx/skk/SKK-JISYO.L.yaskkserv

[Install]
WantedBy=multi-user.target

User=nobodyは削除。あるとyaskkserv.service: Failed to determine supplementary groups: Operation not permittedと言ったエラーが出る。

systemd - Failed to determine supplementary groups: Operation not permitted - Unix & Linux Stack Exchangeを読むと

If you want to start the service as a user service then the User/Group is not needed ユーザーサービスとしてサービスを開始する場合は、ユーザー/グループは不要

とのこと。またファイルパスは~/といった指定はできない。dictionary file "~/.config/fcitx/skk/SKK-JISYO.L.yaskkserv" (index = 0) not foundとファイルが見付からないとエラーになる。

このファイルを使って

$ systemctl --user enable /home/arimasou16/Nextcloud/Public_Ubuntu/skk/yaskkserv.service
$ systemctl --user enable /home/arimasou16/Nextcloud/Public_Ubuntu/skk/yaskkserv.socket

とやれば

Created symlink /home/arimasou16/.config/systemd/user/multi-user.target.wants/yaskkserv.service → /home/arimasou16/Nextcloud/Public_Ubuntu/skk/yaskkserv.service.
Created symlink /home/arimasou16/.config/systemd/user/yaskkserv.service → /home/arimasou16/Nextcloud/Public_Ubuntu/skk/yaskkserv.service.

と勝手に/home/arimasou16/.config/systemd/userフォルダ作成やリンクを張ってくれる。

登録することでログイン時に起動するようになったのだけど…IM(Input Method)がおかしくなる。IMの切り替えが出来ない。キーボードのアイコンすら表示されない。

systemdを使ってシステムサービス登録(結果、変換時に固まる)

今度はユーザーではなくシステムとしてサービス登録してみる。さっきと違うのは置く場所、ユーザーの指定がいるようになったぐらいか。 参考にしたのは、これ↓
Systemdを使ってさくっと自作コマンドをサービス化してみる - Qiita

yaskkserv.service

[Unit]
Description=Yet Another SKK server
After=yaskkserv.socket
Requires=yaskkserv.socket

[Service]
User=arimasou16
ExecStart=yaskkserv --google-japanese-input=notfound-suggest-input --google-suggest /home/arimasou16/.config/fcitx/skk/SKK-JISYO.L.yaskkserv

[Install]
WantedBy=multi-user.target

今度はUser=arimasou16を追加する。ちゃんとした実行ユーザーでないとfile owner must be root or same euidとエラーになる。

$ sudo cp /home/arimasou16/yaskkserv.* /etc/systemd/system/
$ sudo systemctl list-unit-files --type=service | grep yaskkserv
yaskkserv.service                          disabled        enabled
$ sudo systemctl enable yaskkserv
$ sudo systemctl start yaskkserv

成功するのだけど、変換時に固まる。

arimasou16@Aerobookplus:~$ sudo systemctl status yaskkserv
● yaskkserv.service - Yet Another SKK server
     Loaded: loaded (/etc/systemd/system/yaskkserv.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-04-10 18:24:50 JST; 1s ago
TriggeredBy: ● yaskkserv.socket
   Main PID: 3140 (yaskkserv)
      Tasks: 1 (limit: 9325)
     Memory: 752.0K
     CGroup: /system.slice/yaskkserv.service
             └─3140 /usr/local/sbin/yaskkserv --google-japanese-input=notfound-suggest-input --google-suggest /home/arimasou16/.config/fcitx/skk/SKK-JISYO.L.yaskkserv

 4月 10 18:24:50 Aerobookplus systemd[1]: Started Yet Another SKK server.
 4月 10 18:24:50 Aerobookplus yaskkserv_hairy[3140]: google japanese input (protocol=https)
 4月 10 18:24:50 Aerobookplus yaskkserv_hairy[3140]: google suggest (protocol=https)

ふうむ、普通にコマンド打つときは問題ないのだけど、どうもsystemd経由だと上手く行かない。--no-daemonizeを付けても駄目。私の設定、やり方がおかしいのだろう。もしくは*** Warning : SD_LISTEN_FDS_START and sd_listen_fds are not foundがやはり影響しているのか…

skkservをアプリケーション自動起動に登録

しょうがないのでアプリケーション自動起動に

名称 コマンド システムトレイを待つ
Yet Another SKK server yaskkserv –google-japanese-input=notfound-suggest-input –google-suggest /home/arimasou16/.config/fcitx/skk/SKK-JISYO.L.yaskkserv

と登録する。

もしくは*~/.config/autostart/配下に アプリ.desktop を作成する。結果として同じである。ちなみにシステムとしてのアプリケーション自動起動の設定ディレクトリは/etc/xdg/autostartのようだ。

~/.config/autostart/Yet Another SKK server.desktop

[Desktop Entry]
Exec=yaskkserv --google-japanese-input=notfound-suggest-input --google-suggest /home/arimasou16/.config/fcitx/skk/SKK-JISYO.L.yaskkserv
Name=Yet Another SKK server
Type=Application
Version=1.0

これで行なった場合、

$ lsof -i:1178
COMMAND    PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
yaskkserv 1182 arimasou16    5u  IPv4  36107      0t0  TCP *:skkserv (LISTEN)

と起動される。

fcitx-skkへのSKKサーバー登録

順番が前後したけれども、fcitx-skkへのSKKサーバー登録のやりかたとしては、まずfcitx-skkの辞書マネージャーを使う。しかし、明らかに壊れている。一応は動いてるらしくて、一番上のボタンが追加となっている。

fcitx-skk
fcitx-skk
辞書マネージャー
辞書マネージャー
SKK辞書追加
SKK辞書追加

形式 ホスト ポート
SKKサーバー localhost 1178

と入力して、保存すれば設定される。が、再度開くと、見えない。

~/.config/fcitx/skk/dictionary_list から確認にできる。もしくは下になるようにこのファイルを編集してしまえば良い。

host=localhost,port=1178,type=server
file=$FCITX_CONFIG_DIR/skk/user.dict,mode=readwrite,type=file
file=/usr/share/skk/SKK-JISYO.L,mode=readonly,type=file

その他、このファイルの細かい設定については SKKな話 (fcitx-skk) – Omong Kosong Lagiが詳しい。

vimへのSKKサーバー登録

eskk.vimでの使用は簡単で、以下を追記するだけ。typeとか余計なものを付けると動かない。

let g:eskk#server = {
\  'host': 'localhost',
\  'port': 1178,
\}

fcitx-skkで変換できない

さて、このようにちゃんと?設定しているのに、nvimで試すとちゃんと変換されるのに、fcitx-skkからは変換できない。

fcitx-skk変換できない
fcitx-skk変換できない
vim変換できる
vim変換できる
vim変換できる
vim変換できる

しかも良く分からないのは、GUIから再起動すると固まってしまう。

fcitx再起動
fcitx再起動

しかし、fcitx-remote -rなら、問題なくできる。そして、その後はちゃんとGoogle日本語入力による変換が働く。

実行のタイミングによるものか?

sleep 10;fcitx-remote -rをアプケーション自動起動としても、駄目。うーん、毎回手動でこれをするのは嫌なんだが…


追記 2021-05-03
~/.profile に追記すればちゃんと有効化された
追記ここまで


  1. この記事書いてるときにあれこれ確認していて知った ↩︎