wslにsshサーバーを立ててプライベートネットワークの他のPCから入る

windows11のアプデでPCがまともに起動しなくなったので色々やり直した。
毎回やり方わからなくなるので、自分用にメモ。
・ホストマシンが起動したら自動でsshサーバ立ち上げてくれて、
・ローカルマシンはssh/config設定した内容&鍵認証で入るだけ、
を目指す。

途中までホスト側で作業、最後の鍵登録でクライアント側に移る。


やったことは以下

ホスト側

wslのインストール

docs.microsoft.com
いつから変わったのか、ここにあるようにコマンドプロンプトなどで "wsl --install" と入力するだけでwsl(Ubuntu)を入れてくれました。らくちん。

VScodeのインストール

azure.microsoft.com
(どのページから行ったか忘れたけど)公式ページから入れるだけ。

wsl側のshスクリプト作成(wslのIPアドレス取得、ポートフォワードの設定)

参考
wsl2でsshサーバを起動し、外部からそこに接続 #Linux - Qiita


スクリプト

#!/bin/bash

IP=$(ifconfig eth0 | grep 'inet ' | awk '{print $2}')

netsh.exe interface portproxy delete v4tov4 listenport=22
netsh.exe interface portproxy add    v4tov4 listenport=22 connectaddress=$IP

sc.exe config iphlpsvc start=auto
sc.exe start  iphlpsvc

ifconfigがないと言われたので入れる
wsl

Command 'ifconfig' not found, but can be installed with:

sudo apt install net-tools


ポートフォワーディングの確認コマンド
コマンドプロンプト

netsh.exe interface portproxy show v4tov4

windows側のbatファイル作成(上記shの呼び出し、sshサーバ起動を行う)

batファイル

wsl --exec bash /home/port_fowarding_22.sh
wsl -u root --exec sudo service ssh restart

windowsファイアウォールの設定

出展忘れた。
sshのポートに対して、プライベートやパブリックどのネットワークから接続できるようにするか設定する。


ルーターの設定

ポート開放。
使っている機器の説明を参照。


タスクスケジューラでPC起動時にポートフォワーディング&サーバー起動

tkyonezu.com


公開鍵の登録の準備

まずパスワード認証を許可する(あとで戻す)
wsl

sudo vi /etc/ssh/sshd_config


PasswordAuthentication no
にする。
viの操作は
・"i"で編集モード?に変更
・該当箇所を編集
・"Esc"で編集モードを抜ける
・":wq"で保存(w)と終了(q)


もしなければ mkdir ~/.ssh しておく
ここでクライアント側の操作に移る。
鍵の登録が終わったら、先ほどと同じ手順でパスワード認証をnoに戻す

サーバー起動

wsl

sudo service ssh restart

このときに(もしくは前の手順だったかも)、鍵のファイルのpermissionがどうのこうのとエラーが出たら、
それに従って設定を変更する。
chmod +x ~~~
で行けたはず。



クライアント側

鍵生成

https://linuxfan.info/ssh-ed25519
ssh-keygenコマンドで作成できる。

  • t オプションで鍵の種類(暗号化のアルゴ)を指定できる。

指定しなくてもできるが、Ed25519が良いみたいな話をよく見るのでそれで作成した。

ssh-keygen -t ed25519

鍵登録

参考
qiita.com
色々方法はあるが、ssh-copy-idコマンドを使う

コマンドプロンプト

ssh-copy-id -i ($公開鍵のパス) ($接続先のアカウント名)@($接続先アドレス)


もしくはscpコマンド
SSHの鍵認証設定 #ssh公開鍵認証 - Qiita
scpでコピーしたあと、ホスト側でauthorized_keyに追加する必要がある。




追記 2023/10/31
いつからかPC起動時にsshサーバが自動起動しなくなっていた。
wslで

sudo service ssh restart

すれば起動するのでポートフォワードとかは生きているっぽい。
どこかのWindowsUpdateとかでタスクスケジューラが何か変になったとか?あとでなおす。

UnityでVisual Studio使うときに予測変換(Intelisence?)が出ない

最近Unityを触り始めました。
visual studio で予測変換(Intelisence?)が出ないな~、でもEditor Attachingの設定項目ないな~、と思っていたら使うエディタの設定が少し違ったようです。

docs.microsoft.com
Unityのエディタ画面から
Edit>Preferences>External Tools>External Script Editor のエディタ選択で、visual studioを選んで問題なければよし。
それでもIntelisenceが出ないときは、エディタ選択でBrows選んで
Program Files>MicrosoftVisualStudio>...>Common7>..>devenv.exe を選ぶ。(パスは環境による)
と、相変わらずEditor Attachingは出ないがIntelisenceが効くようになった。
おそらくUnityのバージョンが新しいとこうなるっぽい?



