• 作成:
  • 更新:

Windows 10とWSL2のセットアップログ

久しぶりにWindowsのセットアップを行いました。

2021-12-08から書き始めていたようです。今更ログを公開します。

もう何度もWindowsのセットアップは行っているので見返したいのと、他の人が詰まってたら助けになるようにセットアップをログに残しておきます。

近々またセットアップすることが予想されますし。何故なら近いうちにDDR5世代のPCを組んでWindows 11を入れたいからです。

いい加減セットアップはスクリプトにするべきなのかもしれませんが、 GUI操作が必要なのがまだまだ多いのと、今回はMSYS2ではなくWSL2設定で色々と違うので、ある程度手動で探っていく必要がありました。

なぜ今なのにWindows 11じゃなくてWindows 10をセットアップしたのか

私がメインにしているPCに使っているCPUが初代AMD Ryzen Threadripper 1950Xで、 Windows 11をサポートしているのは第2世代Ryzenからなので、ギリギリアウトで使えないからです。 TPMも1.2で2.0の要件を満たしてないですしね。

レジストリを弄るとかで検証をスキップできることは知っていますが、後から動かなくなったらしんどすぎます。 Windows 10とWindows 11のゲーム性能(DirectStorageとか)以外の違いで欲しいのは、今の所WSLgとモニタ電源オフ時のウィンドウの混乱防止ぐらいかなと思っているので、 Windows 10で良いやと判断しました。

セットアップしてる時にシステムでのDNS over HTTPSとか様々なWindows 11限定機能(非Preview)を目にして、どんどんWindows 11にしたくなりましたが…

DDR5対応のRyzen 7000が来るのが思ったより遅かった。

余談ですが、 CPUを対応製品に変えたらWindows 11にする予定ですが、セキュアブートってインストールした後に無効に出来るんですかね?

私はわざわざ管理者権限を奪取しなくても機密情報は一般ユーザ権限で十分に取れる(例: ブラウザのCookie)と思っているので、あんまりセキュアブートはセキュリティ向上に寄与しないと考えています。なので無効化して解決出来るなら満足してしまうんですよね。不特定多数の人が常時触れるPCなら話は別かもしれませんが。

もしセキュアブートは大いなる意義があると知っている人が居たら教えて下さい。

無効化して動かしててある日いきなりWindows Updateが降ってこなくなったら嫌だなあ。

一応Gentooでも以下のようにインストールできて、 User:Sakaki/Sakaki's EFI Install Guide/Creating and Booting the Minimal-Install Image on USB - Gentoo Wiki Linuxカーネルの更新のたびに署名を走らせるスクリプトを動かせばなんとかなると思いますが面倒ですね… セキュアブートの性質上後から切り替えるのは面倒ですし。当然最初のLiveUSBの時点でセキュアブートしないといけない。

なぜMSYS2ではなくWSL2を使用するのか

これまで私はWindowsの開発環境を構築するのに、 WSLはメインで使わず、 MSYS2にWindows向けネイティブコンパイルされたGNU Emacsを使ってきていました。

Windows Terminalでmsys2のzshをscoopのPATHを有効化しつつ使う - ncaq

WSLを使っている人が多いのに何故そうしていたかと言うと、簡単に言うと、 Windowsの部分を弄りたいならWindows向けにビルドされたソフトウェアを使ったほうが良いし、 WSLを使うならLinuxをネイティブブートすれば良いじゃんと思っているからですね。

では何故今回変わってWSLを使うのかと言うと、ネイティブのLinuxが政治層の都合で使えないからです。 VirtualBoxはマルチモニタをサポートしているようなので、それでLinuxをブートするという手も考えましたが、オーバーヘッドを考えるとFirefoxなどはネイティブで動かしたいので、 VirtualBoxとの連携が面倒そうなのと、 VirtualBoxでは使えるリソース(主にGPU)が限られていることを考えると、 WSL2の軽量仮想マシンの方が優れていると考えました。

なぜGentooではなくUbuntuを使用するのか

最近(6年ぐらい?)は何にでもGentooを使っていましたが、今回はGentooではなくUbuntuを使うことにしました。

理由は3つあります。

1つ目はGentooはほぼ全てをユーザ側でコンパイルするので、既にWSL2でメモリ管理が厳しいということを知っていたので、パッケージのインストール作業で一々破滅しないか心配だったというものです。これは実際使ってみたらメモリ解放スクリプトを定期的に手動で実行しないと厳しいと感じたので、逆に問題なかった気もします…

2つ目はWSLはSystemdでも他のよく知られているinitシステムでもない、 MS独自のinitを使っているため、公式にWSL2をサポートしていないディストリビューションを使うと、色々とトラブルがあるのではないかと危惧したためです。これもどうせSystemdを無理矢理動かした方が楽な気がしてきました。

3つ目はWSL使うという時点でいつもの方法とは違う複雑なことをやるのに、これ以上複雑性を持ち込みたく無かったからです。しかし今考えるとGentooを使わないと言うのはそれはそれでいつもと違う複雑なことですね…

