blog.garicchi.me



WSLでVPNに接続したとき、MTUを自動で切り替える

wsl

最近、仕事環境をネイティブのUbuntuからWSLに切り替えました。

しかし、WSLはVPN周りで問題があることがよく知られており、 自分の知っている範囲だと、以下の2点がよく話題になっているように見えます。

  1. WindowsでVPNに接続するとdnsがおかしくなる
  2. WindowsでVPNに接続するとMTU値が反映されなく、通信ができなくなる

そこで、最新のWSLではどうなっているのか試してみました。

MTU値の問題はまだある

Windows側でVPNに接続し、WSLで通信テストをしてみました。

テキトーなサーバーにping、dig、curl等を試してみた結果、digだけ通りました。

digが通ったということはdnsが正しく引けているはずなので、上述の1.の問題は解決していそうです。

pingが通らないというのは、MTU値に問題がある可能性があるので、 -s オプションで徐々にMTU値をいじって通信テストをしてみました。

すると、自分の環境ではMTU値が1372あたりを下回ったとき、通信ができました。

Windows側でMTU値を確認したところ、VPNのインターフェースはMTU値が1400であり、WSL側のeth0のMTU値は1500のままで、パケットがロストしていたようです。

そこで、下記コマンドでWSL側のMTU値を変更したところ、pingは通りました。

sudo ip link set dev eth0 mtu 1372

TLSのMTU値はさらに低い

しかし、curlでhttpsのサーバーに通信をしようとしたところ、timeoutになってしまいました。

curl -vを試してみたところ、下記部分で処理が止まっており、TLSのコネクションで問題が発生していそうでした。

* TLSv1.3 (OUT), TLS handshake, Client hello (1):

そこで、MTU値を変更しながら、curlでの通信テストをしていると、1257あたりで、TLSが通るようになりました。(この値はお使いのVPNサーバーに依存すると思われます)

したがって、VPNに接続した状態でWSLからhttps通信をするためには、かなりMTU値をさげないといけないことがわかりました。

VPNに接続したときにMTU値を自動で切り替えたい

とりあえずVPNに接続した状態でもWSLから通信をしたいのであれば、下記コマンドでMTU値を設定してあげればよいです。

sudo ip link set dev eth0 mtu {curlが通ったmtu値}

しかし、VPNに接続していないときに低いMTU値を使ってしまうと、通信速度の低下を招いてしまう恐れがあります。

そこで、なんとかしてWindows側のVPN接続を検知して、MTU値を切り替えれないか試してみることにしてみます。

NetworkChangeイベント

ネットワークが切り替わったタイミングを検知するためには、dotnetの System.Net.NetworkInformation.NetworkChangeを使えばよさそうです。

これをWSLからWindowsを経由して呼び出せれば、WSLからWindowsのVPN接続変更を検知できそうです。

powershellはdotnetのオブジェクトを呼び出せるので、下記のようなpowershellコードで、NetworkChangeイベントを受け取ることができます。

$onChangeNetwork = {
    Write-Host "Network Changed"
}

