Damus

Recent Notes

ruto profile picture
RubyのEnumeratorのnewに無限ループするブロックを渡してもそのEnumeratorにtake(10)とかすると無限ループにならずに停止する。

Enumerator::new do |y|
a = 0
loop do
y << a
a += 1
end
end.take(10)

でもbegin rescueで囲ってみても例外は投げられていないし、JavaScriptのgenerator的なものがRubyにもあるんだっけ、そういえばFiberとかあったなと思ってp Fiber.currentを入れてみても外と同じものが返ってくる。begin ensureで囲うとちゃんとensure部分が実行されるので大域脱出しているのは確か。
各LLMに聞いても上手い答えが返ってこないし、と思ったらそういえばRubyには例外とは別にthrow/catchなんてものがあったなと思い出した。
ruto profile picture
RailsでFooがbarsをhas_manyしているとき、

foo = Foo.build()
foo.bars.build()
foo.bars.to_a

としてもクエリは走らないが、

foo = Foo.build()
foo.bars.build()
foo.save!
foo.bars.to_a

とするとbarsがSELECTされる。

単純な場合はいいけど、Foo.includes(bars: :bazs}).find_or_initialize_by(...)みたいに大きな木を読み込みまたは作成して、子や孫も追加・更新して、その後別の関数で木全体を処理する、みたいなときに困る。
ruto profile picture
今どきのLLMって未知のプログラミング言語のワンショット学習はどの程度できるもんなんだろう。言語仕様と標準ライブラリのリファレンスを渡したら上手いことコード生成とかしてくれるんだろうか。
ruto profile picture
PostgreSQLでネストしたjsonbを処理するとき、下記の順序で速かった(jsonb_path_queryが最速)。

・LATERAL jsonb_path_query(...)
・LATERAL jsonb_array_elements(...)を繰り返す。
・plv8でJavaScriptで処理する。

https://gist.github.com/taku0/828139d7ac00e47984f82d5c5cc56a73

PostgreSQL 16でshared_buffers=1024MBで実行。
注意が必要なのが、EXPLAIN ANALYZEを付けるとplv8の方が速くなる。
ruto profile picture
ruto profile picture
エポックは1秒間隔とかにして、エポック内に十分な数のプレイヤーが溜まってなければ持ち越しとかにした方が待ち時間は少なくできるか。
ruto profile picture
https://x.com/cryolite/status/1764054302644175144

雀魂のシステムは知らないんだけど一般にオンライン対戦ゲームでマッチングが偏ってない(運営側が操作していない)のを示すのは簡単ではなさそう。対戦待ちロビー内でのマッチングを検証可能なアルゴリズムで実施したとしてもロビーに入るタイミングの調整が疑われる可能性がある。優遇しているプレイヤーがロビーに入ろうとしたときに、その日調子が良いプレイヤーがロビーに集まっている場合は、ロビーに入るタイミングを少しだけずらして調子が良いプレイヤーとマッチングしないようにすると、通信や処理の遅れと区別がつかないし、同ランクのプレイヤーとのマッチングはしているので統計的な偏りも出にくい。

偏ってないことを示せるプロトコルとしては次のようなものが考えられる:

1. 日時を一定時間(1分など)に区切り、エポックと呼ぶ。
2. プレイヤーは現在時刻より先のエポックを選び、エポック番号をつけてロビーへの入室リクエストをサーバーに送る。
3. サーバーではエポックの終了時刻が過ぎて十分な時間が過ぎてから、検証可能なアルゴリズムにを使ってそのエポック内でマッチングをする。このエポックにエントリーしたプレイヤーのリストとマッチング結果を全ユーザーに公開する。

このプロトコルではプレイヤー同士が共謀して仲間内でのマッチングを避けたり逆に仲間内でのマッチング確率を上げたりできてしまう。ただ、それは単純なロビーシステムでもタイミングをずらしたり揃えたりしてできるので問題ないはず。
ruto profile picture
コーディング支援AIチャットで、現在のgit diffを参照できると嬉しいんだけど、GitHub Copilot Chatとかはできるんだろうか。Codeiumはできなかった。

こんな感じだとよい:



Emacsで左側のウィンドウでコードを編集していて、右上のウィンドウにgit diffが表示されていて、関数fooに対するdiffが表示されているとする。右下のチャットに"Apply the diff of `foo` to `bar`"って頼むと、関数fooの変更と同じような変更を関数barに対してもやるようなdiffが提案される。