今の所全体的にパッケージが古いという問題にぶち当たってます。我慢できなくなったらGentooやArchなどに切り替えるかもしれません。もしくはNixを上に被せるか。

EFIパーティションの生成の工夫

インストール時にEFIパーティションが別ディスクに存在しているとEFIパーティションを新しく作らず、既存のEFIパーティションを上書きしてくるので、 GRUBで複数のWindowsのブートを管理した時のトラブルシューティングメモ - ncaq のようにGRUBで呼び分けしたい場合は、インストール時には他のディスクを外す必要があります。

これに気が付かずに既存のEFIパーティションをぶっ壊されて悲しかったです。

もちろんWindowsの起動時にWindows Boot Managerで利用するパーティションを選ぶことは出来ますが、分かりやすく名前をつけてリストで選択できるGRUBに比べると、 Windows Boot Managerは選択画面が分かり難すぎます。

GRUBの工夫

GRUB2で前回終了したOSで再起動する(Ubuntu 16.04 LTS) - Qiita みたいに設定しておくとWindows Updateなどで元のWindowsを再起動させられるので便利です。これまで知らなかった…

セットアップ時はオフラインにする

ユーザのディレクトリ名は自由に決めたいのでセットアップ寸前にEthernetを抜いておきましょう。

Windows10初期設定でMicrosoftアカウントを作成せずにセットアップする方法 - スキルアップ戦隊! PCレンジャー!!

winget, choco, scoop

現代的なOSでパッケージ管理ツールは必須でしょう。 Windowsのためのパッケージ管理ツールは色々ありますが、今回は、

の3つを利用することにしました。後から考えると、 Chocolateyはインストール時のエラーをちゃんと扱えなかったりするので要らなかったかもしれません。

wingetはMSストアと連携してるのか最初から入っているのが楽なので良いですね。ストア経由じゃないのは単にインストールウィザードをそのまま実行してるのばかりで、放置していると勝手にデスクトップアイコンが出来たり、勝手に再起動したりするので他の作業しながらソフトウェアアップグレードは出来ないですが。

次はwingetとscoopさえあれば十分でしょう。

ちなみにMSストア版でインストールしたら日本語表示設定が出来ないとか普通にあるので、そういうのは個別にインストールしましょう。

Firefoxは真面目にパッケージしているので普通にMSストア版が使えました。

wingetの使用にgsudoが便利

wingetでインストールしていたパッケージを全部アップグレードするコマンドは、 winget upgrade --allですが、このコマンドはそれぞれインストールウィザードを動かすものなので、それぞれのパッケージごとにUACのプロンプトで管理者権限を求められます。せっかく一括アップグレードなのにそれは面倒ですよね。

管理者権限で動かすにしても、 Windows Terminalのタブ単位で管理者権限で実行は出来ないので、新しいWindows Terminalを管理者権限で動かす必要がありますし。それは面倒です。

そこで、 gerardog/gsudo: A Sudo for Windows - run elevated without spawning a new Console Host Window を使います。これを実行すれば一回だけのUAC承諾で済みます。私はWindows TerminalのショートカットでPowerShellのタブを開いてこれを実行しています。

Dvorak入力をしつつGoogle日本語入力を使う

Windows10(20H2)で、外部ツールなしでDvorak配列を使う - Qiita の方法がまだ普通に使えるようです。

sharpkeysでCaps LockをCtrlに

randyrants/sharpkeys: SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. を使うと面倒なレジストリの操作をラップしてくれて、 Caps LockをCtrlに出来ます。 scoopでインストール出来ます。

ちなみに、 PowerToysのキー入れ替え機能はCaps LockのCtrl置き換えには全く使えません。 Caps Lockのトグル式とかの特性を全く考慮しないで置き換えるので。具体的にどういう状態になるのかは忘れちゃったけど全然使い物にならなかった気がします。

RTCをUTCにする

時刻 - ArchWiki を見ます。

何故かLinuxネイティブの方でJSTの時刻設定が行われていたので効いてないのかと思ってびっくりしました。これはWindowsへの冤罪でした。

Meiryo UIも大っきらい

UIフォントを好きなものにするには、 Meiryo UIも大っきらい!!の詳細情報 : Vector ソフトを探す!である程度置き換えが効きます。

それでもある程度のシステム標準を使ってるダイアログぐらいにしか効きませんが。

MSゴシックを多少マシにする

MSゴシック(MS Pゴシック)のビットマップが汚すぎて読みにくすぎて悶絶していました。この4K時代のモニタにビットマップ埋め込みを表示するのは絶対におかしい。

特にSlackのコードスニペットの日本語部分はMSゴシックのままなので、改善要望は投げましたが一向に改善されなくてつらい…

MSゴシックの字形自体をそこまで忌み嫌っているわけではない(好きでもないけど)が、アンチエイリアスが効かないのは厳しすぎる。

