NeosVRで今年作ったもの

こんばんは。きさらぎです。
この記事は[NeosVR(その2) Advent Calendar 2022](https://adventar.org/calendars/7624)の5日めです。
昨日の記事はLettuceFryさんの「[今年作ったものリスト](https://zenn.dev/lettucefry/articles/179ca23c9a677f)」でした。

## 私
[NeosVR](https://neosvr.com)[^1]と[ツイッター](https://twitter.com/kisaragi_marine)をやっています。GitHubでは[`KisaragiEffective`](https://github.com/KisaragiEffective)として活動しています。ただまあまあ<ruby>識別子<rp>(</rp><rt>しきべつし</rt><rp>)</rp></ruby>が長いので、この界隈では<ruby>kisaragi<rp>(</rp><rt>きさらぎ</rt><rp>)</rp></ruby>と名乗っています。よくLinuxのペンギンアイコンが珍しいと言われます[^25]。

[^25]: 日本におけるデスクトップパソコンで、Linuxのシェアは[1%未満](https://gs.statcounter.com/os-market-share/desktop/japan)であることから、NeosVRもおそらく似たような状況なのでしょう。

早速振り返りをはじめていきたいと思います。

## 今年作ったツール
### [NeosInventoryManagement](https://github.com/KisaragiEffective/neosvr-inventory-management)
#### これは何？
NeosVRにはインベントリという、モデルやアバターやワールド（以下、本稿ではまとめて「アセット」と呼ぶ）を保存するストレージがあります。ストレージには容量の上限はありますが、個数制限はありません。
そのインベントリをWindowsのエクスプローラーのように管理できるようにするためのツール<del>になる予定</del>です。

#### 経緯
NeosVRを始めて[^2]から<u>1日目</u><sup>\[要出典\]</sup> の2022年7月29日[^3]。kazuさんと話していた中で、次のようなやりとりがありました（敬称略）。

> kazu「あれもこれもと保存していくと、フォルダーの中身がひどいことになるんですよね」
> kisaragi「みなさんそれどうしているんですか」
> kazu「大晦日に『インベントリ整理大会』を開いて出しては入れてを繰り返していました」
> kisaragi「うわぁ…」
> kisaragi「インベントリ操作用のAPIとかないんですか？」
> kazu「ありますよ、ドキュメント見ますか？」

そうして[ドキュメント](https://neos-api.polylogix.studio/)やkazuさん手製の内部資料が手渡されました。

それから数日で大概の機能は実装し終わりました。途中オプションで有効化することができるTOTP[^4]を追加したりなどもして、`0.1.8`までバージョン番号を[駆け抜けました](https://github.com/KisaragiEffective/neosvr-inventory-management/compare/0.1.0...0.1.8)。

#### 今後の展望
将来的にはNeosVRのAPIに対する操作を別のクレート[^6]に分離し、そのクレートをOSSライセンスで公開したり、FUSEを使った*NeosFS*を作ろうと考えています。また、アセットのコピーや削除、ディレクトリの移動[^5]・作成もコマンドラインから行えることが望ましいと思うので、今後もおそらくコミットし続けることでしょう。

### [NoPulseFromDisplayImpulse](https://github.com/KisaragiEffective/NoPulseFromDisplayImpulse)

#### これは何？
NeosVRにはLogiXというノードを連結してプログラミングをする要素があります。LogiXのDisplayノードにImpulseという「発火したもの」を出力すると、出力のたびにエヴァンゲリオンのATフィールドのような八角形のエフェクトが出てきます。それを抑制するMODです。

#### なぜ？
そのエフェクトが高頻度で発火するとセッション[^7]がクラッシュすることがあるためです。

#### 今後の展望
MODリストとかに登録する、とかでしょうか？まだ具体的なビジョンが浮かんでいません。

### [EnableSitModeOnLaunch](https://github.com/KisaragiEffective/EnableSitModeOnLaunch)

#### これは何？
以下のツイートを見て「できそうだな」と思ったので作ったMODです。

> NeosVRの着席モードってVrchatみたいに固定できないもんかな？起動毎にスイッチ押すぐらい面倒くさがるなと言われればそうだけど。
― [https://twitter.com/maid_doll/status/1584217788528218112](https://twitter.com/maid_doll/status/1584217788528218112 "https://twitter.com/maid_doll/status/1584217788528218112")

#### なぜ？
簡単そうだと思ったからです。

#### 今後の展望
このMODは少なくとも期待したように動作していないのは事実ですが、それがMODのせいか、NeosVRの仕様なのかがはっきりしないのでそこを解明した上で修正したいです。

### neosvr-launcher-wrapper

#### これは何？
NeosVRはコマンドラインから起動することもできます。NeosVRのコマンドライン引数は[割と複雑](https://wiki.neos.com/Command_Line_Arguments/ja)な上、なにかおかしなことがあっても黙って引数を「食べて」しまいます。このプログラムをターミナル[^8]から起動することで、予め不正な引数の組み合わせなどを検知し弾くために作成しました。

#### 今後の展望
* オープンソース化
* マニアックな引数に対応していないのでゆるやかに増やしたい

### [nikka-leaps](https://github.com/KisaragiEffective/nikka-leaps)

#### これは何？
[nvml](https://developer.nvidia.com/nvidia-management-library-nvml)を介してNVIDIA製GPUのVRAMの使用量を監視するプログラムです。

#### なぜ？
NeosVRにおいてVideoPlayerなどにテクスチャが割り当てられないことがある原因を調査するために作りました[^9][^10]。

#### 将来の展望
* ターミナルで動かすことを想定しているが、ターミナル環境であってもGUIのような「華やかさ」をもたせたい
* 折れ線グラフの出力

## 来年の野望
来年の話をすると鬼が笑うと言いますが、来年の野望を表明しておきたいと思います。

### LogiXをテキストで管理できるようにする
LogiXは、ノードやコンポーネントのデータの流れを考えると有向グラフとみなせるので、どうにか押し込めればテキストで管理できるようになりそうという直感があります。実際、ほとんどの目にするアイテムは`*.7zbson`という拡張子で保存されており、その中身はBSONというJSONのコンパクト版を、GZipで圧縮したファイル形式です。よって、機械可読ではあります。

ただし、JSONでプログラミングするのはオブジェクトのキーの名前や構造に気を自分で気を遣ってやる必要があり、とてもだるいので、`*.7zbson`と完全に互換なプログラミング言語を作ろうとしています。

ただし、そこに至るまであまりに知識が足りなさすぎて全く追いついていないのが現状。

* コンポーネントの数が多すぎる
* ノードの数も多すぎる
* どのノードがどのノードの型の組み合わせ (オーバーロード) を受け付けるのかわかってない
* サブタイピングが入ったプログラミング言語の設計の経験がない
* LogiXを完全に理解しているわけではないのでエッジケースの振る舞いがわからない
* どのようにLogiXを「より理想的な形」で再定義できるか考えがまとまっていない
* その性質上インタプリタを構築するのが難しい

ただ、実現すれば世界を変えることになるかも知れないので、早いところ完成させたいと思います。

### NeosVRのMODに対する継続的インテグレーション

NeosVRのMODというのは、人によってインストールしている場所が異なることもあり、`*.csproj`が完全に自己完結というわけではありません。GitHubのPull requestでビルドを走らせようと思っても、まずはNeosVRのクライアントをインストールせねばならず一苦労です。
そこで、将来的にはGitHub Actionsか何らかの形で、NeosVRのクライアントとNeosModLoaderをインストールした上で、手動ではなくGitHubのサーバーでビルドできるかどうかを確かめる環境づくりをしたいです。

## あとがき
今日はものすごく急いで書いたので文が乱れていると思いますが、読んでいただきありがとうございました。
明日の記事はきさらぎの「私とNeosVRの関係性について振り返り」です。引き続きお付き合いください。

## 注釈
[^1]: ユーザーID: `U-kisaragi-marine`
[^2]: どうして始めたのかは明日書きます。
[^3]: https://github.com/KisaragiEffective/neosvr-inventory-management/commit/8b0831cb24bc39a4c106b2f545f1da92fd769e3a
[^4]: 2段階認証に使うコードを生成するプロトコル。[RFC6238](https://datatracker.ietf.org/doc/html/rfc6238)に<u>沿っています</u><sup>\[要出典\]</sup>。
[^5]: 過去のリリースで壊れていることが発覚し、実装力の不足により直ちに実装できないと判断したため、ディレクトリの移動を行うことを一時的に禁止しました。
[^6]: Rustにおけるクレートとは、C#のdllのような「まとまり」のことを指します。詳しくは <https://doc.rust-jp.rs/book-ja/ch07-01-packages-and-crates.html> を見てください。
[^7]: NeosVRでは、VRChatにおけるインスタンスのことを「セッション」と呼びます。
[^8]: `cmd.exe` (コマンドプロンプト) みたいな黒地に白い字のウィンドウが出る ***なんかハッカーっぽい*** あいつです。
[^9]: おそらく素直にGPUを新調したほうが良い気はしています。
[^10]: VRAM以前の問題として、[NeosVideoPlayerFix](https://github.com/Frozenreflex/NeosVideoPlayerFix)を入れた上で`youtube-dl`を入れていないなどのミスも過去には起こしていました。