ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

モニターのソースを DP --> HDMI --> DP の順で切り替えたとき、 DP がシグナルなしになる

再現手順

  • 最初
    • DisplayPort の映像(PC)が表示されている状態
  • ソースを HDMI に切り替える
    • PS5 の画面が映る
  • ソースを DIsplayPort に切り替える
    • 画面が真っ暗なまま
    • モニターの OSD で「シグナルが検出されません」が表示される

環境

解決方法

  • モニターの設定で DDC/CI を無効化する --> ダメだった

Windows 10 で謎の暗転がしばしば発生する問題が解決した

# 症状

  • ツクールMZ製のゲームを起動した時、1秒程度の画面暗転が何回か発生する
  • 動画再生中のブラウザ(chrome)をウィンドウをメインウィンドウ・サブウィンドウ間で移動させた時、1秒程度の画面暗転が発生する
  • 画面暗転というのは、ゲームのウィンドウ・フルスクリーンを切り替えた時のアレに近い感じ

# 問題点

  • フルスクリーンに切り替えてないのに、フルスクリーンに切り替えた時みたいな暗転が発生してキモい
  • 操作不能な時間が発生してウザい
  • 原因が意味不明でつらい

# 解決方法

  • NVIDIA コントロールパネルで設定をいじって、可能な限り nVIdia 側でオーバーライドさせる

# 詳細

## ディスプレイ > 解像度の変更

  • NVIDIAのカラー設定を使用」にチェック入れる
  • グループ内の設定は「最高(32 ビット)」「RGB」「8 bpc」「限定」

## ディスプレイ > デスクトップ カラー設定の調整

  • 「リファレンスモードに上書き」にチェックを入れる
    • 多分これが効いた(その1)

## ディスプレイ > デスクトップのサイズと位置の調整 > スケーリング

  • 「縦横比(S)」にチェックを入れる
  • 「ゲームとプログラムによって設定されているスケーリングモードを上書きする(O)」にチェックを入れる

## ディスプレイ > デスクトップのサイズと位置の調整 > サイズ

  • 「デスクトップのサイズ変更を有効にする(N)」のチェックを外す(元々チェックされてないはず)

## ビデオ > ビデオカラー設定の調整

  • NVIDIA の設定を使用(N)」にチェックを入れる
    • 多分これが効いた(その2)

## ビデオ > ビデオイメージ設定の調整

  • NVIDIAの設定を使用(S)」にチェックを入れる
  • NVIDIAの設定を使用(N)」にチェックを入れる

# なぜ直るのか?

  • 多分 windows 側でロクでもないこと(ユーザーが注視しているコンテンツに合わせてディスプレイの色モード変えるとか)をしている
  • nVidia 側の設定を変更することで、そうういったロクでもないフローに入らなくなる
  • 証拠ないから、ただの推測だけどね

# 参考

Eigen3 の eulerAngles の値域

eulerAngles

eigen.tuxfamily.org

使い方

  • 回転行列からオイラー角に変換できる。
  • 0, 1, 2 を渡した場合、回転順序は X <-- Y <-- Z になる
using namespace Eigen;

const Vector3f originalInEuler= { 0.2f, 0.4f, 0.6f };
const AngleAxisf originalInAa = 
    AngleAxisf( originalInEuler(0), Vector3f::UnitX() ) *
    AngleAxisf( originalInEuler(1), Vector3f::UnitY() ) *
    AngleAxisf( originalInEuler(2), Vector3f::UnitZ() );
const Vector3f resultInEuler = Quaternionf(originalInAa).toRotationMatrix().eulerAngles(0, 1, 2);

オイラー角の値域

ドキュメントより

  • X : [0, +180] deg
  • Y : [-180, +180] deg
  • Z : [-180, +180] deg

問題点

  • X 回転が 0 <--> 180 deg で不連続になる
  • -180 <--> 180 deg なら ±360 deg の補正をかけることで連続扱いできるが、 0 <--> 180 deg だとどうあがいても不連続
  • そのため、真の X 回転がほぼ 0 deg ちょうどの場合でも、数値誤差で 0 deg がでたり 180 deg が出たりする
  • ±180 deg で不連続なのは想定内として、 0 deg で不連続なのは場合によっては不便

じゃあどうするのか?

