マインクラフト(統合版)のサーバーを立ててしばらく経った

きっかけ

マインクラフト(統合版)のサーバーを立てて3ヶ月半くらい経った。

もともと Splatoon 3 を一緒に遊んでいる人達が集まっている discord サーバーがあった。そろそろ Splatoon 3 の発売から 2 年が経とうかという 2024 年の夏、そこに集まっている人たちもなんとなく Splatoon 3 以外のこともしたいなぁという気持ちになってきていた。
もともと Splatoon 3 を遊ぶことを目的として集っている人たちではあったけど、 Splatoon 3 以外のゲームでもそこにいる人達と一緒に遊べるといいよね、という感じで、そこにいる面々で遊べるいい感じのゲームを模索するというのが続いていた。

そんなある日、ふとメンバーの1人がマインクラフトが遊びたいと言った。んだったと思う。
もともと Splatoon 3 を遊んでいる人たちが集まっている discord サーバーなので、Switch のマインクラフトを使って遊ぶ人もいると考えられるので統合版を一緒に遊ぶのが良いだろうということになった。
その際に問題になるのはみんなが一緒に遊ぶためのサーバーの用意である。

マインクラフト統合版のサーバーでメジャーどころというと、Minecraft Realms という公式のサーバがあるし、これを使うのが一般的なように思う。
これは 3人以上が一緒に遊ぶとなると、月額 7.99 ドルかかるし、10人以上は同時に接続できない。
Discord のサーバーの参加人数から言って、ピークで10人以上接続する可能性はあるし、接続できない人が出てくるとさみしいので上限人数に制限があるのはなんだか嫌だなぁと思った。
あと、大人にとって 7.99 ドルって大した額じゃないけど、毎月誰かにそれを負担してもらうのもなぁと思うし、みんなが遊ばなくなったときに、いつまで課金して維持し続けるかなど、ちょっと悩んでしまう所も多い。

なので、家の録画サーバーの性能が割と余裕があるので、そこでサーバーをホストすればいいのではないか、という気持ちになったのでやってみることにした。もともと、自分の子どもとその友達たちが一緒に遊ぶマインクラフトのサーバーがほしいと言っていたりとかして、やりたいなぁと思っていたいので。
その過程で、自前でマインクラフト統合版のサーバーを立てても、子どもやらが触ることが想定されている Switch 版では、自前で立てたものにつなぐことができないという制約があることを知っていた。
でも、色々調べてたら、この制約を回避する方法がある事がわかった。

というわけで、やってみることにした。

やったこと

大きく分けて以下のことをやった。

  1. マインクラフト統合版のサーバーを立てる
  2. Switch からの接続を可能にするための制約回避方法を用意する
  3. ログイン・ログアウト時に discord に書き込む bot を作る
  4. 自動バックアップの仕組みを作る
  5. マインクラフトにアップデートがあったら discord に書き込む機能を bot に追加する

以上の仕組みが、ここに書いてある録画サーバで動いている。

マインクラフト統合版のサーバーを立てる

この docker image が定期的にメンテナンスされているように見えたので、使うことにした。
https://hub.docker.com/r/itzg/minecraft-bedrock-server

docker image を動かすにあたっては、この docker image の元になっている github のレポジトリに、docker-compose.yml があるので、これをほぼそのまま使うことにした。

ただし、外向けのポート番号は変更してある。これは、後述の制約回避方法を使う仕組みを動かす際にポート番号が重複してしまい、重複回避方法側はポート番号を変更することが多分できないためである。

Switch からの接続を可能にするための制約回避方法を用意する

Switch 版等の家庭用 CS 機のマインクラフトでは、自前で立てた統合版サーバーにつなぐことができないという制約が一般にある。
この制約は、 BedrockConnect というサーバーに一旦接続することで回避する事ができる。
https://github.com/Pugmatt/BedrockConnect

BedrockConnect に接続するためには、Switch が参照する DNS サーバーを設定したり、通常のサーバーの接続方法とは異なる方法を使う必要がある。
これは若干面倒だし、公式のドキュメントは英語だしでハードルが高そうなので、接続するのに最低限必要な設定項目や手順をまとめた google document を作って共有した。