しかしMSゴシックを他のフォントに置き換えるのは10年前ぐらいにはやってた気がしますが、システムが不安定になったり文字幅の問題で表示されない領域が出来てしまったりした記憶があるのでやりたくない。

そういう愚痴を垂れ流していたら、ビットマップを除去したフォントを生成するツールを教えてもらいました。

m13253/FaithType: Modify fonts to remove bitmap and disable gridfit for Windows font rendering

これを使うとビットマップを除去したフォント一覧を作ってくれます。ファイル自体を置き換えるわけではないのでシステムにも安心。

HOMEディレクトリなどはWSL2専用にしましょう

セットアップする時はHOMEの多重管理が面倒なので、 MSYS2の時みたいにWindowsのHOMEディレクトリとWSL2のものを一緒にしようかと思いました。

パーミッションなどのトラブルはあるでしょうが、そちらの方が楽に管理できるかなと思いかけました。

ですがやめましょう。 WSL1ですらWindows側とファイルをやり取りすると遅くなるのに、 WSL2は更にクロスの遣り取りをすると遅くなるようです。

タダでさえLinuxネイティブに比べてyarn installとかが遅くなるのにそれではやっていけません。

WSL2内部で完結してる場合はIOパフォーマンスが向上しているようなので、なるべくそこで完結させましょう。

Git Credential Manager Coreのセットアップでかなりハマってしまった

GitCredentialManager/git-credential-manager: Secure, cross-platform Git credential storage with authentication to GitHub, Azure Repos, and other popular Git hosting services. を使うだけなんですが、既存の設定ファイルを編集することで謎のエラーを出して大変ハマってしまっていました。

何故かgit config設定が正しく読み込まれませんでした。

まともな編集環境を手にれるまでは素直にコマンドラインで、

git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager-core.exe"

などと打ち込んで、後で設定ファイルをいじりましょう。

MSも推奨しています。 git-credential-manager/wsl.md at main · GitCredentialManager/git-credential-manager

Windows 11使えないからWSLg使えない

Windows 11でもないですし、 Windows 10のPreviewでもないのでWSLgが使えません。

代替を探しました。

GWSL

調べてみた所、 GWSL | gwsl というツールが比較的便利だと思いました。

VcXsrvのラッパーなのですが、 LinuxのGUIアプリケーションを認識して、まるでWindowsアプリケーションのようにスタートアップに貼り付けられたりします。それを起動するとサーバを自動で起動するので、あまりXサーバを意識しておく必要性がありません。

色々と自動で設定してくれるので、慣れないWindows側で色々と設定する必要がありません。

.profileに日本語が入ってると動かない

Pythonでのファイルopen時にエンコード指定されてないから、日本語Windowsだとcp932であるとファイルを自動推定して、 9割型ASCIIかUTF-8であろう.profieを読み込めません。

2021-12-07 00:57:32,949 - GWSL 1.4.0 - ERROR - Exception occurred - Error in Mainloop
Traceback (most recent call last):
  File "manager.py", line 4451, in <module>
  File "manager.py", line 4061, in draw
  File "manager.py", line 4014, in apper
  File "manager.py", line 2266, in app_launcher
  File "manager.py", line 2805, in spawn_n_run
  File "wsl_tools.py", line 191, in profile
UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 586: illegal multibyte sequence

のようなエラーログになります。

.profileの内容をASCIIだけにすれば問題ありません。今私はそうしてます。

修正出来そうなのでPR作りました。 fixed: when non ASCII character in .profile on CJK Windows by ncaq · Pull Request #125 · Opticos/GWSL-Source Pythonあんまり得意じゃないから間違ってるかもしれません。

2022年にもなって海外製ソフトウェアの文字コード問題に気を使わないといけないとかWindowsホンマ… 一時的に痛みを伴うとは思いますが、 UTF-8をデフォルトにして以前の挙動は互換モードに押し込めるとかやってほしい。永久にプログラマを国ごとに違う文字コードで悩ませるわけにもいかないでしょう。

.profileをLinuxとWindowsで共有したい

GWSLは.profileにXの場所などを自動追記します。自分は.profileをGitで管理しているので、なるべくブランチ分けたりせずに共有したいです。

最後の方に追記するので、 WSLでなければ読み込みをそこで終えるように書きました。

# Do not run GWSL commands in a non-WSL environment.
if ! grep -q "WSL" "/proc/sys/kernel/osrelease"; then
  return
fi

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0 #GWSL
export PULSE_SERVER=tcp:$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}') #GWSL
export LIBGL_ALWAYS_INDIRECT=1 #GWSL

Dvorak設定が効かない

Xサーバ側でキーボードを管理するのでWindows側のDvorak設定は効かないです。 -xkbvariant dvorakをオプションに押し込める必要があるでしょう。

今現在の私のGWSLの設定プロファイルは以下のようになっています。