※以下は引数に 0, 1, 2 を渡した場合の話

  • X 回転を求めるのに atan2 を使っているので、直接得られるのは [-180, +180] の値
  • それを [-180, 0] に収まるように、 atan2 で得られた値が 0 deg 以上なら -180 deg の補正を行っている (最後にオイラー角の符号を反転させているので、計算途中の値は符号が反転している)
  • この -180 deg 補正のフローに入る分岐を削除したオレオレ eulerAngles を作ればいい (幸い、 Eigen3 はヘッダオンリーだからソースは見れるし、 eulerAngles は実装自体は結構簡素)

感想

  • なんで [0, +180] に限定したんだろうか?

Satisfactory サーバーの立て方

# この記事は

GCPVM インスタンスを立てて、そこで Satisfactory サーバーを動かす方法を書いた手順書です。

# 方針

  • とにかく手を抜く

# 最低限ワールドに入れるようになる所まで

## プロジェクトの作成まで

  • GCP のコンソールから、新しいプロジェクトを作成する。
    • プロジェクト名は Satisfactory にしておく。

## インスタンスの作成まで

  • GCP のコンソールから VM インスタンスを有効化
  • VM インスタンス」から「インスタンスを作成」
  • 「名前」を「game-server」に変更
  • 「リージョン」を「asia-northeast1(東京)」に変更
  • 「マシンタイプ」を「e2-standard-4 (4 vCPU、 16 GB メモリ)」に変更
  • 「ブートディスク」の「変更」をクリック
    • 「OS」を「Ubuntu」に変更
    • 「バージョン」を「Ubuntu 22.04 LTS」(x86/64 の方)に変更
    • 「サイズ(GB)」を「32」に変更
  • 「ネットワークタグ」を「satisfactory」に変更
  • 「作成」をクリック

## SSH ログインまで

  • GCP コンソールの「VM インスタンス」の「接続」列にある「SSH」をクリックして game-server に SSH ログインする

## Satisfactory サーバーのインストールまで

  • まずはパッケージ更新
sudo apt update
sudo apt -y upgrade
sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
  • steamcmd を入れる
sudo apt install -y lib32gcc-s1 steamcmd
  • steamcmd プロンプトに入る
steamcmd
  • 匿名ユーザーでログイン
login anonymous
  • Satisfactory サーバーをインストール
app_update 1690800 validate
  • steamcmd プロンプトを抜ける
exit

## Satisfactory サーバーを起動するところまで

  • tmux をインストール
sudo apt -y install tmux
  • tmux セッションに入る
tmux
  • Satisfactory サーバーを起動
Steam/steamapps/common/SatisfactoryDedicatedServer/FactoryServer.sh

## 必要なポートを開けるところまで

## 動作確認取るところまで

  • CGP コンソールの「VM インスタンス」で「外部 IP」をコピー
  • satisfactory を起動
  • メインメニューで「サーバー管理」を選択
  • 「サーバー追加」を選択
  • さっきコピーした「外部 IP」を「アドレス」に入力して「確認」をクリック

# 終盤も快適にプレイできるように設定する所まで

## チューニング要る?

  • 少なくとも、オートセーブだけは絶対にやったほうが良い
    • オートセーブ中の移動や作業はロールバックされてしまう
    • 高頻度のオートセーブ=高頻度の作業中断
    • ウザくならない程度にオートセーブ頻度は下げたほうが良い
  • 設定ファイルを書き換えてのチューニングは終盤までにはやりたい
    • ゲーム終盤(100h~)までいくと、プレイに支障が出るレベルで重たい

## オートセーブの間隔を 30 分に変更

  • インゲームのサーバー管理メニューから「コンソール」タブを開く
  • FG.AutosaveInterval 1800 を入力

## クライアントのネットワーク帯域制限を撤廃

  • クライアント PC の
%localappdata%\FactoryGame\Saved\Config\WindowsNoEditor\

の各設定ファイルを書き換える - ※同名の変数が最初からある場合は上書き、ない場合は追記 - Engine.ini ``` [/Script/Engine.Player] ConfiguredInternetSpeed=104857600 ConfiguredLanSpeed=104857600

[/Script/OnlineSubsystemUtils.IpNetDriver]
MaxClientRate=104857600
MaxInternetClientRate=104857600

[/Script/SocketSubsystemEpic.EpicNetDriver]
MaxClientRate=104857600
MaxInternetClientRate=104857600
```
- Game.ini
```
[/Script/Engine.GameNetworkManager]
TotalNetBandwidth=104857600
MaxDynamicBandwidth=104857600
MinDynamicBandwidth=10485760
```
- Scalability.ini
```
[NetworkQuality@3]
TotalNetBandwidth=104857600
MaxDynamicBandwidth=104857600
MinDynamicBandwidth=10485760
```
  • 書き換えた各ファイルを「読み取り専用」にする

