0%

必要になった経緯

ゲームサーバーを自宅で立てるとなると、外からでもそのサーバーにアクセスできる様にポート開放する必要がありますが、
引っ越しをしてからマンション共有の回線を使っているためにルーターの設定ができず、ポート開放できない環境なため別の方法を探しました。
ただ、回線の品質は特に悪くないので自分で回線を契約するのはちょっともったいない・・・と思い別の方法をとりました。
localtonet への課金もしてみましたが、複数のフォワーディングをしない限り無料枠で事足りそうな雰囲気

localtonet の使い方

localtonet に登録

とりあえず登録します。

token をコピー

ダッシュボードに表示される AuthToken をコピーしておく

image

tunnel を作成し起動しておく

My Tunnels > TCP - UDP から作成する

image

Protocol Type と Server, ローカルのポートを指定して Create
作成されたら Start もクリックしておく
image

サーバー側でやる事

localtonet をインストールして次のコマンドを実行

1
localtonet authtoken <token>

すると以下の様に tunnel が表示されれば OK
image

IP/Url に表示されたアドレスに接続できる様になっているはず。

ngrok じゃだめ?

ポートフォワーディングしてくれる有名なツールに ngrok がありますが、そちらは UDP のフォワーディングはできません。

その他所感

リージョンに日本がない・・・

どこのサーバーを経由するか選べますが、日本がありません。ngrok では勝手に日本サーバー使ってくれるけど・・・
中国を選んで使っていて以外とラグも感じないですが、日本サーバーが使えたらよかったな

2024/05/27 追記
日本が選べる様になってました!!
image

外部から見たポートの固定は有料でも無料でもできない

localtonet を起動する度に外部から見たポート番号が変わります。
なのでサーバーを複数人で利用している場合、 localtonet を再起動したあとは新しいポート番号の接続先を共有する必要が出てきます。
これは ngrok の有料プランだとできたとおもうので、ちょっとおしい

Arm 対応

最近ラズパイを活躍させようとしてるのでこれは非常にありがたい

環境

ubuntu 22.04,20.04

SteamCMD のインストール

1
2
sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
sudo apt install steamcmd

ゲームサーバーのインストール・アップデート

インストールもアップデートも以下コマンドでできる

1
steamcmd +login anonymous +app_update <appid> validate +quit

※ appid は SteamDB で確認、例えば 2394010 は palworld

このコマンドを実行すると、以下のディレクトリが作成される

  • ~/Steam

以下のディレクトリ以下に指定したゲームのサーバーファイルが保存される

  • ~/Steam/steamapps/common/

例えば palworld は以下になるが、さらにそれより下のファイルはゲームにより異なる

  • ~/Steam/steamapps/common/PalServer

vencord ってなに

以前から改造版 Discord クライアントとして主流な BetterDiscord がありましたが、
最近出てきた(私が見かける様になった)新しい 改造版 Discord クライアントです。

導入方法

ここを見て Discord PTB をインストールし、Discord PTB に Vencord を適用しました。Canary も前に入れてるので、3ついれてる。

【BetterDiscord超え】新改造版Discord、”Vencord”の入れ方とおすすめプラグイン - その1

Vencord を導入したら 設定 > Plugins から Translater を有効化しましょう。

image

あれ、日本語にならない。。。

image

日本語に翻訳させる方法

プラグインを有効化する時に設定画面を開くこともできるのですが、ここには変換先の言語を選べる所がないんですよね。。。

image

でも、プラグインのソースコードを漁っていたらなんだか変更できたりしちゃいそうな書き方になっている。

image

色々みていた結果、設定 > Plugin の画面で変更しているのはこのファイルの様でした。

%appdata%\Vencord\settings\settings.json

translate の設定部分も見つかったので見てみると、ありました。

image

receivedOutput を ja にして保存しましょう。

1
2
3
4
5
6
"Translate": {
"enabled": true,
"autoTranslate": false,
"receivedInput": "auto",
"receivedOutput": "ja"
},

また、英語の発言を右クリックして translate すると、できた。

image

GTX1080 から RTX 3090 に乗り換えたので、GPU-PV(旧名GPU-V) を改めて試してみようかなと
2020/11 頃に某ゲームを多重起動するために Windows 10 で実施していましたが、その時と手順は全く変わりませんでした。

