ゲームサーバー上でのマッチメイキングを想定したフレームワーク minimatch を開発した。 すでにこの分野ではOpen Matchというオープンな実装があり、活用例も世に出てきている。 そんな中でなぜ今新しく minimatch を作ったのか。
日記アプリとして Day One を使い始めた。 それ以前も汎用的なノートアプリであるEvernoteとBearで日記をつけていたが、日記は日記に特化したアプリに任せたほうが良さそうだと考え、Day Oneへの移行を決めた。 そこで、過去の日記をDay Oneに取り込みたくな…
Agonesではゲームセッションに利用するサーバーを事前に割り当て(Allocate)する必要がある。 小規模なサービスであれば欲しいときに割り当てをする、それだけで十分動くが大規模・高頻度な割り当ての実現には工夫が必要だ。
リアルタイムな通信を行う際に何かと活躍するプロトコル WebSocket。 .NETには System.Net.WebSockets として組み込まれており、簡単に使い始めることができる。 しかし、WebSocketにおいて「切断」という概念は取り扱いに注意が必要だ。 本記事ではSystem.N…
ここ最近で再び注目されている分散SNSのオープンな仕様として有名なのが ActivityPub だ。 ActivityPubのアカウントに対してもIncoming Webhookのような入口があれば、ActivityPubの仕様を知らなくても容易にBOTアカウントの運用ができて面白いのではないか…
Kubernetes の世界では HPA (Horizontal Pod Autoscaler) や Cluster Autoscaler によって負荷に応じて動的にリソースを増減できる。 では、 Agones においても同様に動的なリソース増減ができるのか?その方法と考慮事項を探っていく。
Kubernetes上でゲームサーバーをホストする Agones を用いた環境において、CPU負荷にばらつきがあるゲーム群を動かしたいという事例があった。そこで、それぞれのゲームに対する適切なCPU割り当てを決定するために独自の工夫を行ったので、その実装について…
Kubernetes v1.22 では結構多くのAPIが廃止1され、慎重なアップグレードが求められる。 その補助として、最近出たGKEの新機能 Deprecation Insights を使うと便利だ。 v1.21 等のGKE clusterで廃止予定のAPIが使われていないかチェックしてくれる。 あるGKE…
サーバーアプリケーションを開発していると、現在動いている環境がクラウドか、ローカルかで処理を分けたい場合がある。 自分はよくGCP (Google Cloud Platform) を利用しているが、今動いているのがGCP上なのか判定したい場面が何度かあった。 クラウドの場…
クラウド上でゲームを動かす場合、データ(ゲーム本体のデータ・セーブデータ)をどう管理するかは重要な課題のひとつだ。 そこで、自分が開発に携わっているOOParts のデータ管理を支える技術について紹介する。 ノベルゲームのセーブ事情 OOPartsで提供さ…
Kubernetes上でゲームサーバーを扱うframeworkのAgones は ゲームサーバーに直接(TCP or UDPで)接続する 機能を持つ。 ゲームサーバーの実体はPodだが、なぜPodへの直接接続が必要なのか、そしてAgonesがどのように直接接続の機能を提供しているかを読み解…
さいきん fly.io というサービスが面白くて触っている。 これはHerokuやCloud Runに近いPaas (CaaS?) で、Dockerfileとちょっとしたconfig fileを用意するとアプリをインターネット上にデプロイできるサービスだ。 個人的にすごい(面白い)と思った特徴とし…
Prometheus exporterの動作を検証したい場合など、ローカル環境のKubernetes(minikube)上にPrometheus + Grafanaを立てたい場合がある。Grafanaはデフォルトでユーザー認証が入っているが、ローカル環境では自分しか触らないので認証が邪魔なときがある。 …
オンラインゲーム開発などで独自プロトコルのデータを読み書きするTCPサーバーを作ることが時々あるが、 Rustのtokio を使うとそのようなTCPサーバーがとても簡潔に記述できる。 独自プロトコルといっても様々だが、TCPのようなストリーム指向の経路の場合あ…
大きさの異なる画像がギャラリーのように並んでいて、それぞれの画像がぴったり敷き詰められているレイアウトが実現したくてやり方を調べた。 FlickrのExploreページのようなイメージ。 https://www.flickr.com/explore 昔はこういったレイアウトの実現は複…
Textractorというノベルゲームのテキストをリアルタイムに抽出するツールがある。 https://github.com/Artikash/Textractor このツールは起動中のノベルゲーム内のテキストをリアルタイムに抽出し、翻訳の結果も一緒に出してくれる。 海外のノベルゲームファ…
Windows APIの CreateFileMapping ではファイルハンドルに INVALID_HANDLE_VALUE を渡すと実在しないファイルをmemory-mapped fileとして扱うことができる。たとえば次のコードを実行すると MappedFileTest という名前でmemory-mapped fileが作られる。 Crea…
年の瀬になったので、あらためて今年学んだ技術を振り返っていく。 クラウドゲーミングの開発 2021年はほぼ全てOOPartsのクラウドゲーミング (Black Game Streaming Engine v2 )の開発に費やした。 経緯は id:oliver0521 によるCEDECの発表の通りで、Windows…
Go Conference 2021 Autumn で Cloud Gaming Platform with Goという発表をした。 speakerdeck.com OOParts のインフラコストが問題になり、2021年に新たにクラウドゲーミングのエンジンを作り直した。 くわしい経緯は以下の資料にまとまっている。 迫り来る…
もうけっこう前のことになるが、GitHub CLI に新機能を追加するパッチを送信した。 pr create コマンドにおいて --body-file フラグを追加しファイルの中身をPull Requestの本文として入力可能にする、というものだった。 Add `pr create --body-file` flag …
マッチメイキング実装のOSSであるOpen Match に Backfill という機能が追加された。 Backfill 機能の概要については公式ドキュメントに解説がある が、文章だけ読んでも実装が想像つかず結構苦戦したので Backfill 機能が作られた背景と自分なりの実装の解釈…
Goには標準でベンチマークを取る機能 がある。 次のように go test のオプションとして実行できる。 go test -bench . また、標準には入ってないが複数のベンチ結果を比較してくれる benchstat というツールもある。 go installですぐに導入でき、2つのベン…
Goで非同期的な処理の中断を検知したい場合、次のように select と ctx.Done() を使って書くことが多い。 とても便利なパターンなのだが、いくつか使うときの注意点がある。 select { case <-ctx.Done(): // done case <-ch: // ... } selectによる受信のラ…
AyameというWebRTC Signaling Serverの実装がある。 Web側のSDKとサーバー側の実装が両方公開されており、プロトコルの仕様も文章化されている。 GitHub - OpenAyame/ayame-web-sdk: Ayame Web SDK GitHub - OpenAyame/ayame: WebRTC Signaling Server Ayame…
Kustomizeには ConfigMapGenerator, SecretGenerator という機能がある。 これを使うと、yamlの定義からconfigMap(またはsecrets)を自動生成してくれる1。 たとえば、kustomization.yaml にconfigMapGeneratorの定義で the-map という名前のconfigMapを作…
PuppeteerはJavascript内でGoogle Chrome(のようなもの)を起動できるすごいツールで ブラウザを使って手動でやっていた面倒な作業が自動化できたりする。 しかし、実装ミスやサイトの仕様で特定の要素が現れるのを待機したまま止まってしまい、タイムアウ…
この記事はGoogle Cloud + Gaming Advent Calendar 2020 13日目の記事です。 Googleからゲームのマッチング用フレームワークであるOpen Matchがリリースされた。 このOpen MatchはKubernetes環境で動作することで現代のCloud Nativeな環境に適した構成となっ…
Goで並列に動くものをテストしたいとき、順序を一定に保つためにchannelをよく使う。 しかし、実装を間違えるといつまでもchannelの送受信が終わらずに無限に待ち続けてテストが止まることがある。 あちこちでchannelの送受信をしていると、どこで止まったの…
クリップボードの画像を楽にリサイズして、リサイズ後の画像をコピーし直すツールを作った。 GitHub - castaneai/relights: Simple clipboard image resizer きっかけ Macでスクリーンショットを撮ってブログに貼り付けたい場合、Cmd + Shift + 4を使って指…
PulseAudioの32bit版(i386 build)をDockerで動かそうとするも、うまく動かなくて苦労したので書き残しておく。 TL;DR dokcer run のオプションに --security-opt seccomp=unconfined をつけたら解決する ただし、セキュリティ理由の制限を外すことになるの…