## サーバーのチューニング

~/Steam/steamapps/common/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/

の各設定ファイルを書き換える - ※同名の変数が最初からある場合は上書き、ない場合は追記 - Game.ini ``` [/script/engine.gamenetworkmanager] TotalNetBandwidth=104857600 MaxDynamicBandwidth=104857600 MinDynamicBandwidth=104857600 MAXPOSITIONERRORSQUARED=32.00f MoveRepSize=512.0f CLIENTADJUSTUPDATECOST=512.0f bMovementTimeDiscrepancyDetection=false bMovementTimeDiscrepancyResolution=false bMovementTimeDiscrepancyForceCorrectionsDuringResolution=false MAXCLIENTUPDATEINTERVAL=2.20f MaxMoveDeltaTime=0.700f MaxClientSmoothingDeltaTime=2.20f MaxClientForcedUpdateDuration=1.0f ClientNetSendMoveDeltaTime=0.0332 ClientNetSendMoveDeltaTimeStationary=0.0664 ClientNetSendMoveThrottleOverPlayerCount=99 ServerForcedUpdateHitchThreshold=2.800f

[/script/engine.gamesession]
MaxPlayers=10
```
- Engine.ini
```
[CrashReportClient]
bAgreeToCrashUpload=false
bImplicitSend=False

[Engine.ErrorHandling]
bPromptForRemoteDebugging=False
bPromptForRemoteDebugOnEnsure=False

[/script/onlinesubsystemutils.ipnetdriver]
MaxInternetClientRate=104857600
MinInternetClientRate=104857600
MaxClientRate=104857600
MinClientRate=104857600
LanServerMaxTickRate=15
NetServerMaxTickRate=15
ConnectionTimeout=100.0
InitialConnectTimeout=200.0

[SystemSettings]
t.MaxFPS=15
AllowAsyncRenderThreadUpdates=1
AllowAsyncRenderThreadUpdatesDuringGamethreadUpdates=1
net.UseRecvMulti=0
net.RecvMultiCapacity=8192
net.IpNetDriverUseReceiveThread=0
net.IpConnectionUseSendTasks=1
net.IpNetDriverReceiveThreadQueueMaxPackets=8192
net.MaxNetStringSize=67108864
net.MaxRPCPerNetUpdate=8
tick.AllowAsyncComponentTicks=1
tick.AllowConcurrentTickQueue=1
tick.AllowAsyncTickDispatch=1
tick.AllowAsyncTickCleanup=1

[/script/engine.player]
ConfiguredInternetSpeed=104857600
ConfiguredLanSpeed=104857600

[/script/socketsubsystemepic.epicnetdriver]
MaxClientRate=104857600
MaxInternetClientRate=104857600

[/script/engine.engine]
bSmoothFrameRate=true
bUseFixedFrameRate=false
SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=5.000000),UpperBound=(Type=Exclusive,Value=15.000000))
MinDesiredFrameRate=8.000000
FixedFrameRate=15.000000
NetClientTicksPerSecond=15

[/script/engine.garbagecollectionsettings]
gc.MaxObjectsNotConsideredByGC=476499
gc.SizeOfPermanentObjectPool=100378488
gc.ActorClusteringEnabled=True
gc.BlueprintClusteringEnabled=True

[/script/engine.streamingsettings]
s.EventDrivenLoaderEnabled=True
s.AsyncLoadingThreadEnabled=True

[Core.System]
+Suppress=Scriptwarning
+Suppress=Error
+Suppress=Scriptlog
+Suppress=Warning

[Core.Log]
LogPluginManager=all off
LogOnlineIdentity=all off
LogOnlineSession=all off
LogMemory=all off
LogPakFile=all off
LogTemp=all off
LogLinker=all off
LogOnline=all off
LogOnlineGame=all off
LogAnalytics=all off
LogConfig=all off
LogInteractiveProcess=all off
LogInput=all off
LogOnlineEntitlement=all off
LogOnlineEvents=all off
LogOnlineFriend=all off
LogOnlinePresence=all off
LogOnlineTitleFile=all off
LogOnlineUser=all off
Global=off
```
  • 書き換えた各ファイルを「読み取り専用」にする