"multi-dvorak": ["-wgl", "-multiwindow", "-xkbvariant", "dvorak"]

Emacs起動時のウィンドウが異常に大きい

Emacsを起動するとマルチウィンドウに跨って巨大なウィンドウが生成されて、ごちゃごちゃ弄ってメニューの最大化ボタンを押すとやっとマトモに一つのウィンドウに収まるというよく分からない挙動をしていました。画面をはみ出しているので右上の最大化ボタンを押すのにも一苦労です。まあ右クリックとかから最大化押せば良いんですが。

(leaf frame :config (toggle-frame-maximized))        ; 全画面化

と設定していましたが、これをコメントアウトすると最大化しないので、楽に最大化出来るようになります。しかし一々最大化ボタンを押すのは面倒… タイミングの問題なのかな。

(leaf frame :hook (after-init-hook . toggle-frame-maximized)) ; 全画面化

これでどうでしょう。ダメです。 Emacsサイドから最大化するとどうやってもダメなようですね。

Windows側で設定する。 GWSLによってEmacsはショートカット登録してあるからこの方法が使えるはず。 Windows 10でプログラムを常に最大化して開く方法 - Lenovo Support VE

使えなかった… X11のウィンドウは既に起動しているからとかかなあ。

GWSLを全て閉じてEmacsのショートカットから起動しても無効。

VcXsrvのコマンドラインオプションでどうにかならないかと考え中。 VcXsrv Windows X Server / Wiki / Using VcXsrv Windows X Server をちゃんと読む。

-multimonitorsオプションが存在する。 xrandrをx11-xserver-utilsでインストールして動かしてみると一つのモニタとして認識されてるしそのせいかもしれません。オプションを試してみましょう。変わらなかった… xrandrの結果も変わらない。

と言うかtoggle-frame-maximizedでどうにかしようとするのは根本的におかしいと気が付きました。これはあくまでEmacsのフレーム(ウィンドウ)を最大化する操作であって、 VcXsrvが作るウィンドウを最大化するわけではない。

諦めました

毎回最大化ボタンとかキーを押すことにします。

普通ならここまで毎回作業が必要なものは諦めないのですが、 Windows 11になればWSLgが使えるのでVcXsrvに向き合う必要が無いことに気がついたためです。

思い出してみたらKeyhacでS-;を押すだけで最大化出来るようになっているのでそこまでの手間でもないですね。

Keyhacの工夫次第でXサーバ越しのアプリケーションに接続できる

以前からWindowsを使う時に使っている、 Keyhac ですが、これまではウィンドウのクラス名やプロセス名で使うキーマップを判断していたので、全部Xサーバのプロセス名になる場合どうすれば良いのか少し悩みました。

window.getText()でウィンドウタイトルが取れるため、プロセス名とタイトル名のプレフィクスで判断すれば良いですね。

Emacsのウィンドウタイトルの最初に必ずemacsという文字列が来るように設定を変更しました。

Fakeymacsの利用を検討しています

smzht/fakeymacs: Emacs-like key bindings for Keyhac

これを弄って自分のキーバインドに変更することを考えています。

これを使いたい一番のポイントはC-Spcでマークを出来るので、シフトキー押しながら色々やる必要が無くなることです。

しかしこれは普通のEmacsキーバインドの再現に特化しているので、自分のようにhtnsbdfにカーソル周りを再割当てしているとちょっと工夫が必要そうです。なので大変そうだなと少し躊躇しています。

Keyhacを使っているならばThunderbirdはシステムの通知を利用するようにするべきかも

システムの通知を使ってないと独自の通知がウィンドウとして扱われるので、キーボードでのフォーカス移動が吸われます。

システムの通知もデザインそんなに悪くない。

しかしなんかシステムの通知にしてるからか通知が見えないことも結構あるのでどうするか困りものです。

EmacsでWSLの時だけ必要項目を設定する

ncaq/.emacs.d: My Emacs config. をGitで管理しているので、共有して管理したいです。

portageみたいにスクリプトが動かないならともかく、 Emacs Lispでの設定なので、内部で分岐したいです。

(leaf f
  :ensure t
  :require t
  :defun f-read-text
  :config
  (defvar system-type-wsl
    (string-match-p "WSL" (f-read-text "/proc/sys/kernel/osrelease"))
    "EmacsがWSLで動いているか?"))

のように書くことで変数を設定して分岐しています。

Emacsでmozcツール経由でGoogle日本語入力を使う

emacs-mozc を動かすための設定(Emacs 設定編) - NTEmacs @ ウィキ - atwiki(アットウィキ)

にだいたい載ってました。

私のようにGoogle日本語入力/Mozcのキーマップを変更している場合、