ここまではやろうと思い立ったその日のうちにできた。

ログイン・ログアウト時に discord に書き込む bot を作る

誰かがログインしてたら自分もログインして一緒に遊ぼう、みたいなことを思えるかなと思ったので、マインクラフトを起動しなくても、誰かがログインしているかを簡単に確認できるようにするため、ログイン・ログアウト時に discord に書き込む bot を作った。

マインクラフトのサーバーに対して、ログイン・ログアウトが行われると、サーバーの標準出力に、その旨が表示される。
その際に “list” というコマンドを標準入力から入力すると、ログインしているユーザーの一覧が表示される。
標準出力を監視しつつ、必要に応じて “list” コマンドを実行し、結果を整形して discord に書き込むことで簡単に作れた。
ちなみに、マインクラフトのサーバーは、 docker コンテナとして動いているため、このコンテナに attach することで、標準入力と標準出力は取得できる。
実装は、golang で書いた。docker に attach をするなら、docker 自体も golang で書かれているし、まぁ golang が楽だろうと思ったので。

自動バックアップの仕組みを作る

ログイン・ログアウト時に discord に書き込む bot を作る過程でユーザのログイン状況を把握できるようになった。
なので、全員がログアウトしたときに、一旦 docker container を停止して、バックアップを取る仕組みを作った。

バックアップの取得には、以前から docker container の volume のバックアップに使っている、下記 docker image を使った。
https://hub.docker.com/r/jareware/docker-volume-backup/tags

最初は、とりあえず全員がログアウトしたらすぐにバックアップを取ってたんだけど、マインクラフトのクライアントの調子が悪そう等の理由で、接続を切ってすぐにログインする場合がぼちぼちあって、そのたびにバックアップを取るのは無駄だなぁと思ったので、誰も接続していない状況が 10 分間続いたらバックアップを取るように変更した。

マインクラフトにアップデートがあったら discord に書き込む機能を bot に追加する

マインクラフトは定期的にアップデートされる。
運用していると、クライアントのアップデートにサーバーが追いつけなかったりとかして、接続できなくなることがぼちぼち起きたので、アップデートがあったら、 discord に書き込む仕組みを作った。
これは、自分がさっさとアップデート作業を開始するためでもある、全員にアップデートがあったということを知らせることで、繋がらなかったときに色々確認してもらうことを促すためでもある。

まとめ

そんなこんなで色々動かして、3ヶ月半くらいええ感じに動いていて、ほぼ毎日誰かがログインして遊んでいる。
ちなみに、自分はサーバーはホストしているものの、あまりマインクラフトという、こう、すごくコツコツとした作業が必要なゲーム自体には興味がイマイチ持てず、たまにログインしては友人たちが作った建物やら機械やらを眺めて、マインクラフトってすごいんだなぁと感心するばかりである。

かなりいろんなことが自動化できて、運用が楽な状態にはなったと思うので、みんなが飽きるまでのんびり運用していこうと思う。

2024年になってしまった

この blog もろくに更新しないまま気がついたら2024年になってしまった。
なんか年末に、プリンターやら、こどものおもちゃやら、色々壊れて何なんだって思ってたんだけど、年始もやたら世間的にも色々起きてなんかすごいなぁと思っている。

なんも書かないのも良くない気がするので、2023年がどんな感じだったかってのと、今年2024年をどんな感じにしたいのかを書く。

2023年について

Raspberry PI Pico 上でのプログラミングと、ゲームを主にしていた。
5がつ頃から、世間的にはコロナもそろそろ落ち着いてきたし、お出かけしてもいいんじゃないかという雰囲気になったけど、相変わらず家から離れることがあんまりできなかった。

Raspberry PI Pico 上でのプログラミング

具体的には、The NAYA での LED テープの点灯制御に使うことを主な目的としている宇宙12 Endurance のコードを書いた。
あと、Raspberry PI Picoをゲーム用のコントローラーにする GP2040-CE を使っていて気づいたバグの修正をしていた。
どちらも Raspberry PI Pico をベースにしているものなので、あっちの知識がこっちで使えたりしてよかった。

ゲーム

2022 年に発売された Splatoon 3 を引き続き遊ぶのに加え、2023年に発売された Street Fighter 6 を遊んでいた。

