ノベルゲームのテキストをリアルタイムに抽出するツール 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 をつけたら解決する ただし、セキュリティ理由の制限を外すことになるの…