chmod -w Game.ini
chmod -w Engine.ini

参考

Civilization 6 のオンラインマルチをやってる時に接続が怪しくなった

ことの起こり

  • オンラインマルチでフレンドと civ6 をやっていた
  • ゲーム中盤入ったくらいから
    • 毎ターン同期ずれが発生するようになった
    • 2ターン進めるのに数十秒待たされるようになった
  • ゲーム終盤入ったくらいから
    • クライアント側がクラッシュするようになった
    • クライントがゲームに参加できなくなった

解決方法

以下の手順を、マルチの参加者全員が行う。

  • "%USERPROFILE%\Documents\My Games\Sid Meier's Civilization VI" の直下にある、
    • logs
    • dumps
    • cache
    • moduserdata
    • packageddumps を削除。
  • PC を再起動
  • Stream で civ6 の「ゲームファイルの整合性を確認…」を実行
    • 問題がある場合、修正します的なメッセージが出る
    • その場合、2回目を実行して問題ありません的なメッセージが出なくなることを確認する

これを実行したあと、快適にターンが進むようになった(快適性+5)。

考察

  • ゲームファイルに問題があったのは間違いない
    • 整合性の確認で問題が出ていた
    • ホスト側のログでエラーが出ていた
  • キャッシュが不正だったかどうかは不明
    • そもそもゲームファイルに問題があったのだから、キャッシュにも波及してそう
  • 再起動は意味があったかわからない
    • 一応やっとこうか、という程度

参考

Linux でユーザーの所属グループを編集する方法いろいろ

なんでまとめた?

やらかし(後述)たので

主グループを変更

# usermod -g <group name> <user name>

補助グループを変更(上書き)

こちらは「上書き」なので、変更前の補助グループリストは全部吹き飛ぶ。

# usermod -G <group name1>,<group name2>,... <user name>

補助グループを変更(追記)

こちらは「追記」なので、変更前の補助グループリストは残る。

# usermod -aG <group name1>,<group name2>,... <user name>

主グループと補助グループ

  • 主グループは
    • 1つだけ設定可能
    • ファイル・ディレクトリ新規作成時に「所有グループ」として使われる
  • 補助グループは
    • 2つ以上設定可能
    • 「グループに所属=権限がある」みたいなケースはこちらを使う

やらかしって?

  • ubuntu で補助グループをオリジナルのグループで「上書きした」
  • ところで ubuntu は「sudo グループに所属するユーザー=soder」という仕様になっている
  • つまり、補助グループの上書きにより sudo 権限を吹き飛ばしてしまった!
  • ちなみにその後は、リカバリーモードから root ログインして sudo グループを再設定することで復帰できた

参考

BlueStacks Hyper-V が起動時にタイムアウトする

# 症状

## その1

  • BlueStacks Hyper-V を起動後、ホーム画面に入る前のロード画面で「BlueStacks Hyper-Vを起動しています。少々お待ちください」の状態で数分待たされる(99% まで行くんだけどそこでずっと止まるイメージ)
  • 数分待たされたあとタイムアウトしてエラーが出る

## その2

  • BlueStacks Hyper-V の「ディスククリーンアップ」を実行すると18%で止まって最終的にはエラーが出る

# 環境

# 解決方法

## 正しい解決方法

  • 以下のどちらか
    • 起動時にパッドをPCから予め引き抜いておく
    • パッドが接続されています的な内容のトースターを速攻で閉じる

## 以下、直ると思ってたけど実際は直ってなかった方法

  • Windows の「アプリと機能」から BlueStacks Hyper-V をアンインストール
  • BlueStacks Hyper-V をインストール
    • このとき、データディレクトリのパス(正しい名前忘れた)をアクセス制限がついていない場所に設定する <-- ここ重要
    • 自分の場合は C: とは別のゲーム用ドライブをデータディレクトリに設定した

# トラブルシューティングをすることになった経緯

  • 元々アズレンやってた
  • スマホでやるの無理すぎるので Nox Player に移住した
  • Nox Player は WSL2+Docker 環境と共存できないことを知る
  • BlueStacks なら Hyper-V 上で動くことを知る
  • BlueStacks でアズレン動かして満足する
  • ところが、PC再起動後の初回起動時に上記の問題が再現
  • ググってもこれという情報が出てこない

# 感想

  • なんとか共存できてよかった
  • しんどいなぁ