たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

第二章:異世界に、魂を宿せ ~Linuxと.NETで創る、gRPCのゴーレム~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

前回の旅で、我々はWindowsという文明化された大地に、gRPCのゴーレムを錬成した。しかし、真の冒険者は、安住の地に留まらない。今回は、WSL2/Ubuntuという、より原生的な、しかし無限の可能性を秘めた大地で、再び同じゴーレムを創り出す儀式に挑む。

プログラムの魂そのものは同じだ。しかし、大地が違えば、儀式の作法もまた、微妙に異なってくる。これは、Linuxという新たな大地で、.NET 6の魔法を使いこなし、IPアドレスという光の糸で、二つの世界を繋ぐまでの、一人の魔法使いの冒険の記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • gRPCという名のゴーレムを、Windowsだけでなく、Linuxの大地でも錬成したいと願う者
  • HTTP/2という光の道を、異なるOS間で繋ぐことに興味がある探求者

第一の儀式:大地を整える(事前準備)

まず、我々が今立っているWindowsという大地と、これから旅するLinuxという大地の、正確な座標を知る必要がある。ipconfigの呪文で、Windows側のIPv4アドレスを読み解き、それをnlog.configという名の羅針盤に刻み込む。これが、二つの世界を繋ぐための、最初の重要な儀式だ。

第二の儀式:Linuxの大地に、ゴーレムを召喚する

WSL2/Ubuntuという祭壇で、dotnet new grpcという短い呪文を唱える。すると、大地は応え、gRPCゴーレムの素体が、我々の目の前に現れる。

$ mkdir GrpcGreeter
$ cd GrpcGreeter
$ dotnet new grpc

NLogという、ゴーレムの声を聴くための魔法の耳を追加し、儀式の準備は整った。

魂の設計図を書き換える

Windows版と違い、Linux版のゴーレムに外界の声を届けさせるには、launchSettings.jsonという名の魂の設計図を、自らの手で書き換える必要がある。 applicationUrlに記されたlocalhostという内なる言葉を、0.0.0.0という、全世界に向けた開かれた言葉へと書き換えるのだ。

{
  "profiles": {
    "GrpcGreeter": {
      "applicationUrl": "http://0.0.0.0:5045;https://0.0.0.0:7045",
      // ...
    }
  }
}

儀式の執行

dotnet buildで魂を練り上げ、dotnet runで命を吹き込む。 コンソールに響き渡る「Now listening on...」という神託こそが、ゴーレムがLinuxの大地で確かに息づいている、何よりの証だ。

$ dotnet run
Building...
INFO : Now listening on: http://0.0.0.0:5045
INFO : Now listening on: https://0.0.0.0:7045
INFO : Application started. Press Ctrl+C to shut down.
...

Log2Consoleという真実の鏡を覗き込めば、その魂の鼓動を、より詳細に感じ取ることもできる。

Log2Console によるログの確認

真実の鏡が、ゴーレムの魂の鼓動を映し出す

最終儀式:二つの世界を繋ぐ

Windowsの世界から、gRPCクライアントという名の魔法で、Linuxの大地にいるゴーレムと対話する。 ip a show dev eth0で突き止めた、Ubuntuの座標(IPアドレス)を正確に指定する。

# Ubuntuの座標を突き止める
$ ip a show dev eth0
    inet 172.18.126.178/20 ...

そして、クライアントのプログラムに、その座標を刻み込む。自己署名証明書という結界を信頼する、という誓いを立てることを忘れずに。

// 異世界の座標
var server = "https://172.18.126.178:7045";

var option = new GrpcChannelOptions()
{
    HttpClient = new HttpClient(new HttpClientHandler
    {
        // 自己署名証明書という結界を、信頼する
        ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
    })
};
var channel = GrpcChannel.ForAddress(server, option);
// ...

呪文を唱えれば、「Hello World」という、二つの世界が繋がった証の言葉が返ってくるだろう。

サーバとクライアントのログを確認する

真実の鏡に映る、二つの世界の魂の対話

羊皮紙を巻く前に

Windows版に続き、WSL2/UbuntuというLinuxの大地でも、無事にgRPCのゴーレムを錬成することができた。 IPアドレスでアクセスするためのlaunchSettings.jsonの書き換えなど、大地が違えば作法も変わる。しかし、その違いを知ることこそが、我々冒険者の知恵となる。

この旅で得た知見は、次の冒険、すなわち「Docker」という異次元の箱庭でのゴーレム錬成へと繋がっていく。

この羊皮紙が、同じようにWindowsの安住の地から、Linuxという広大な荒野へ旅立とうとする、未来の冒険者の助けとなることを願う。

おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が、この前は窓の世界でゴーレムを創っていたかと思えば、今度はペンギンの世界で同じことをやっている。俺に言わせりゃ、どっちの世界で創ろうが、どうせ荷物は運んでくれねえんだ。そんなことより、そろそろ俺の餌の時間をだな…。まったく、やれやれだぜ。