Open Matchを参考にマッチメイキング・フレームワークを作った

ゲームサーバー上でのマッチメイキングを想定したフレームワーク minimatch を開発した。 すでにこの分野ではOpen Matchというオープンな実装があり、活用例も世に出てきている。 そんな中でなぜ今新しく minimatch を作ったのか。

日記アプリ Day One のデータをJSONから作る

日記アプリとして Day One を使い始めた。 それ以前も汎用的なノートアプリであるEvernoteとBearで日記をつけていたが、日記は日記に特化したアプリに任せたほうが良さそうだと考え、Day Oneへの移行を決めた。 そこで、過去の日記をDay Oneに取り込みたくな…

Agonesで効率の良いゲームサーバーの割り当てを実現する方法を考える

Agonesではゲームセッションに利用するサーバーを事前に割り当て(Allocate)する必要がある。 小規模なサービスであれば欲しいときに割り当てをする、それだけで十分動くが大規模・高頻度な割り当ての実現には工夫が必要だ。

.NETのWebSocketと、切断の扱い

リアルタイムな通信を行う際に何かと活躍するプロトコル WebSocket。 .NETには System.Net.WebSockets として組み込まれており、簡単に使い始めることができる。 しかし、WebSocketにおいて「切断」という概念は取り扱いに注意が必要だ。 本記事ではSystem.N…

Webhook的に ActivityPub に投稿する実装を作った

ここ最近で再び注目されている分散SNSのオープンな仕様として有名なのが ActivityPub だ。 ActivityPubのアカウントに対してもIncoming Webhookのような入口があれば、ActivityPubの仕様を知らなくても容易にBOTアカウントの運用ができて面白いのではないか…

Agones のインフラコストを抑える工夫

Kubernetes の世界では HPA (Horizontal Pod Autoscaler) や Cluster Autoscaler によって負荷に応じて動的にリソースを増減できる。 では、 Agones においても同様に動的なリソース増減ができるのか?その方法と考慮事項を探っていく。

Kubernetes で動くクラウドゲーミングにおけるCPU割当の工夫

Kubernetes上でゲームサーバーをホストする Agones を用いた環境において、CPU負荷にばらつきがあるゲーム群を動かしたいという事例があった。そこで、それぞれのゲームに対する適切なCPU割り当てを決定するために独自の工夫を行ったので、その実装について…

Argo CD が Kubernetes の廃止予定APIを呼ぶ原因を探る

Kubernetes v1.22 では結構多くのAPIが廃止1され、慎重なアップグレードが求められる。 その補助として、最近出たGKEの新機能 Deprecation Insights を使うと便利だ。 v1.21 等のGKE clusterで廃止予定のAPIが使われていないかチェックしてくれる。 あるGKE…

プログラムがGCP上で実行されているかを判定する

gcp

サーバーアプリケーションを開発していると、現在動いている環境がクラウドか、ローカルかで処理を分けたい場合がある。 自分はよくGCP (Google Cloud Platform) を利用しているが、今動いているのがGCP上なのか判定したい場面が何度かあった。 クラウドの場…

overlayfs を用いたクラウドゲームのデータ管理

クラウド上でゲームを動かす場合、データ(ゲーム本体のデータ・セーブデータ)をどう管理するかは重要な課題のひとつだ。 そこで、自分が開発に携わっているOOParts のデータ管理を支える技術について紹介する。 ノベルゲームのセーブ事情 OOPartsで提供さ…

Agones はなぜ、どのようにPodへの直接接続を実現しているか

Kubernetes上でゲームサーバーを扱うframeworkのAgones は ゲームサーバーに直接(TCP or UDPで)接続する 機能を持つ。 ゲームサーバーの実体はPodだが、なぜPodへの直接接続が必要なのか、そしてAgonesがどのように直接接続の機能を提供しているかを読み解…

fly.io に Pleroma を設置する

さいきん fly.io というサービスが面白くて触っている。 これはHerokuやCloud Runに近いPaas (CaaS?) で、Dockerfileとちょっとしたconfig fileを用意するとアプリをインターネット上にデプロイできるサービスだ。 個人的にすごい(面白い)と思った特徴とし…

minikube上にログイン不要のGrafana (with Prometheus)を速攻で立てる

Prometheus exporterの動作を検証したい場合など、ローカル環境のKubernetes(minikube)上にPrometheus + Grafanaを立てたい場合がある。Grafanaはデフォルトでユーザー認証が入っているが、ローカル環境では自分しか触らないので認証が邪魔なときがある。 …

Rust: tokioを使って独自プロトコルのメッセージを受け取るTCPサーバーを作る

オンラインゲーム開発などで独自プロトコルのデータを読み書きするTCPサーバーを作ることが時々あるが、 Rustのtokio を使うとそのようなTCPサーバーがとても簡潔に記述できる。 独自プロトコルといっても様々だが、TCPのようなストリーム指向の経路の場合あ…

CSS: 大きさの異なる画像をいい感じに敷き詰めて並べる

css

大きさの異なる画像がギャラリーのように並んでいて、それぞれの画像がぴったり敷き詰められているレイアウトが実現したくてやり方を調べた。 FlickrのExploreページのようなイメージ。 https://www.flickr.com/explore 昔はこういったレイアウトの実現は複…