現存する仮想マシンに GPU を使ってもらう方法

  1. DDA
    • グラボが限定されます
  2. Remote FX
    • 廃止済、今はできないはず
  3. GPU-PV(旧名GPU-P)
    • 今回はコレ

前提

  • ホストマシン
    • Windows 11 OSビルド 22621.1992
    • CPU: Ryzen9 3950X (16core/32threads)
    • GPU: RTX 3090
  • ゲストマシン
    • Windows 11

手順

0. Hyper-V を実行するホストマシンでは事前に以下の設定をしておく

  1. マザーボード側で VT-x または SR-IOV を有効化しておく
  2. Windows 側で Hyper-V を有効化しておく(機能の有効化)

1. Hyper-V で Windows 11 マシンを作成する

2. ホスト側 で以下コマンドを実行

Windows 11 マシンを停止し、管理者権限で以下 PowerShell を実行

1
2
3
4
5
6
$MachinName="Hyper-V 上のマシン名"
Add-VMGpuPartitionAdapter -VMName "${MachinName}"
Set-VMGpuPartitionAdapter -VMName "${MachinName}" -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000
Set-VM -GuestControlledCacheTypes $true -VMName "${MachinName}"
Set-VM -LowMemoryMappedIoSpace 1GB -VMName "${MachinName}"
Set-VM -HighMemoryMappedIoSpace 32GB -VMName "${MachinName}"

3. ホストマシンからゲストマシンへファイルをコピーする

ホストからのコピー元とゲストへのコピー先のパスが異なるので別々に記載、2つのファイルがあります。

以下の二つのファイルがコピー元

    1. PowerShell で以下を実行すると出てくるフォルダ丸ごと
      1
      2
      explorer.exe "$(Get-CimInstance -ClassName Win32_VideoController -Property * | Select-Object -ExpandProperty InstalledDisplayDrivers | Write-Output)".Split(",")[0].Trim("\nvldumdx.dll")
      例: C:\WINDOWS\System32\DriverStore\FileRepository\nv_dispi.inf_amd64_50916785244854f2
    1. C:\Windows\System32\nvapi64.dll

コピー先

    1. C:\Windows\System32\HostDriverStore\FileRepository\ #HostDriverStore 以下のフォルダは自身で作成してください。
    1. C:\Windows\System32\ #ホストと同じ場所

ここまで実施して再起動するとデバイスマネージャーに表示される
どこかに漏れがあるとビックリマークついてるかもしれません。

  • うまくいった例
    image

  • うまくいってない例
    image

どんな感じ?

ゲスト側のタスクマネージャでは GPU 表示されない

ゲスト側の使用率はゲスト側で見たかったんですけど見えず、0 % 表示

image

ただ FF14 ベンチが動作したので GPU は使えている様です

image

ホスト側 FF14ベンチ (4K)

image

ホスト側 FF14ベンチ (FullHD)

image

ゲスト側 FF14ベンチ (4K)

image

ゲスト側 FF14ベンチ (FullHD)

image

ゲスト側 FF14ベンチ (4K)

  • 設定値を少し変えた、わかりにくいですが、1桁あがっていたりしています。
    1
    Set-VMGpuPartitionAdapter -VMName "HyperVマシン名" -MinPartitionVRAM 1000000000 -MaxPartitionVRAM 1000000000 -OptimalPartitionVRAM 1000000000 -MinPartitionEncode 1000000000 -MaxPartitionEncode 1000000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 1000000000 -MaxPartitionDecode 1000000000 -OptimalPartitionDecode 1000000000 -MinPartitionCompute 1000000000 -MaxPartitionCompute 1000000000 -OptimalPartitionCompute 1000000000

image

  • 20230725追記
    設定値戻してもスコアがあがる事はありませんでした。何の差なんだ・・・

Surface Laptop 3 (4K)

手元にあった Surface でもベンチしました。驚愕のスコア

image

体感

GPU-PV ないよりはいいかも、な感じ
-> 20230725追記: 6000くらい出ている時は結構いい

参考にしたサイト

おまけ

これを管理者権限有効 PowerShell で実行すると拡張セッション無し解像度4Kが使える様になる