Splatoon 3

2022年に一緒に遊び始めた人が Discord サーバを立ててええ感じに運用してくれたので、そこにいる人と一緒に遊ぶことが多かった。
結構な頻度で一緒に遊んでいるので、人となりが少しずつ分かってくる感じで面白かった。
令和の時代ではこういったものをどう呼ぶのかがよくわからないが、いつも一緒に遊ぶ人とのオフ会もあった。
外出の機会が少ない一年だったけど、Discordで喋りながら一緒に遊んでいることが多く、寂しいと感じることが少なく、本当にsplatoonと、一緒に遊んでくれる友人に支えられた一年であったように思う。

Street Fighter 6

Street Fighter の新作が発売された。
それに合わせて、自作のレバーレスコントローラーを2台作った。
近所というほど近所ではないけど、電車一本で行ける場所でオフライン対戦会をやっていたのでそこにも何度か行ってみた。
ランクもとりあえずmasterまで上がって、それなりにいろんなことを考えて工夫したり、色々考えることができるようになった。
そんな感じで、まだ、面白い感じになってきたところ、という感じがする。

2024年について

目標

2024年は、外出をするようにしたいと思う。
具体的には月に1回、自宅から半径15km以上離れた、自分が納得できる場所に行くことを目標にしたい。

具体的な行き先として、クラブ、Street Fighter 6 のオフライン対戦会を考えている。
なんかおすすめの行き先とかあれば教えてもらえたり誘ってもらえたりするとすごく助かるし、2023年であれば躊躇していたところも、積極的に動いていきたい。

自作レバーレスコントローラーの基板を GP2040 ベースに変えた

2年半前くらいに、自作のレバーレスコントローラーを作った。
そのときには、 pro micro を使って、この上で動くコードはライブラリを利用しつつも主要な部分は自分で書いていた。

2年半時間が経過して、レバーレスコントローラーの自作はかなり一般的になった。
また、Raspberry PI Pico が発売されて、これの上で動くコントローラー用のソフトウェア GP2040 が開発された。
GP2040 は開発体制が変わったのか、オープンソースで開発が続けるコミュニティ版がフォークして、今は、GP2040-CE という名前で開発が続いているように見えた。

自分としてもいつまでも pro micro で動くコードの面倒を見るのはたいへんなので、GP2040-CE に乗り換えることにした。

配線をどうするか

pro micro でレバーレスコントローラーを作っていた頃は、ユニバーサル基板を使って気合いでボタンを配線していた。
でもまぁ、なんかそれも面倒なので、今回は pro micro 用のターミナルブロックを使うことにした。

例えばこういうの。aliexpress で送料も含めて 1000 円以下で買える。

今回は面倒なので、amazon で似たようなものを買った。

GP2040で使うことを想定した PICO Fighting Boardってのもあるみたいで、これも高くはないのだけど、トータルの値段で言えば汎用のターミナルブロックを使うんでいいような気がする。

GP2040-CE への独自機能の移植

pro micro の頃に、ミスタードリラーやテトリスなどのパズルゲームを遊ぶときに、斜め入力が入るのを避けるため、方向キーについて、最後に押したものを優先して入力として扱うような機能を実装して、設定で切り替えられるようにしていた。

GP2040-CE に乗り換えるにあたり、この機能を移植したいと考えた。

GP2040-CE は、オープンソースである。
なので、ビルド環境さえ整えてしまえば独自の機能を追加できる。
しかも、ソースコードを眺めていたところ追加機能を作りやすいように、プラグイン用のインタフェースがコード内に用意されていることが確認できた。

なのでさっと作った。

この機能が欲しい人居るんだろうか。いればプルリクエスト送ってもてもいいのかもしれないけど、、

GP2040-CE は、2023年の頭くらいにいくつかの git submodule に分割された。
その影響で、変更が複数のレポジトリにまたがる形となって若干面倒ではあった。

あと、Build 手順のドキュメントが古く、2023年4月1日時点では、書いてある通りにビルドすることはできなかった。
けど、 issue に手順をアップデートする予定があることが記載されているので、そのうち改善されると思う。