参考書にならってvisual studio入れたものの、
今までvisual studioはなんとなく敬遠してVScode使ってたので、
VScodeでできるようにしたい。
でも.NET SDKって何。

wsl2のdockerのkaggle公式イメージ(gpuあり)のコンテナに建てたjupyter-labにプライベートネットワークの他のPCから繋ぐ

いろいろ試行錯誤あったので自分用メモ
後でもう少し詳しく書く(はず)
やったことは以下


  • wsl2の有効化

詳しい説明がたくさんあるのでそちらを参照。
途中で山ほど見た。
後でリンク貼る。

  • docker及びnvidia-dockerのインストール

dockerはともかくnvidia何とかあたりをどうやったのか自分でも覚えていない。
この辺のサイトを見てやったと思う。
初心者がDocker + Ubuntu20.04でKaggleのGPU環境構築した備忘録 - Qiita
待ってました CUDA on WSL 2 - Qiita


  • kaggle環境のdockerfileを取得

buildにすごく時間かかる。
し、たまによくわからんエラーで止まる。
何度かコンテナやイメージを消してやり直したりしたらできてた。
kaggleの環境をdockerで再現 | VasteeLab


  • コンテナを起動
(wsl2)  docker run --runtime nvidia --rm -it -p 8080:8080 -v /home/hoge/kaggle-ws:/home/kaggle-ws --name kaggle-gpu  kaggle/python-gpu-build /bin/bash

こんな感じのコマンドでやった。
runじゃなくてstart,attachで--rmなしとかのほうがいいんですかね。dockerワカラナイ。
でもどこかでインスタンスは毎度消したほうがいいとかって見た気がする。

一応オプションについてメモ
あっているかはわからん。
・ --runtime nvidia : ランタイムをnvidiaのやつ(要はGPU?)使いますよということ?
・ -it : なんかコマンドの入出力をコンテナとホストでつないでくれるやつ?
・ --rm : コンテナ終了時(exitしたとき?)にインスタンスを自動削除してくれる
・ -p 8080:8080 : ホストとコンテナのポートフォワード?してくれる。jupyter-labはデフォルトが8080って見たので8080にした。
・ -v /hoge:/hogehoge : ホストとコンテナのディレクトリを共有してくれる。左がホスト右がコンテナ。ほんとは--mountオプションでやったほうがいいとか見たがうまくいかなかった。
・ --name kaggle-gpu : コンテナの名前つけ
・ kaggle/python-gpu-build : 起動するイメージ名
・ /bin/bash : 起動後にbash使えるようにしてくれる?
Dockerコンテナ内でKaggle APIをつかう - Qiita


  • kaggle.jsonを配置

~/.kaggleの下にkaggle.jsonを置く。
これでkaggle apiが使える。
GCPとkaggle公式イメージ(docker)でGPU環境の構築 - Qiita


  • jupyter-labを起動

使ったdockerイメージだと"run_jupyter.sh"なるものが用意されているのでこれを実行。
このスクリプトの中のオプションも大事っぽいがちゃんと調べてないので追々。

  • ローカルマシン(windows)-wslのポートフォワーディングの設定

コマンドプロンプトを管理者権限で実行して、↓のようなコマンドを実行。

netsh.exe interface portproxy add v4tov4 listenaddress=<ローカルマシンのipアドレス>listenport=8080 connectaddress=<wslのipアドレス> connectport=8080

WSL2で起動したサーバーに外部の端末からアクセスする – GUNMA GIS GEEK

他のPCからサーバ建てたPCに入れるように新しい受信規則を設定。
ネットワークはプライベートのみ。サーバPCのネットワークの変更も忘れずに。(ここで詰まった)
Windows10で特定のポートを開放する – Born Digital サポート
プライベート? パブリック? ネットワークの種類の違いと切り替え方 - いまさら聞けないWindows 10のTips - 窓の杜


  • 今回結局やらなかったけどこういうのもやりたい

公式Dockerとvscodeを使ったKaggleの環境構築 - Qiita
個人的にはgoogle colabのランタイムもリモートPCにつなぎたい。



とりあえずこんなところでしょうか。
最初はデスクトップの環境を寝ながらノートPCで使いたいというだけだったのに、思った以上に大変なことになった。
勉強不足。

set, lower_bound

setって順序つき集合になってたんですね。


なので、x以上の要素の値を取り出したかったら

auto iter = set.lower_bound(x);
int ans = *iter;

って感じでできそうです。

x"より大きい"なら upper_bound


これを知ってたらACできたやつ
atcoder.jp

クラスカル法

クラスカル法(英: Kruskal's algorithm)は、グラフ理論において重み付き連結グラフの最小全域木を求める最適化問題アルゴリズムである。(Wikipedia)
クラスカル法 - Wikipedia


使った例
Submission #24808238 - 競プロ典型 90 問


dsuを用いて軽い辺から使っていく感じ。