1
Set-VMVideo -VMName "HyperVマシン名" -HorizontalResolution 3840 -VerticalResolution 2160 -ResolutionType Single

コマンド

Get-Command は gcm の alias も持つので、置き換え可です。

コマンドがどこから参照されてるのか確認

1
2
3
4
5
6
7
8
9
> Get-Command echo
CommandType Name Version Source
----------- ---- ------- ------
Alias echo -> Write-Output

> Get-Command Write-Output
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Write-Output 3.1.0.0 Microsoft.PowerShell.Utility

参照元はどんなコマンドが使えるのか

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Get-Command -Module Microsoft.PowerShell.Utility

Cmdlet Get-Random 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Runspace 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-RunspaceDebug 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-TraceSource 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-TypeData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-UICulture 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Unique 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Get-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Group-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-Alias 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-Clixml 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-Csv 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-LocalizedData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Import-PSSession 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Invoke-Expression 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Invoke-RestMethod 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Invoke-WebRequest 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Measure-Command 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Measure-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Alias 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-TimeSpan 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet New-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-File 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-GridView 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-Printer 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Out-String 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Read-Host 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Register-EngineEvent 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Register-ObjectEvent 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-PSBreakpoint 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-TypeData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Remove-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-String 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-Xml 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Send-MailMessage 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Alias 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Date 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-PSBreakpoint 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-TraceSource 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Variable 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Show-Command 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Sort-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Start-Sleep 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Tee-Object 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Trace-Command 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Unblock-File 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Unregister-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Update-FormatData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Update-List 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Update-TypeData 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Wait-Debugger 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Wait-Event 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Debug 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Error 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Host 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Information 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Output 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Progress 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Verbose 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Write-Warning 3.1.0.0 Microsoft.PowerShell.Utility

所感

もっとはやくしりたかった

記事の更新の仕方すら忘れてしまいそうだったので何か書きこんどこうかなと

curl コマンド

1
2
3
4
5
6
7
curl https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer トークン" -d @- <<EOF
{
"model":"gpt-3.5-turbo-0301",
"messages": [{"role":"user","content":"こんにちは"}],
"temperature":0.7
}
EOF

ドキュメント

https://platform.openai.com/docs/guides/chat

java 1.17 を入れる手順も含むので空のVM 等で実施する事をお勧めします。

環境

ubuntu 20.04 on WSL で確認

コマンド

1
2
3
4
5
6
7
8
9
10
11
12
wget https://aka.ms/download-jdk/microsoft-jdk-17-linux-x64.tar.gz
tar -zxf microsoft-jdk-17*.tar.gz
cd jdk-17*
export JAVA_HOME=`pwd`
cd ..
export PATH=${JAVA_HOME}/bin:$PATH
java -version
mkdir SpringBoot
git clone https://github.com/spring-guides/gs-spring-boot-for-azure
cd gs-spring-boot-for-azure/complete
./mvnw clean package #Failed するかもしれませんが無視して起動できました。
./mvnw spring-boot:run

java-optsを指定する場合

環境変数 MAVEN_OPTS をいじります。

1
export MAVEN_OPTS="-javaagent:/root/SpringBoot/gs-spring-boot-for-azure/complete/applicationinsights-agent-3.4.13.jar";./mvnw spring-boot:run

参考

https://spring.pleiades.io/guides/gs/spring-boot-for-azure/

何でノイズフィルター?

OBS を使った配信環境を整えていますが、スマブラや太鼓の達人をやるときに遅延があると不利(太鼓の達人に至っては結構シビア)
な事がわかったので、OBS 上やソフトウェア上の映像を見ずに、モニターに映した画面を収録することにしました。
モニターのイヤホンジャックから、ミニプラグで音を取り、オーディオミキサーでPCの音とゲームの音を結合してみると、モニターからの音にノイズが乗っていました。(あるあるなんですけどね。)

そこでこうしました

old-haisinkankyou

sin-haisinkankyou

導入したノイズフィルター


1200円くらい、安い。

フェライトコアも試したが、、、効果無し

Sound Engine で音量を見ながらテストしましたが、フェライトコア (6ターン) はほとんど効果がありませんでした。

ノイズ対策 - なし

taisaku-nasi
60 くらいを上下してました

