WSL2のネットワークが突然死んだ件
TL;DR
- 突然WSL2のネットワークが loopback だけになった
wsl.exe --install --no-distributionで治った(恐らくはコレが決め手)
突然WSL2のネットワークが loopback だけになった
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
CMD.exeから起動するとエラーが出ていた
$ wsl wsl: アクセスが拒否されました。 エラー コード: CreateInstance/CreateVm/ConfigureNetworking/HNS/E_ACCESSDENIED wsl: ネットワーク (networkingMode Nat) を構成できませんでした。ネットワークなしにフォールバックします。
とか
$ wsl wsl: VmSwitch 'wsl_switch' が見つかりませんでした。 エラー コード: CreateInstance/CreateVm/ConfigureNetworking/WSL_E_VMSWITCH_NOT_FOUND wsl: ネットワーク (networkingMode Bridged) を構成できませんでした。ネットワークなしにフォールバックします。
とか。
Hyper-V、Linux用Windowsサブシステム、Virtual Machine Platform は入っていて、これらをアンインストール&再インストールでも変わらなかった。
この辺はダメだった。
- Error code: Wsl/Service/CreateInstance/CreateVm/ConfigureNetworking/HNS/E_ACCESSDENIED · Issue #11980 · microsoft/WSL · GitHub
- WSL2 fails to start with Error code: Wsl/Service/CreateInstance/CreateVm/ConfigureNetworking/HNS/0x80070424 · Issue #10755 · microsoft/WSL · GitHub
解決
この記事だと「Hyper-Vとかを消せ」とあるけど wsl.exe --install --no-distribution だけで良かった。
信頼と実績の stack overflow (´ω`)
DebianにOctoPrintを入れる
Raspberry PI ではなく普通のDebianに入れます
TL;DR
- pip install で octoprint を入れて、systemd起動するようにサービス定義を書いて起動
- ustreamer を入れて、systemd起動するようにサービス定義を書いて起動
- FUN!
1. OctoPrintを入れる
ここを参考にしました
How to Install OctoPrint on Linux/Ubuntu | All3DP
1. 前提パッケージを入れる
sudo apt install python3 python3-pip python3-dev python3-setuptools python3-venv git libyaml-dev build-essential
2. OctoPrint起動ユーザーを作ってそこに準備する
# octo ユーザーを作って sudo useradd -m octo sudo usermod -a -G tty,dialout octo # そこへ移動して sudo su octo -c /bin/bash cd ~ mkdir OctoPrint && cd OctoPrint # OctoPrintを入れる python3 -m venv venv source venv/bin/activate pip install --no-cache-dir octoprint
3. /etc/systemd/system/octoprint.service を作る
cat <<__EOF__ > octoprint.service [Unit] Description=The snappy web interface for your 3D printer After=network-online.target Wants=network-online.target [Service] Environment="LC_ALL=C.UTF-8" Environment="LANG=C.UTF-8" Type=exec User=octo ExecStart=/home/octo/OctoPrint/venv/bin/octoprint [Install] WantedBy=multi-user.target __EOF__ sudo cp octoprint.service /etc/systemd/system/
4. 起動する
sudo systemctl enable octoprint.service sudo systemctl start octoprint.service
ブラウザから http://your-host-name:5000 で開ける筈です
ustreamer を入れる
OctoPrint の Control でWebCam表示するための準備です
1. ustreamerを入れる
# 入れて sudo apt install ustreamer # video を octo ユーザーから使えるようにする sudo usermod -a -G video octo
2. /etc/systemd/system/ustreamer.service を作る
/dev/video0 は他の名前になっているかもしれません
cat <<__EOF__ > ustreamer.service [Unit] Description=MJPEG Streaming After=network-online.target Wants=network-online.target [Service] Environment="LC_ALL=C.UTF-8" Environment="LANG=C.UTF-8" Type=exec User=octo ExecStart=/usr/bin/ustreamer -d /dev/video0 -s 0.0.0.0 -m MJPEG -r 640x480 -f 5 -p 8001 --device-timeout 8 --device-error-delay 8 [Install] WantedBy=multi-user.target __EOF__ sudo cp ustreamer.service /etc/systemd/system/
3. 起動する
sudo systemctl enable ustreamer.service sudo systemctl start ustreamer.service
4. OctoPrint に設定する
OctoPrint の OctoPrint Settings - Classic WebCam から以下を設定します
- Stream
- Stream URL :
http://your-host-name:8001/stream
- Stream URL :
- Snapshots & Timelapse
- Snapshot URL :
http://your-host-name:8001/snapshot
- Snapshot URL :
おまけ : http://your-host-name:5000 ではなく http://your-host-name で開けるようにする
nginx でリバースプロキシするならこんなかんじで
# いれて
sudo apt install nginx
# リバースプロキシのconfigを書いて
cat <<__EOF__ > octoprint.conf
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://localhost:5000;
}
}
___EOF__
sudo cp octoprint.conf /etc/nginx/conf.d/
# sites-enabled/default が邪魔になるので消して
sudo rm /etc/nginx/sites-enabled/default
# リロード
sudo systemctl reload nginx.service
ショボン玉( ´・ω・)y━。 o ○(´・ω・) 。 O (´・ω・)
Canonical Snapcraft - OctoPrint ... snap による OctoPrint なのですが
sudo apt update sudo apt install snapd sudo snap install core sudo snap install octoprint-pfs --edge
プリンタに接続できませんでした。
Changing monitoring state from "Offline" to "Detecting serial port" Serial port list: ['/dev/ttyUSB0', '/dev/ttyS3', '/dev/ttyS2', '/dev/ttyS1', '/dev/ttyS0'] Trying /dev/ttyUSB0 Could not connect to or enter programming mode on /dev/ttyUSB0, might not be a printer or just not allow programming mode Trying /dev/ttyS3 Could not connect to or enter programming mode on /dev/ttyS3, might not be a printer or just not allow programming mode Trying /dev/ttyS2 Could not connect to or enter programming mode on /dev/ttyS2, might not be a printer or just not allow programming mode Trying /dev/ttyS1 Could not connect to or enter programming mode on /dev/ttyS1, might not be a printer or just not allow programming mode Trying /dev/ttyS0 Could not connect to or enter programming mode on /dev/ttyS0, might not be a printer or just not allow programming mode Changing monitoring state from "Detecting serial port" to "Error: Failed to autodetect serial port, please set it manually." Failed to autodetect serial port, please set it manually.
ELB配下のnginxでリモートIPを使ってアクセス制限をしたい
TL;DR
- AWS ELB配下で動く nginx でIP制限をしたいが、ELBからのヘルスチェックは通したい
- ngx_http_geo_module でリモートIPを分別し、別途 $http_user_agent を確認しつつ制限する条件で 403 を返せば出来る
なぜそんなことを?
AWS Lightsail でコンテナを動かしつつIP制限をしたかったのですが、単に ngx_http_access_module の alllow/deny で処理すると ELB からのヘルスチェックも 403 になってしまいます。
リモートIPアドレスをどう分別する?
リモートIPアドレスをCIDRで表現しつつ分別したいのですが、これは ngx_http_geo_module で出来ます。
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
geo $remote_addr $is_allowed {
default 0;
1.1.1.0/24 1;
2.2.2.0/24 1;
}
まとめるとこう
リバースプロキシのコンフィグとして書くと ( /etc/nginx/http.d/default.conf )
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;geo $remote_addr $is_allowed {
default 0;
1.1.1.0/24 1;
2.2.2.0/24 1;
}server {
listen 80 default_server;location / {
if ($http_user_agent ~* "^ELB-HealthChecker/") {
set $is_allowed 1;
}
if ($is_allowed = 0) {
return 403 "Access Denied: $remote_addr\n";
}proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
ReactNativeのWebViewからAsset Pack のアセットを使う
TL;DR
- とあるReactNative (!=expo) アプリのインストールサイズが150MBを超えてしまったので、急遽 Asset Packを使う羽目になった。
- deliveryType = "install-time" を適用して分割はできたものの、WebViewから参照するにはどうするんだ?ってなった 。
- WebView から参照する目的では 何もしなくてよかった。
webViewAssetsをベースAPKから分離する・・為にAsset Packを準備する
このアプリでは元々対象ファイルを /webViewAssets/assets/ に配置して /android/app/build.gradle から以下で参照させていました。
android { : sourceSets { main { assets.srcDirs = [ "../../webViewAssets/assets" ] } } }
ネイティブまたは Java 向けのビルド | Android デベロッパー | Android Developers
に従って /android/webview_assets/src/main/assets/ ディレクトリ (ここに対象ファイルをコピーする) や /android/webview_assets/build.gradle , /android/app/build.gradle を記述します。
対象ファイルのコピー処理は、gradle でも出来る筈ですが、このアプリは gradle を呼び出すシェルスクリプトがあるのでそこでやりました。要調査です。
WebViewから参照する
このアプリでは WebView#source = { uri: 'file:///android_asset/index.html' } としてアセットにアクセスしていました。このまま動きます。
ローカルでAABの動作確認をする
アセット配信をテストする | Android デベロッパー | Android Developers
の記事に従うと、ビルドした AAB を元にAKPSを生成してローカルインストールできます。
生成したAPKSをunzipすると asset-slices/webview_assets-master.apk なるものがあることも判ります。
Play Store の App Bundle エクスプローラーで眺める
内部テストリリースの準備などで Play Store にAABをアップロードすると、App Bundle エクスプローラーの「配信」タブで「機能モジュール」とは別に「Asset packs」に「webview_assets」があることを確認できます。
通常のAPKビルドや開発時実行(react-native run-android)と棲み分ける
AABにしたくない状態では Asset Pack 部分は動作しない訳ですが、このアプリでは環境変数で gradle の動作を切り替えることにしました。
export ORG_GRADLE_PROJECT_USE_ASSET_PACK=t
でAsset Packを有効にする事にして、こんな感じ。
/android/app/build.gradle
android { : sourceSets { main { if (project.hasProperty('USE_ASSET_PACK')) { assets.srcDirs = ["../../webViewAssets/assets"] } } } if (project.hasProperty('USE_ASSET_PACK')) { assetPacks = [":webview_assets"] } }
appium で WebDriverAgentRunner_Runner.app がiOSシミュレータにすらインストールされずにテストできない件
appium を利用してiOSのインテグレーションテストをやっているのですが、ある日動かなくなりました。どうやら WebDriverAgentRunner-Runner.app がシミュレータにインストールされずテストが開始できない模様。
appiumをアプデ(1.x系最新・2.0-beta両方) してもダメでしたが WebDriverAgentRunner-Runner.app を司っている appium-webdriveragent を最新に強制 (3.16.0 → 4.10.15) に強制すると動くようになりました。
package.json に以下を記載です。
良かった良かった。
Podfile から Pods.xcodeproj の Build Active Architecture Only を NO
ずっと Intel Mac で ReactNative アプリをビルドしていたのですが Apple Silicon な Mac で react-native run-ios しようとすると以下のようなリンクエラーが山ほど出てしまいました。
building for ios simulator-x86_64 but attempting to link with file built for ios simulator-arm64
自分の場合は原因は2つでした。
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64" している
シミュレータ環境では arm64 をビルドするな、という設定ですね。
指定した理由を思い出せないのですが、消します。
Pods に対して Build Active Architecture Only の Debug が YES になっている
ここです。(スクショはNoに変更した後)

XCodeから編集しても pod install すると戻ってしまうので、ios/Podfile で対処します。
Barrierのサーバー設定で PEM_read_bio:no start line "barrier" エラーになったとき
キーボード/マウスを複数台のPC/Macで共有する Barrier のサーバー設定で、ssh-keygen で生成した Barrier.pem ファイルを C:/Users/<username>/AppData/Local/Barrier/SSL/ にコピーしてもエラーが発生する事があります (自分は発生しました) 。
SSL routines:PEM_read_bio:no start line "barrier"
これについて
openssl req -x509 -nodes -days 365 -subj /CN=Barrier -newkey rsa:4096 -keyout Barrier.pem -out Barrier.pem
と再構成することで治るようです (自分は治りました) 。
正直良くわかりません。
