WSL2でmikutterを動かす
WSL2すごいですね。みなさん使っていますか?僕は使っています。
WSL2 + Docker + VSCodeの環境ならWeb開発もあまり不自由なくできそう……ということで思い切ってメインマシンをWindowsにしたんですが、この環境の弱点の一つとして、令和三種の神器のひとつであるmikutterの動かし方があまり明らかではないという問題があります。WSL1でmikutterを動かすことについてはすでに id:cobodo さんによる記事があるんですが、WSL2だとネットワークが分離されているようで追加の設定が必要になっています。せっかくなので2020年7月現在の正解として、他の部分も含めてまとめておきます。
cobodoさんの記事はこれです。 cobodo.hateblo.jp
mikutterと必要なものを入れる
WSL2の身上は高速なディスクアクセスです。ゲストはホストを無視してLinuxのファイルシステムに書き込むので、普通にLinuxを使っているかのような速度でI/Oしてくれます。mikutterもちゃんと ~/mikutter
とかに入れてあげましょう。
$ cd ~ $ git clone git://mikutter.hachune.net/mikutter.git
まっさらなUbuntu(この記事では全面的にUbuntuを仮定します)にはあんまり開発に便利なものが入っておらず、一部gemのnative extensionを入れるときにコケるので入れます。あと依存ライブラリとフォントも入れます。不思議な旅をしたい人は 開発環境部分については bundle install
の出力とにらめっこしながら1つずつ解消していってもいいと思いますが、フォントは闇なのでおとなしく先人の知恵を借りたほうがいいと思います。
$ sudo apt update $ sudo apt install gcc make ruby libgtk2.0-dev libidn11-dev fonts-noto fonts-noto-cjk fonts-noto-mono ttf-ancient-fonts $ sudo gem install bundler $ bundle install --path=vendor
たぶん今からWSL2を始める人がUbuntuを入れると20.04が降ってくるんですが、Rubyはなんと2.7.0p0が入ります。Ubuntuで最新リリースが使えるなんて夢みたいですね(2020/7/4現在)。あと上記コマンドでは面倒なので bundler
をグローバルに入れています。どうせ仮想環境だし……。気になる人は rbenv
使ったり GEM_HOME
いじったりして頑張ってください。僕は大丈夫です。
X serverを立てる
VcXsrvを使ってWindows上にX serverを立てます。どうでもいいけどSourceforgeの見た目がきれいになっててびっくりしました。
WSL1ではWSL環境がWindowsと同一ホスト上で動いていたらしく DISPLAY=:0.0
を指定するだけでVcXsrvに繋げたようなのですが、WSL2ではネットワークが分離されたため、普通に繋ごうとするとWindowsのファイアウォールが邪魔をしてきます。"WSL2 Xorg"とかでぐぐると以下のStack Overflowが出てきます。
要点は
- VcXsrv起動時に"Disable access control"をチェックしておく
- VcXsrvのpublic domain上でのBlock ruleを無効化する(これがあると他のルールを無視して問答無用でブロックされるため)
- Public domain上でInboundのTCP 6000を開ける(環境によっては6000-6063を全部開けたほうがいいかも?)
DISPLAY
環境変数に接続先IPを指定する
の4点です。
2と3はWindows Defender Firewallのルールです。タスクバーの便利ボックスにWindows Defender Firewallとか入れると出てきます。Block rule無効化のやつはDisable access controlを忘れてWindows Defenderにファイアウォールを設定してもらうと作られる設定っぽいので、存在しないなら存在しないでよいです。Windows Defender Firewallでは以下のようにルールが見えます。Allowルールは緑のチェック、Blockルールは赤の止まれ、無効化されてるルールは無のアイコンが表示されます。
TCP 6000はX serverが待ち受けてるポートです。WSL2上で見えるIPはプライベートIPなのになんでPublic domainをいじる必要があるのかWindows初心者なのでいまいち分かってないですが、とりあえずこれで動きます。
今回はTCP 6000を開けるためにこんなルールを作りましたが、VcXsrvがこのポートで通信できればなんでもいいです。
上記SOからリンクされてるwsl-windows-toolbar-launcherのREADMEも情報としておすすめです。 github.com
DISPLAY
環境変数に入れるIPアドレスは /etc/resolve.conf
を見ると書いてあります。と上記SOに書いてあります。 ~/.profile
に以下の設定を書いとくとよいと思います。
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
SOの回答には export LIBGL_ALWAYS_INDIRECT=1
も書いてあるんですが、これが何をするのかよく分からないのと、mikutterに関してはなくても動いてるので無視してます。OpenGLを使うタイプのアプリケーションだと影響してくるのかな。
IMを入れる
WSLはunixソケットに対応していなくてdbusが使えない……という情報がインターネットで散見されますが、最近は使えるっぽいです。使えるのはうれしいので fcitx-mozc
を入れましょう。以下の記事がよくまとまっていますが、情報が古いためか不要な操作がそこそこ挟まっているようです。2020/7/4現在では本記事の通りにやればうまく動くはずです。
$ sudo apt install fcitx-mozc dbus-x11 $ fcitx-autostart
無事に起動したら fcitx-config-gtk3
からIMを設定して完了です。注意点なのですが、fcitx-autostart
は DISPLAY
環境変数が正しく設定されてない場合、正常終了したように見せかけて無の fcitx
を起動してきます。この状態で fcitx-config-gtk3
を起動するとdbusに繋げないよーみたいなログが端末に出てくるのと、IM一覧が空っぽになるので分かります。そうなってしまったら pkill fcitx
して再チャレンジしましょう。 fcitx-autostart
は謎が多く、エラーメッセージっぽいものが出ていても動作に支障がないことも多々あります。究極的には実際に日本語入力できるかどうかで判断するしかないと思います。
XやGTKやQtにIMを使ってもらうには環境変数を適切に設定する必要があります。~/.profile
とかに書いときましょう。
export XMODIFIERS=@im=fcitx export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx
mikutterを使う
念のため新しいWSLシェルを開いて実行すると環境変数の設定漏れとかが防げておすすめです。fcitxのデフォルトではCtrl + SpaceでIM切り替えです。
$ cd ~/mikutter $ bundle exec ruby mikutter.rb
𝕎𝕖𝕝𝕔𝕠𝕞𝕖 𝕥𝕠 𝕦𝕟𝕕𝕖𝕣𝕘𝕣𝕠𝕦𝕟𝕕...