ノイズ対策 - フェライトコア 6 ターン

taisaku-feraitocore
60 くらいを上下してました(ただなんとなくノイズの質は変わった気がする)

ノイズ対策 - グランドループアイソレーター

taisaku-grandloopisolator
66 くらいを上下してました

このノイズの原理について調べた

逆流&ループが起きる場合があるそうです。
この動画を見て、なんとなく理解ができました。
フェライトコアではこの逆流とループは防げなそう。

image

https://www.youtube.com/watch?v=arYvWHUuX_Y

何で必要になったのか

VPS でも良いけど、固定費用やスペック等考えると
自宅のマシンに建てたい、でもサーバーの脆弱性(Minecraft の log4j 問題だったり)のリスクヘッジや
管理が面倒なのでホストOS ではなくて、仮想マシンに立ててネットワークもわけたい

外部ネットワークスイッチじゃだめなの?

Hyper-V で 外部ネットワーク のインターフェースを作る事で、
ホストマシンと同じネットワークの ローカル IP アドレスを得られます。
このIPを持った上で、ルーターの設定画面からポートフォワーディング(ポートマッピング)設定をするだけでもサーバー公開は可能
最初はこれでも良いと思っていましたが、外部ネットワークのスイッチを作成すると次の問題が発生しました。

  • 仮想マシンの上りの速度が激落ちしてた
  • ホストOS も 下りの速度が激落ちしてた
  • いつだって脆弱性のあるかもしれないサーバーがホストとネットワーク同じっていうのもちょっと怖い

改善策として 仮想ネットワーク アダプタ の offload を無効化する方法も色々な所に書いてあるが、解決しない

参照

手順

内部ネットワークのスイッチを作る

New-VMSwitch -SwitchName vnat -SwitchType Internal

この時に出てくる InterfaceIndex が次のコマンドで必要

作った内部ネットワークの IPレンジを指定

New-NetIPAddress -IPAddress 172.16.2.1 -PrefixLength 24 -InterfaceIndex 57

NAT ネットワークの作成

New-NetNat -Name vnat-nat -InternalIPInterfaceAddressPrefix 172.16.2.0/24

ポートフォワーディング(ポートマッピング)設定

Add-NetNatStaticMapping -NatName vnat -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.16.2.22 -ExternalPort 80 -Protocol TCP -InternalPort 8080

ホストのポート80 宛の通信が来た場合、172.16.2.22 のポート 8080 に送信する

この ネットワークは dhcp サーバーはないので、Windows のネットワークアダプタ設定や、
最近の ubuntu なら netplan による固定IP設定が必要

インターネットからアクセスできる様にするには、これだけではなくてルーターから ホストマシンへのポートフォワーディングも設定しておく必要がある

ノイズキャンセルが可能なツール

Krisp

他に知っているのは Krisp ですが、
こちらは基本有料。

しかし、Discord には Krisp が使える機能が搭載されているので、
Discord で使用する場合は特に難しい設定無く恩恵を受ける事が可能です。

https://krisp.ai/

RTX Voice

https://www.nvidia.com/en-us/geforce/guides/nvidia-rtx-voice-setup-guide/

こちらは RTX グラフィックボードが搭載されている場合に使用可能なツールとして公開されました。
しかしながら、RTX グラフィックボードを必要とするため、利用要件が高かった様です。
ただ、GTX シリーズを搭載している場合にも使用可能な使用方法や、
GTX シリーズでも使用可能になったという情報があります。

また、こちらも、再生デバイスが再生する音のノイズキャンセルも可能です。

使い方

https://www.nvidia.com/en-us/geforce/guides/nvidia-rtx-voice-setup-guide/

  1. 上記ページ内部の “For NVIDIA GeForce GTX GPUs, download RTX Voice.” からダウンロードし、インストールする

  2. RTX Voice の設定画面では、今現在使っているデバイスを選択しておく。

  3. 通話時にデバイス選択ができないツールを使う場合には、RTX Voice を既定のデバイスにしておくことで使用可能。

注意

再生デバイスが再生する音のノイズキャンセルは特にいらなかったので、
サウンドコントロールパネルから、再生 の RTX Voice は無効化していました。
すると、次回以降RTX Voice の起動に失敗する様になるので、おすすめしません。