窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

Blazor WebAssemblyアプリ上に展開されているFileSystemを触る

.NET 6 RC2でのお話です。 触ってみたやつをメモっておく。

Blazor WebAssemblyを支える技術であるEmscriptenEmscriptenは仮想のファイルシステムをサポートしており、JSやwasmから読み書きが行えるようになっています。

emscripten.org

さて、このBlazor WebAssemblyもこのEmscriptenを使っているのだし、C#から読み書きできるの?と気になったので試してみました。

結論としては出来たので、使ったコード片を残しておきます。

@using System.IO

<button onclick="@LS">lsするぞ</button>
<input type="text" @bind-value="dir" @bind-value:event="oninput" />

...

@code
{
    string dir = "";

    void LS()
    {
        LSImpl(dir);
    }

    void LSImpl(string rootDir)
    {
        try
        {
            foreach (var f in Directory.GetFiles(rootDir))
            {
                Console.WriteLine(f);
            }
            foreach (string d in Directory.GetDirectories(rootDir))
            {
                Console.WriteLine(d);
                LSImpl(d);
            }
        }
        catch (Exception e)
        {
            // System.UnauthorizedAccessException: Access to the path '/proc/self/fd' is denied.
            Console.Error.WriteLine(e);
        }
    }
}

こんな感じのコードを流し込むと

/
/tmp
/home
/home/web_user
/dev
/dev/null
/dev/tty
/dev/tty1
/dev/random
/dev/urandom
/dev/stdin
/dev/stdout
/dev/stderr
/dev/shm
/dev/shm/tmp
/proc
/proc/self
/usr
/usr/share
...

こんな感じで仮想ファイルシステムの中身が列挙されます。

BlazorWebassembly(.NET6 rc2)のFileSystemを眺めたやつ · GitHub

この中身はemscriptenのコードに書いてあるものと同じですね。

emscripten/library_fs.js at 2.0.23 · emscripten-core/emscripten · GitHub

これでC#上からFileSystemにアクセスできることがわかりました。 さて気になるのは、ASP.NET Core updates in .NET 6 Release Candidate 2のアナウンスで出てきた「Native dependencies support for Blazor WebAssembly apps」で突っ込んだwasmから読み書きは?というところだと思います。

ASP.NET Core updates in .NET 6 Release Candidate 2 - .NET Blog

結論から言うと同様のFileSystemに読み書きできるので、ほんと何でも動かせるなみたいな状況になっています。

次の記事ではOpenJTalkをBlazor WebAssembly + Native dependenciesで動作させたことについてメモを書こうかと思います。

メモ: IPv6環境でFate/Grand Order(FGO)のサーバーに接続出来るようにルータの設定いじった(一箇所だけ

2週間ほど前に諸事情でルータを入れ替えたのですが、その時からFGOのサーバーに接続できなくなり、ゲームがプレイできませんでした。

その時にcurlFGOのgameサーバーに発射した結果がこんな感じ

 curl -v -6 https://game.fate-go.jp
*   Trying 2600:9000:2197:fa00:1b:b688:e940:93a1:443...
* TCP_NODELAY set
* Immediate connect fail for 2600:9000:2197:fa00:1b:b688:e940:93a1: Network is unreachable

unreachable~

流石にイベント終了間近でこれは辛いのでTwitterで調べたりググったりするとipv6やめるとつながるよ!とのこと。 いやいや、速度を求めてこの契約にしてるのに、わざわざv6やめるとかいう手法取るわけないじゃんということで昔のルーターの設定を思い出して自分の今の設定と照らし合わせてみた。

差分としてはNDP Proxyの設定。 今のルーターだとdisableになっていたのでこれをenableにしたら無事FGOのサーバーと疎通が出来るようになった。

今回はマイナーなルーターの設定だからNDP Proxyっていう名前だったけれども、例えばBuffaloならND Proxyっていう名前で、IO-DATAだとIPv6 SPIとか言う名前らしい。

dotsukareta.blogspot.com

ここにND Proxyとかをオフにしている状態の危険性が述べられている。

セキュリティ観点でもオンにしておこう。