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-VLinuxWindowsサブシステム、Virtual Machine Platform は入っていて、これらをアンインストール&再インストールでも変わらなかった。

この辺はダメだった。

解決

windows subsystem for linux - WSL Networking Error code: Wsl/Service/CreateInstance/CreateVm/ConfigureNetworking/HNS/0x80070424 - Stack Overflow

この記事だと「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
  • Snapshots & Timelapse
    • Snapshot URL : http://your-host-name:8001/snapshot

おまけ : 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 に以下を記載です。

"resolutions": {
"appium-webdriveragent": "^4.10.15"
}
}

良かった良かった。

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 で対処します。

target 'awesomeApp' do
:
post_install do |installer|
if RUBY_PLATFORM =~ /\Aarm64/
installer.pods_project
.build_configurations
.find {|conf| conf.name == 'Debug'}
.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
end
end
end

 

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"

これについて

개발 도구 – Kyuling Company

https://kyulingcompany.files.wordpress.com/2021/12/2021-12-21-19-31-03.png

openssl req -x509 -nodes -days 365 -subj /CN=Barrier -newkey rsa:4096 -keyout Barrier.pem -out Barrier.pem

と再構成することで治るようです (自分は治りました) 。

正直良くわかりません。