(advice-add 'mozc-session-execute-command
            :after (lambda (&rest args)
                     (when (eq (nth 0 args) 'CreateSession)
                       (mozc-session-sendkey '(Henkan)))))

で押されるキーが変換モード切り換えに設定されてないとダメです。

EmacsでURL開く時にWindows側のブラウザを使う

browse-url-browser-functionを弄れば良いことが分かります。しかしURL対応だけならそれでコマンドプロンプトを呼び出すとかすれば良いことは分かりますが、他のファイル開く時もWindows側で開く汎用的な方法がほしい。画像とかPDFとか。

そこで、 4U6U57/wsl-open: Open files with xdg-open on Bash for Windows in Windows applications. Read only mirror from GitLab, see link を使うことにしました。

(leaf *wsl
  :leaf-autoload nil
  :when system-type-wsl
  :custom
  (browse-url-generic-program . "wsl-open")
  (browse-url-browser-function . 'browse-url-generic))

のようにするとWindowsの既定のブラウザでURLを開けます。

Ubuntu 20.04 LTS公式リポジトリに入っているEmacs 26ではposframeが動かない

tumashu/company-posframe はウィンドウをまたぐような補完ウィンドウを出しても正常に動くので便利に使っていたのですが、セットアップした環境では幅が0になって動きませんでした。

WSL2を疑ったのですがそこは関係ありませんでした。 tumashu/posframe: Pop a posframe (just a child-frame) at point, posframe is a GNU ELPA package! によるとmacOS版ではEmacs 26で動くらしいですが、 Gtk(つまりGNU/Linux)ではEmacs 27が必要らしいです。

そしてこの20.04 LTS (Focal Fossa)に入っているEmacsは26です。これはPPA追加などで27にする必要がありそうですね。このEmacs 26はJSONネイティブサポートなどもなくてパフォーマンスにも難がありますし。

問題が出てきてもUbuntuを使おうとしてるのが間違ってるような気がしなくも無いですが、まあUbuntuで問題になってるのがこれだけだとして、他のGentooやArchなどで問題が起きたらあまり変わらないですし、 NixOSの導入もこれだけでやるのもなあという感じです。

今回は、 Emacs stable releases : Kevin Kelley を使うことにします。

なんか初回起動時だけ一瞬描画されなくて、選択カーソルを動かすと描画される問題がある気がしますが、初回だけで、それもカーソルを動かすと動くので問題ないということにします。

再現条件が不明なのですが、 lspのドキュメント表示などで時たまframeが消えないので他でframeを開いて消す必要があったりしますね… Linuxネイティブでは起きなかったのですが。少しストレスです。

前から知ってたツールのTClockがメンテナンス引き継がれていて変態ツールになっていた

時刻の秒数表示されてくれないのが苦痛だったので調べたのですが、縮小版のタスクバーを使っている場合はフォーマットを弄っても出力出来ないようです。

でも縮小版は使いたいし前から知ってるフリーソフトを久々に使おうかなと思いました。 TClockです。

ところで、 TClockはオリジナルの作者が引退したのか(よく知らない)、 Windows 10やWindows 11に対応したり、モバイルユーザのためなのか通信量を月ごとにカウントする機能が付いてたりする変態ツールになってました。

TClock-Win10

まあ自分は外でWindows使うことは滅多に無いので通信量チェックとかは関係ないのですが、他のツール入れたりして補完しようとしていたCPU使用量やメモリ使用量が常に見れるのはありがたいですね。

今の自分の書式は以下になっています。

CU__x"%" MUPG"G" mm/dd ddd hh:nn:ss

メモリの書式がマニュアルと違わないか? と思って問い合わせしてみたら爆速で返答が帰って来ました。

WSLでupdatedb自動化

まだやってません。ほしい時にupdatedbをエイリアスuで実行してます。

ネットワークが遅い

git pushとかがLinuxネイティブに比べて異様に遅く感じます。レイテンシもスループットも遅い。

によると、デバイスマネージャから、 Hyper-V Virtual Ethernet Adapterの詳細設定からLarge Send Offload Version 2をIPv4, IPv6それぞれ無効化してやると良いらしいです。

何か副作用とかあるかもしれなくて怖いですが、とりあえずやってみるべきでしょう。

無効化前のspeedtest-cliの速度は、

2021-12-09T20:06:38 ❯ speedtest-cli
Retrieving speedtest.net configuration...
Testing from (一応隠します)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Rakuten Mobile, Inc (Tokyo) [19.63 km]: 33.103 ms
Testing download speed................................................................................
Download: 58.19 Mbit/s
Testing upload speed......................................................................................................
Upload: 10.35 Mbit/s

無効化後は、

2021-12-09T20:08:50 ❯ speedtest-cli
Retrieving speedtest.net configuration...
Testing from (一応隠します) ...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by SERVG.NET MG-Network (Tokyo) [20.07 km]: 38.876 ms
Testing download speed................................................................................
Download: 63.47 Mbit/s
Testing upload speed......................................................................................................
Upload: 10.52 Mbit/s

変わりませんね… 設定変更した後Hyper-V自体の再起動が必要とか?

再起動後は、

2021-12-09T20:14:33 ❯ speedtest-cli
Retrieving speedtest.net configuration...
Testing from (一応隠します)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Rakuten Mobile, Inc (Tokyo) [19.63 km]: 34.728 ms
Testing download speed................................................................................
Download: 71.41 Mbit/s
Testing upload speed......................................................................................................
Upload: 10.16 Mbit/s

うーん変わらない。

あれっもう一度デバイスマネージャ見て該当項目見たら設定がEnabledに戻ってますね。

再起動するとEnabledに戻ってしまいますね、元々変えられないフィールドだったんですかね。

IPv6は無効化したくないですね…

そもそもこのissueに書き込んでる人ほど壊滅的に遅いわけではない(いや10Mbit/sは遅いのでは?)ので、仮想ネットワークを使っている以上速度低下は避けられないと甘んじて受け入れるべきなのかもしれません。

そもそもissueがopenのままになっている時点で私がちょこちょこやるだけで簡単に解決できるものではない気がします。

DNSサーバをpublic DNSのものにはあまりしたくないですねえ。

とりあえず諦めます。

タイトルバー消したい

主にFirefoxやEmacsなんですが、タイトルバー要らないので非表示にしたい。タスクバーの通知アイコンは欲しいけど、それタイトルバーと一本化してほしいよね。

とりあえず目に痛い真っ白なタイトルバーは、設定/個人用設定/色/以下の場所にアクセントカラーを表示します/タイトルバーとウィンドウの境界線で灰色にしてマシに出来ましたが。

Firefoxもタブバーとタイトルバーがデフォルトの設定で同化していてタブバーをuserChrome.cssで消すことは出来るんですが、右上の閉じるボタンは消せませんでした。タイトルバーを同化させずに表示させてるほうがまだマシ感がありますね。

メモリ食い過ぎ

WSL2によるホストのメモリ枯渇を防ぐための暫定対処 - Qiita に書かれているような問題が発生しました。

2021-12-10T19:57:03 [✖ ERROR  1] ❯ free -h
              total        used        free      shared  buff/cache   available
Mem:           24Gi       6.8Gi       6.6Gi       365Mi        11Gi        17Gi
Swap:         7.0Gi          0B       7.0Gi

なのでWSL側が握っているファイルキャッシュをワンコマンドで削除したいなと思いました。起動してるdockerコンテナを再起動したくは無いのであくまでファイルキャッシュだけを削除したいです。

しかしsystemdが無いと削除出来ない? 普通にsystemdなしでも削除できました。

sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
2021-12-10T20:07:34 ❯ free -h
              total        used        free      shared  buff/cache   available
Mem:           24Gi       6.7Gi        17Gi       365Mi       1.0Gi        17Gi
Swap:         7.0Gi          0B       7.0Gi

というわけでメモリ開放を行うスクリプトを書きました。重くなったと思ったら実行しないといけないのは面倒ですが、仮想マシンの性質上仕方がない気もしますね。

#!/usr/bin/sudo zsh
set -eu

# WSLなどで際限なくメモリをキャッシュなどに確保して、
# ホスト側メモリを食い尽くした時に、
# 再起動無しでメモリを開放するためのコマンドです。

sync
echo 3 > /proc/sys/vm/drop_caches
echo 1 > /proc/sys/vm/compact_memory

これをmemory-compactコマンドとしてインストールしてメモリが足りなくなってきたら手動で実行してます。

mikutterを動かす

TweetDeckを別ウィンドウで動かすとかも考えましたけどやっぱりmikutterですよねえ。

gtk3に移行したしWindowsネイティブで動かないか試してみたけどやっぱりglib2のインストールが出来なくて死にますね。 WSL側で動かしましょう。

起動自体はすんなり動きました。

しかし挙動がやたらと遅い気がします。

WSL2でDvorakで日本語入力する

mikutterのためだけにそこそこ重いmozcサーバを立ち上げたくなかったんですが、 EmacsみたいにホストWindows側のGoogle日本語入力と通信する方法は無いみたいなので諦めてmozcを立ち上げることにします。

ネイティブLinuxでibusを使っていたので特に理由が無いのでそのままibusを使うことに。みんなfcitxを使っているみたいですが。

環境変数を.profileに指定してibus-daemon --daemonize --xim --replaceするようにしても動かない。

export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export DefaultIMModule=ibus

ibus-daemon --daemonize --xim --replace

何故?

mozc-utils-guiが入ってないな、入れてみますか。

設定立ち上げて理解しました、 UbuntuのMozcのバージョンが古いので、ネイティブLinuxとかで使ってるxdg準拠の ~/.config/mozcではなく、 .mozcからしか設定を読み込みません。

なので日本語入力有効化キーバインドが効かなかったというわけですね。

これで設定は反映された… のですが、やはり日本語入力を有効にすることが出来ない。 wslのshutdownとかも試してみたのですが無意味。

ibus-setupしてみるとデーモン動いてないぞ警告が出てきますね。

ibus-setupはデーモンをstartしたと出してくるのでこれを起動したままなら…と思いましたが無意味。

wsl2/ibus.md at master · eliranwong/wsl2 を見てみるとim-config動かせって出てくるので動かしてみます。

明示的にユーザ設定を作るかという質問に「はい」と答えて.xinputrcを生成。

XサーバとWSLを再起動。

変わりません。

無理そうなのでfcitxを使用

一回ibusやめてみることにしてみました。 ibusの独自機能とか使ってるわけでも無いので、そんなにibusに執着する意味は無いことに気が付きました。

fcitxを使ってみます。

.profileで、 fcitx-autostart > /dev/null 2>&1 する必要があってターミナルの新規タブ開くのがどんどん遅くなってくるのを感じます。 .xprofileとかに分離すれば良いのかも?

fcitxもfcitx-mozcも入ってるのに設定画面で入力メソッドにMozcが表示されない… と言うか何も表示されないので何も追加できません。アドオン一覧にMozcは表示されてるんですが。

wsl再起動もしてるんだけど、何故?

[SOLVED]no input method shown in fcitx configuration - Linux Mint Forums 見た感じだと設定ファイルが競合したりするとダメらしい? 何? よく分からないのでとりあえずその通りに全部消して再実行します。

fcitx関係全部消してfcitx-mozcだけをインストールしましたが、やはり何も表示されません。

fcitx-diagnoseを実行してみたら、

 **Cannot find DBus name `org.fcitx.Fcitx` owner.**
 **Cannot find `gtk-query-immodules` for gtk 3**

みたいなのが現れて怪しそうだけど解決方法がよく分からない。

というかこの中身だとmozcがメソッドとして出て来るんですよね、なんで設定ダイアログだと出てこないんですか。

アップデート後Fcitxで日本語入力ができなくなる | 普段使いのArch Linux 見たらfctix-imのインストールで治ったとか見たのでaptの方で検索してみたら、 fcitx-imlistが出てきました。なんか違うけどとりあえずインストール。無解決。

デフォルトのfcitxだから最新のim moduleとか対応してないのでは。 fcitx5をインストールしてみましょう。設定エディタないんかい。

fcitx-diagnose fails to find gtk-query-immodules and plugins · Issue #296 · fcitx/fcitx の解決案(解決してないみたいだけど…) のfcitx-libs-devのインストールやってみましょう。無解決。

手動でリンク貼りに行くので嫌だったんですが、 Install fcitx in Linux Mint 18.3 (Ubuntu 16.04) の解決方法を試してみましょう。 fcitx-diagnoseのエラーは減ったんですが、やはりメソッドは出現しません。

~/.config/fcitx/profile にはmozc書かれてるしもうこれを直接編集してやれば設定ダイアログが仕事しなくても入力出来るんじゃないかと思いました。 EnabledIMList=mozc:True,fcitx-keyboard-us:True と書き換えました。日本語入力出来ました。意味不明。なんでダイアログが仕事しなかったんだろう…

しかし問題が完全に解決したわけではなく、変換候補ウィンドウが表示されないなどの問題がありますね。

なんか設定ファイル直接弄ってたら急にファイル内部のメソッドが爆発するかのように選択肢が増えて、ダイアログでも表示されるようになったんですが何? 因果が全然わからないです。なんでこれまで表示されなかったんですか?

変換候補が表示されなかったのはフォントサイズが0だったからみたいですね。なんでデフォルトがそんな値なんですか?

Mozcを最上段に設置するとDvorakではなくQWERTYとして認識されてしまう。 ibusではMozcを最上段、次をDvorakとして設定すればDvorakでMozcを使えたのですが。逆にMozcを最上段にしない場合はMozcのキーショートカットを使えないのでまずIMEが有効に出来ない。

他の人には何故か不評らしいですが、 ibusのMozcとして固定してMozc内部の日本語入力と直接入力を切り替える方式の方が、 WindowsでもLinuxでも同じ感覚で使えて便利なのですが…

仕方がないので、 Show Advanced Optionsで、 Activate input methodに自分がMozcでも使ってる有効化キーバインドCtrl+.を設定して、 Mozcを二段目にしてUS-Dvorakを1段目にして一応解決しました。

改行に使ってるShift+EnterC-mをマッピングしていると吸われる問題は、 Scroll beetween Input Methodを適当にCTRL_SUPERとかに変更すると解決しました。

これ素直にセットアップするとせっかくEmacsをWindowsのGoogle日本語入力と連携するようにしたのにfcitx経由になってしまいます。まあ実害ないかと思いましたが、変換中のキー制御がちょっと怪しい気がするのでmikutter専用にしましょう。

mikutterの起動スクリプトを以下のようにして完成。

#!/usr/bin/env bash
set -eu

cd ~/Desktop/mikutter/

# WSL環境でmikutter専用にfcitxを使います。
if grep -q "WSL" "/proc/sys/kernel/osrelease"; then
  export GTK_IM_MODULE=fcitx
  export QT_IM_MODULE=fcitx
  export XMODIFIERS=@im=fcitx
  export DefaultIMModule=fcitx

  fcitx-autostart > /dev/null 2>&1
fi

exec ./mikutter.rb "$@"

WSLで今の所使いたいGUIアプリはEmacsとmikutterだけなので。これでTerminalで新しいzshを立ち上げるたびに一々遅いとかの問題も解決ですね。

VcXsrvのWindowsとのクリップボード共有が頻繁に動かなくなります

ログにはエラー出てましたが、詳細な原因が不明です。

winClipboardFlushXEvents - OpenClipboard () failed: 00000005

発生したらXサーバを再起動するしかなく、それにはXを利用するアプリを全て再起動する必要があります。非常にだるい。

Windows 10/WSL2 で X Server ソフト X410 を使ってみる - Qiita とか見ると自分の環境だけの問題では無いみたいですね。

WSLgには備え付けのクリップボード共有機能があるみたいなので、現状でどうにかしてもあんまり利益が無いなという気持ちがあります。

WSLgも別の原因だと思いますが、クリップボードの共有にトラブルがあるとかなんとか聞きますが。

ほとんど問題になるのはEmacsとの送受信なので、 Emacs側で直接Windowsのクリップボードコマンドを触るという手段もあるかもしれませんが、これもWSLgで解決してしまう問題でしょうし微妙に思えてしまいます。なんかEmacsのWSLgとの間でクリップボード共有うまく動かないとかいう情報もありますが、どちらにせよこれを解決する方法とGWSLをうまく使う方法は別でしょうね。

大きいデータをコピーしないように気をつけながら使うしかなさそうですね。

万が一バグったときには、 Windows Terminalに貼り付けて、 zshでキルすることで少なくともテキストは移動できます。

久々のWindowsの感想

多少まともな環境セットアップに2週間ぐらいかかりました。仕事も並行してやってたので全部ではないですが。これだけでもかなりの損失です。

多少まともにしてもかなりストレスが溜まります。主なストレス要因は、

  • Xとのクリップボード共有が不明な理由で時々壊れる
  • WSLとWindowsでメモリが分かれるからか、メモリが足りないことが頻発する
    • 足りなくなるたびにmemory-compactコマンドを実行する必要があって悲しい気持ちになります
  • Linuxアプリの起動が遅い
  • WSL内部ですらGitなど細かいファイルIOを行うアプリケーションが遅い
    • 遅いのはプロセス起動かもしれません
    • Windows側のファイルシステムで動かすと激しく重い
  • posframeなどGUI関係が不安定
  • やっぱりフォントが汚い
    • ビットマップなしでもMS Pゴシックなどを見ると不安定な気分になります
  • WindowsとLinuxの両方のディレクトリを気にする必要があり、Windowsのファイルは全て実行権限があるので気安く使えない
  • WSLが不完全なのでGUIアプリケーションなどをWindows側でビルドしないといけないことがあり、激しくストレスになる
  • WSL内部の開発ツールとWindowsネイティブで動いているツール(主にwebブラウザ)との連携が地獄
  • xmonadのカスタマイズ性能に遠く追いついていない
    • 特定のウィンドウが来たらマルチモニタの特定のモニタで起動するようにしたい、具体的にはWindows Terminal

などがありますね。

Windows 11のWSLgと、新しいマシンのメモリ増量(32GB -> 64GBを予定) で解決されることを願いたいですね。

逆にLinuxネイティブに比べて良い所を上げます。

NVIDIA Broadcastが使えます。

以上です。いや色々考えたんですが、今の所これぐらいしか無かったんです。

ゲーム機として使うならLinuxなんて目じゃないんですが、これ仕事用のOSとして使う話ですからね。同じようにAmazon Prime VideoのDRMの制限の話とかも仕事のマシンなので使いませんし。まあ今は自然言語処理とかweb関係とかの仕事ばかりやっているので、 Unityでゲームの処理やるとかの仕事が回ってきたらWindowsの方が楽だったりするのかもしれませんが。 (一応Unity EditorはLinux版があるのですが、前使ってみたら激しく不安定だったので)

早くLinuxネイティブに戻りたいと思っています。

MSYS2と比べたWSL2の感想

WSL自体は前使ってみたときよりだいぶ楽になった感じがします。 Windows環境での開発をする時も、ちゃんとLinuxしているので色々なツールがMSYS2より素直に動いてくれることが多いので、今後は基本的にはMSYS2ではなくWSL2を使おうと思っています。

これまで習得してきた小技が使えるのはやっぱり嬉しいですね。

問題なのはGUIアプリケーションで、 Windows向けにビルドしたものと比べてWindows用のX11を介して動くので仕方ないのですが、色々と不安定だったりパフォーマンスが悪かったりします。これこそWSLgで改善していくと良いですね。