10000円以下で買った 24 インチ Full HD 液晶ディスプレイ KOORUI 24N1 の話

Covid-19 の影響で在宅勤務が本格化したタイミングで、家族からの影響を受けづらい場所に仕事環境を構築する必要が生じた。
このときに、27インチの液晶ディスプレイを買ったときに使うのをやめたけどなんだか捨てきれず、部屋の中に居座っていた BENQ G2400W と BENQ G2400WD というおよそ今から 15 年前に発売された UWXGA の TN ディスプレイを仕事環境で再利用することにした。
ただ、15 年前の時点ですら安価であった TN 液晶となると画面もなんだかぼやぼやして見づらく、ボタン類が壊れたり HDMI 端子が壊れたりで、使い続けるのがいい加減困難になってきた。なので、一念発起して仕事環境で使っている液晶ディスプレイを新調することにした。

時代が時代なので 4K ディスプレイを 2 枚、仕事環境にも導入することについても検討したけど、以下の理由で断念した。

  • 仕事で使っているノート PC は 2 枚のディスプレイに 4K 出力できるが、一方は 30Hz までしか出せないという制限がある
  • google 日本語入力は、拡大率が異なるディスプレイが同時に繋がれている時、変換候補の表示を正しい位置に表示できない。ノートPC についている画面は拡大率 100% で使っているが、4K ディスプレイは 175% あたりで使う可能性が高い。

なので、最低限仕事で使えればいいやと思ってとりあえず安価な Full HD ディスプレイを探した。
Amazon を眺めながら、だいたい 1 台あたり 15000円くらいが相場なのかなーと思っていたところ、KOORUI 24N1 という異様に安いディスプレイを見かけた。
なんと 9,299円(税込み) だった。
この値段だったら失敗しても許せるなーと思って、2台買った。値段は結構日によって違う気がするから、気になったひとは安いタイミングで買うのがいいと思う。

で、使い始めて 2 週間位経った。結果から言えば、自分の利用範囲では不満らしい不満がない。
15年前の TN 液晶よりも遥かに画面が見やすくて良い。
利用方法としては下記範囲では問題がなかった。以下は全て端末本体にイヤホン端子がついており、音はここから聞くことができる。

  • 仕事用のノートPCをつないで仕事につかう
  • Nintendo Switch をつないで使う
  • 個人用の Macbook Pro をつないでなんか色々するのに使う

ただ、このディスプレイには、最近の液晶ディスプレイにはほぼ標準でついている、スピーカーやイヤホン端子がない。
なので、例えば Playstation 5 のような、本体にイヤホン端子がなく、音は HDMI 端子経由で出力されたものを聞くといった利用方法が想定されているものではそもそも音を聞く方法がなくなってしまうので気をつけるといいと思う。

40歳になってた

2022年10月3日 に 40 歳になった。
で、その前日の10月2日に、久々に DJ しないかとお声がけいただき、青山蜂で行われた atrip ってパーティーで DJ をさせてもらった。コロナの色々があったり、コロナなんてなくても子育てがあるので、なかなか外出もままならない状況がずーっと続いているなかで、 DJ をして欲しいと頼まれた、なんていうのは自分にとっては絶好の外出の口実だった。
で、 10月2日 23時に、 DJ とパーティーが終わった後、遊びに来ていた友人とそこからさらに一緒に飲み屋に行って日付が変わる40歳になる瞬間を一緒に過ごしてもらった。
全員でスマホに表示した時計を覗き込んで日付が変わったタイミングで祝ってもらった。少し経ってから手に持って、写真をとってもらった。

もうここ数年、自分の誕生日であっても、子供から見て親の誕生日がどうあるべきかみたいなことをずーっと考えてしまってそればっかりになってしまっていた。なので、そういうのなしに単純に祝ってもらえる事と、祝ってくれる人がいるということがとてもありがたかった。
23時に渋谷駅近くでのパーティーが終わった後、更に飲みに行って戸塚の家に帰れるわけもなく、その日はまだ新婚ほやほやの友人宅に転がり込ませてもらった。友人宅の生活は、自分という普段は居ない人間がいるわけだから、もちろんいつも通りというわけではないだろうけど、その生活の一端を見られたのが面白かった。