Avatar
ると
2888961a564e080dfe35ad8fc6517b920d2fcd2b7830c73f7c3f9f2abae90ea9
Secure ScuttlebuttとかNostrとか。

X/TwitterへVPN等でアクセスしようとした利用者をブラジル政府が罰することに対して、はっきりと反対する。

https://www.bbc.com/japanese/articles/cd9dv8jjy91o

https://www.theverge.com/2024/8/30/24231286/x-brazil-ban-elon-musk-legal-representative

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なんてものがあったなと思い出した。

日本語向けGPT-4ってどういう仕組みなんだろう。通常のトークナイザで作ったトークンのベクトルを足してるのか、もっと高度なことをやってるのか。

https://openai.com/blog/introducing-openai-japan

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(...)みたいに大きな木を読み込みまたは作成して、子や孫も追加・更新して、その後別の関数で木全体を処理する、みたいなときに困る。

今どきのLLMって未知のプログラミング言語のワンショット学習はどの程度できるもんなんだろう。言語仕様と標準ライブラリのリファレンスを渡したら上手いことコード生成とかしてくれるんだろうか。

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の方が速くなる。

Replying to Avatar ると

https://x.com/cryolite/status/1764054302644175144

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

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

1. 日時を一定時間(1分など)に区切り、エポックと呼ぶ。

2. プレイヤーは現在時刻より先のエポックを選び、エポック番号をつけてロビーへの入室リクエストをサーバーに送る。

3. サーバーではエポックの終了時刻が過ぎて十分な時間が過ぎてから、検証可能なアルゴリズムにを使ってそのエポック内でマッチングをする。このエポックにエントリーしたプレイヤーのリストとマッチング結果を全ユーザーに公開する。

このプロトコルではプレイヤー同士が共謀して仲間内でのマッチングを避けたり逆に仲間内でのマッチング確率を上げたりできてしまう。ただ、それは単純なロビーシステムでもタイミングをずらしたり揃えたりしてできるので問題ないはず。

エポックは1秒間隔とかにして、エポック内に十分な数のプレイヤーが溜まってなければ持ち越しとかにした方が待ち時間は少なくできるか。

https://x.com/cryolite/status/1764054302644175144

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

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

1. 日時を一定時間(1分など)に区切り、エポックと呼ぶ。

2. プレイヤーは現在時刻より先のエポックを選び、エポック番号をつけてロビーへの入室リクエストをサーバーに送る。

3. サーバーではエポックの終了時刻が過ぎて十分な時間が過ぎてから、検証可能なアルゴリズムにを使ってそのエポック内でマッチングをする。このエポックにエントリーしたプレイヤーのリストとマッチング結果を全ユーザーに公開する。

このプロトコルではプレイヤー同士が共謀して仲間内でのマッチングを避けたり逆に仲間内でのマッチング確率を上げたりできてしまう。ただ、それは単純なロビーシステムでもタイミングをずらしたり揃えたりしてできるので問題ないはず。

Rustにはライフタイムを無限に延長できるバグがあり、それを使うとsafe Rustでもtransmute (任意のキャスト)もnull参照もuse after freeもできるということらしい。

https://fedibird.com/@matsuu/111980932666676130

https://github.com/Speykious/cve-rs/blob/main/src/lifetime_expansion.rs

https://github.com/rust-lang/rust/issues/25860

コーディング支援AIチャットで、現在のgit diffを参照できると嬉しいんだけど、GitHub Copilot Chatとかはできるんだろうか。Codeiumはできなかった。

こんな感じだとよい:

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

Swiftで関数が投げる例外の型を明示する提案が出ている。

https://github.com/apple/swift-evolution/blob/main/proposals/0413-typed-throws.md

ただ、1つの型した指定できず、ユニオン型もないため、複数の種類の例外を投げる場合は従来と同じようにany Errorを投げるものとして扱われる。エラーをラップするようなenumを自前で定義する必要がある。

いい感じの分散SNSプロトコルを想像してみる。

Secure Scuttlebuttみたいに各ユーザーはアクティビティ(投稿やいいねやプロフィール更新など)のリストを持ち、それを各ノードで同期する。

アクティビティは1つ前のアクティビティのハッシュ値を持っていて電子署名されている。

全件取得しなくても良い。特に最新のプロフィールや最新のフォローリストなどはすぐ取得できるようにする。

ローカルデータをバックアップからリストアした場合や複数デバイスで更新した場合はチェーンがフォークするが、これをマージできるようにする。

削除を部分的にサポートする。本文をハッシュ値で置き換えたアクティビティで上書きできるようにする。他のノードにも上書きをお願いするアクティビティを公開する。

QEMU上で動かしてるWindows 10をWindows 11にするのに再挑戦して、なんとかWindows 11をクリーンインストールする形で成功した。

Windows 8.1のパッケージ版のプロダクトキーなんだけど、ちゃんと通ってるっぽい。

なんかOVMFイメージを変えたりBIOSからTPMのキーをリセットしたりしてたらなんとなく動いた感じなので、達成感は無い。

Pklは普通に無限再帰するコードが書けて、stack overflowって言って終了する。一方Dhallは型により必ず終了することが保証されている。

TIL: JavaScriptで文字列を64文字ごとに区切るには、`s.match(/.{1,64}/g)`とすればよい。

別のコンテナと通信するテストがあるんだけど、その別のコンテナは起動に1分くらいかかるのでテストごとに起動すると遅くなる。しかしクリーンな状態でテストをしたい。

そこでテストの最後にdocker compose downしてdocker compose up --detachするようにした。テストの先頭でもdocker compose up --detachしているので初回起動時もそのまま動く。

ファイルを保存するごとにテストとかには向いてないけど、そういうテストではないのでヨシ。

今は大きなテストケースが1つだけだけど、複数になった場合はどうしよう。富豪的にその数だけコンテナを立てる?