ノベルゲームのテキストをリアルタイムに抽出するツール Textractor がすごい

Textractorというノベルゲームのテキストをリアルタイムに抽出するツールがある。 https://github.com/Artikash/Textractor このツールは起動中のノベルゲーム内のテキストをリアルタイムに抽出し、翻訳の結果も一緒に出してくれる。 海外のノベルゲームファ…

Windows: memory-mapped fileの中身を直接見る

Windows APIの CreateFileMapping ではファイルハンドルに INVALID_HANDLE_VALUE を渡すと実在しないファイルをmemory-mapped fileとして扱うことができる。たとえば次のコードを実行すると MappedFileTest という名前でmemory-mapped fileが作られる。 Crea…

2021年の技術的ふりかえり

年の瀬になったので、あらためて今年学んだ技術を振り返っていく。 クラウドゲーミングの開発 2021年はほぼ全てOOPartsのクラウドゲーミング (Black Game Streaming Engine v2 )の開発に費やした。 経緯は id:oliver0521 によるCEDECの発表の通りで、Windows…

Go Conferenceでクラウドゲーミングな発表をした

go

Go Conference 2021 Autumn で Cloud Gaming Platform with Goという発表をした。 speakerdeck.com OOParts のインフラコストが問題になり、2021年に新たにクラウドゲーミングのエンジンを作り直した。 くわしい経緯は以下の資料にまとまっている。 迫り来る…

GitHub CLIにコントリビュートした思い出

もうけっこう前のことになるが、GitHub CLI に新機能を追加するパッチを送信した。 pr create コマンドにおいて --body-file フラグを追加しファイルの中身をPull Requestの本文として入力可能にする、というものだった。 Add `pr create --body-file` flag …

Open MatchのBackfill機能

マッチメイキング実装のOSSであるOpen Match に Backfill という機能が追加された。 Backfill 機能の概要については公式ドキュメントに解説がある が、文章だけ読んでも実装が想像つかず結構苦戦したので Backfill 機能が作られた背景と自分なりの実装の解釈…

Pull Requestを出すとGoのベンチマーク結果の比較をしてくれるCI Job

go ci

Goには標準でベンチマークを取る機能 がある。 次のように go test のオプションとして実行できる。 go test -bench . また、標準には入ってないが複数のベンチ結果を比較してくれる benchstat というツールもある。 go installですぐに導入でき、2つのベン…

Go: selectでctx.Done()を受信するときの注意点

go

Goで非同期的な処理の中断を検知したい場合、次のように select と ctx.Done() を使って書くことが多い。 とても便利なパターンなのだが、いくつか使うときの注意点がある。 select { case <-ctx.Done(): // done case <-ch: // ... } selectによる受信のラ…

Ayame互換の WebRTC Signaling Server "ayu" を作った

AyameというWebRTC Signaling Serverの実装がある。 Web側のSDKとサーバー側の実装が両方公開されており、プロトコルの仕様も文章化されている。 GitHub - OpenAyame/ayame-web-sdk: Ayame Web SDK GitHub - OpenAyame/ayame: WebRTC Signaling Server Ayame…

AgonesとKustomizeを同時に使うときのTips

Kustomizeには ConfigMapGenerator, SecretGenerator という機能がある。 これを使うと、yamlの定義からconfigMap(またはsecrets)を自動生成してくれる1。 たとえば、kustomization.yaml にconfigMapGeneratorの定義で the-map という名前のconfigMapを作…

Puppeteerで何かおかしいときはとりあえずスクショを出す

PuppeteerはJavascript内でGoogle Chrome(のようなもの)を起動できるすごいツールで ブラウザを使って手動でやっていた面倒な作業が自動化できたりする。 しかし、実装ミスやサイトの仕様で特定の要素が現れるのを待機したまま止まってしまい、タイムアウ…

Open Matchを使ったローカル開発を考える

この記事はGoogle Cloud + Gaming Advent Calendar 2020 13日目の記事です。 Googleからゲームのマッチング用フレームワークであるOpen Matchがリリースされた。 このOpen MatchはKubernetes環境で動作することで現代のCloud Nativeな環境に適した構成となっ…

channelを使うテストで無限待ちしないようにする

go

Goで並列に動くものをテストしたいとき、順序を一定に保つためにchannelをよく使う。 しかし、実装を間違えるといつまでもchannelの送受信が終わらずに無限に待ち続けてテストが止まることがある。 あちこちでchannelの送受信をしていると、どこで止まったの…

クリップボードの画像を楽にリサイズするツールを作った

クリップボードの画像を楽にリサイズして、リサイズ後の画像をコピーし直すツールを作った。 GitHub - castaneai/relights: Simple clipboard image resizer きっかけ Macでスクリーンショットを撮ってブログに貼り付けたい場合、Cmd + Shift + 4を使って指…

PulseAudio (32bit版)がDocker上で動作しない問題の解決法

PulseAudioの32bit版(i386 build)をDockerで動かそうとするも、うまく動かなくて苦労したので書き残しておく。 TL;DR dokcer run のオプションに --security-opt seccomp=unconfined をつけたら解決する ただし、セキュリティ理由の制限を外すことになるの…