$networkChange = [System.Net.NetworkInformation.NetworkChange]
Register-ObjectEvent `
    -InputObject $networkChange `
    -EventName NetworkAddressChanged `
    -Action $onChangeNetwork | Out-Null

Wait-Event

WSLはexeを呼び出してWindows側のプロセスを起動できるので、あとは上記のようなpowershellをWSLで起動し、ネットワークの変更を検知したら ip link set でMTUを自動変更するsystemd unitを作ればよさそうです。

Read more...

在宅ワーカー、不眠症と戦う (2024年令和最新版)

insomnia

2020年あたりに不眠症に対するブログを書いた気がするのですが1、それから数年経って、戦い方も少し変わったので改めてまとめてみます。

前提条件

不眠症には様々な原因があると思いますが、自分の場合はおそらく概日リズム睡眠障害というもので、簡単に言うと昼夜逆転が治らないというやつです。

世の中には対人関係や環境による精神疾患が不眠症につながる場合があるので、そのような不眠症と思われる人は、まずその環境改善を努力するのが良さそうで、この記事の方法は参考にならないかと思います。

体質については、以下の通りで、自分でも概日リズム睡眠障害の才能があるなと思います。

  • フルタイム在宅ワーカー(通勤なし)
  • 毎日ディスプレイの光を浴びるプログラマー
  • 心配性 (自立神経をコントロールできない)

あと、自分は医師免許を持っていないのでこの記事に書いてあることに責任は持てません。あくまで、不眠症当事者としての経験から得られたことを書きます。

太平洋側の南向きの4階以上の部屋に引っ越す

在宅ワーカーが不眠症と戦う時にまず重要なのは、 徹底的に日光に当たれる環境を作る だと思います。

なぜ日光に当たるのが良いかというと、セロトニンという物質が分泌され、体内時計がリセットされるらしいからです。

どうも、早朝に太陽光を浴びるとセロトニンが分泌され、朝セロトニンが分泌されていると、夜になると自動的にメラトニンという眠気を誘発する物質が分泌されるらしいです。

科学的な根拠は全然知らないので効果に責任は持てないですが、不眠症当事者としての経験上、やはり朝日光を浴びると夜いい感じに寝れた気がします。 あと、活力も湧いてメンタルも安定するので仕事のパフォーマンスも上がるバフ付きです。

それを叶えてくれる環境が、 太平洋側の南向き4階以上の部屋 です。

ご存知の通り、太陽は東から登って西に沈み、南向きの部屋が一番日射時間が長いです。

真南に向いている部屋が理想ですが、最低でも南東向きの部屋に引っ越しましょう。間違っても北向きの部屋に住んではいけません。めちゃめちゃ暗いと思います。

また、階数も重要です。南向きでも、1階とかに住んでる場合、他の建物が邪魔をして日光が入りません。 自分はかつて東向きの1階に住んでいたことがありましたが、日光は入らないので洗濯物は乾かないし、車の振動音とかが直に入ってきて在宅ワーク環境としてはかなり辛いものでした。

太平洋側のというのは、一般的に日本海側は天気がどんよりしている場所が多いと思われる2からです。 自分の実家は日本海側の田舎にあるのですが、やはり山に囲まれていて、日射時間がものすごく短かったです。

したがって、今日光が入りにくい環境に住んでいるのであれば、太平洋側の南向き4階以上の部屋への引っ越しを検討しましょう。 引っ越しはお金がかかりますが、個人的には十分元が取れると思います。

引っ越しが難しい人は、マンスリーマンションを探して、まずは実験をしてみるのも良いかと思います。

バナナとコーヒーを朝食にする

どうも食事とセロトニンは密接に結びついているようで、朝食をしっかり取ることでセロトニンの分泌が促されるそうです。

特に、朝食にバナナを食べるとセロトニンが出やすくなるそうです(要出典)。 セロトニンだけでなく、朝バナナを食べると腸にも優しく快便になるし、メンタルも安定します。

朝から快便でメンタルも安定すると、経験上、仕事のパフォーマンスがめちゃくちゃ上がります。

また、朝に豆から挽いたコーヒーで、強めのカフェインを摂取することで眠気が飛びます。

したがって、朝食にはバナナと豆から挽いたコーヒーがおすすめです。

朝活の習慣をつける

在宅ワークの厄介なところとしては、朝起きなくても良いというところだと思います。

朝起きる動機がなければ、朝日光を浴びるためにアラームを付けても、起きるための気力が湧いてこず、眠気に負けてしまいます。

そこで、毎朝作業をやる習慣を作りましょう。

例えば、毎朝仕事以外の趣味をする習慣にすれば自分の人生がより豊かになるし、 資格の勉強をする習慣にすれば自分のキャリア形成にも繋がります。

また、一般的にも言われていることですが、朝の脳の集中力はすごいです。 朝の集中力を利用して、やりたかったことをやるのが、不眠解消にも人生の豊かさにもつながると思われます。

20時以降は仕事をしない。翌日の朝にする

経験上、「これはマジだ」と思うことがあって、 20時以降、ディスプレイを見る仕事をすると眠りにくくなります 特にプログラマーは、仕事=ディスプレイを見て頭を使う なので、仕事をすると目と脳が冴えてしまって眠りにくくなると思います。

緊急対応とかなら仕方がないですが、夜やり残した仕事があって、それが翌日に回せるものなら、 夜やるのではなく、翌日の朝やりましょう。

どうしても解決出来なかった課題が一旦寝て翌日にやるとすんなり解決した。というのはよくあることだと思いますが、その効果も期待できます。

不眠症は夜に勝負するのではなく、朝の行動で結果が変わると思います。

夜スマホは見てもいいことにする。ただし輝度を暗くする

これは賛否両論だと思うので強く個人的意見とさせてください。

不眠症で睡眠外来に行くと、ほぼ確実に「夜スマホを見る習慣をやめましょう」と言われると思いますが、 個人的な経験上、見たほうがよく眠れた日が多い気がします。

その理由として、スマホを見ると脳がリラックスできる可能性があります。

現代人として、寝る前にyoutubeなどを見る習慣がある人は多いと思いますが、 youtubeを見ると、脳のリソースを使わずによりリラックスできることが多い気がしています。

逆に夜スマートフォンを一切触らない場合、何もしない時間が個人的に苦痛になります。

したがって、「スマホを見てディスプレイの光を浴びてしまう」か「スマホを見ずに脳がリラックスされない」かのトレードオフとなっていると思います。

個人的に現代人からスマホを切り離すことは難しいと思っているので、「スマホのディスプレイの光を浴びてでも、脳をリラックスさせたほうが眠りやすい」と思っています。

そして、最近のスマホは輝度や色の設定を変更することが出来ます。 Androidで言えば、「お休みモード」みたいな機能があって、夜21時以降はスマホの輝度を最低にして、色をグレースケールに自動ですることができます。

グレースケールにすればかなり目にも優しく、睡眠を阻害しにくいと思われます。

運動をして体を疲れさせる

在宅ワーカー、特にプログラマーにとっては苦痛かもしれませんが、運動をしましょう。

在宅ワークは脳は疲れますが、体は疲れず、体が疲れないとやはり眠りにくいと思います。

Read more...

WSL+MSYS2+fishが結構良い

windows

Windowsのターミナル環境をどうするか

自分は普段からPOSIXベースなターミナル環境で開発するのが好きで、 仕事をするときはThinkPad、Ubuntu、tmux、oh-my-zsh、Jetbrains系、VSCodeを使ってました。

趣味用のPCはSurface Laptop 4で、Windowsが入っているのですが、 Jetbrains系のWSLサポートがちょっともう少しなところがあって、若干文鎮化してました。

そこで、最近SurfaceにUbuntuをネイティブ環境として入れようとしたら、 UbuntuをLVMでディスク暗号化をすると、起動時に暗号化キーを入れるところでキーボードが反応しないという問題にぶち当たりました。

ディスク暗号化は絶対にしたいのでちょっとSurfaceにUbuntuを直接入れるのは厳しいかなーという気持ちになりました。

結局SurfaceにはWindowsを入れるしかなくなったのですが、tmuxが使いたいのと、POSIXが良いということで、 WSLを使わざるを得なくなりました。

しかし、Jetbrains系のエディタをWSLでフルに使うことは難しい。というところで詰んでいたのですが、 最近WSLでもGUIアプリが動く というのを思い出し、使ってみました。

するとこれが意外にもちゃんと動いて、WSLに入れたchromeやJetbrains系エディタがなんのストレスもなく動きました。 これは良いものだということで、せっかくなのでWindowsをちゃんと開発機として使うべく、環境を整えることにしました。

WSL GUI

WSL上で動くGUIアプリはLinuxの世界なので、デフォルトだと日本語入力ができません。

そこで、fcitx-mozcを入れて、日本語入力環境を整えます。 gnomeならibus-mozcもありますが、WSL GUIだとibus mozcの設定画面でフリーズするのでfcitxのほうが良かったです。

ここらへんを参考にして日本語入力環境を整えます。 https://kazblog.hateblo.jp/entry/2018/05/28/221242

これでWSL上でJetbrains系のエディタを使ってストレスフリーに開発ができます。

MSYS2を使う

次にWindows側の話なのですが、Windows側でもやはりPOSIX系のターミナルがほしいところです。

以前はgit bashを使っていたのですが、コマンド履歴補完とtmuxのセットアップが難しく、諦めていました。 しかし、MSYS2を使えば、pacmanでtmuxをインストールできるし、oh-my-zshもインストールできるので、 これはWindowsでも快適なPOSIXターミナルが作れるのではと思いました。

しかし、MSYS2でoh-my-zshの環境を整えたところ、かなり挙動が遅く、日常使いは難しいと感じました。

そこで、fish shellを試してみたところ、これがかなり素早く動作し、 しかもコマンド履歴補完もデフォルトでついてくるという嬉しいものでした。

fishはPOSIXと互換のある文法ではないので、bashのスクリプトから変換作業が必要にはなりますが、 それでもだいぶbashに近い感覚でwindowsを操作できます。

ただ、MSYS2+fishでtmuxを立ち上げると、 tmux open terminal failed: not a terminal が出てしまいます。 そこで、以下のスクリプトを用意しておいて、これを使用してtmuxを立ち上げることにしました。

#!/bin/bash -e

script -c tmux /dev/null

これでWindowsでもPOSIX(っぽい)ターミナル + tmux + コマンド履歴補完 を手に入れることができました。

終わりに

MSYS2とWSL GUIとfishを使うことで、WindowsとWSLのターミナルの操作性をかなり近づけることができ、だいぶストレスフリーになりました。

WSL GUIは、こんなにもちゃんと動くと思っていなかったので、Jetbrains系がWindowsPCでPOSIX系ターミナルと合わせて使えて大変満足です。

Previous Page 2 of 2