RumiCar シミュレータ v7.4.0 を公開しました。リリースノートは GitHub でも読めます。
v7.4.0
起動時に GitHub へ問い合わせる回数を減らし、教室のように1つの回線を大勢で共有する場所でも「みんなの投稿」が読めなくなりにくくしました。従来はページを開くたびに GitHub の API を4回(公式レース・投稿コース・投稿プログラム・投稿車種の一覧)使っていました。この API は認証なしだと回線(IPアドレス)あたり毎時60回までで、実測すると15回開いた時点で上限に達します。10人が同じ会場Wi-Fiから開く教室では、数回ずつ開いただけで打ち止めになり、投稿コースや投稿プログラムが「取得できませんでした」になっていました(本体は止まらない設計なので走行はできます)。対策を3つ入れています。①一覧をディレクトリ内の index.json から読むようにしました。この読み取り先(raw.githubusercontent.com)には API の回数制限がありません(応答に制限ヘッダが存在しないことを実測で確認しました)。上流リポジトリに index.json が置かれれば、投稿コース・投稿プログラム・投稿車種の一覧は API を1回も使わなくなります。公式レースの一覧だけはディレクトリを数える必要があり、index.json では代用できないため API のままです(こちらは下の③で覚えます)。②index.json が無いリポジトリ(古いクローンやフォーク)では従来どおり API を使うので、動作は変わりません。③取得した一覧をブラウザに一時保存し、その間は問い合わせません。保存時間は取得元で変えていて、制限のないマニフェスト由来は5分、貴重な API 由来と「まだ作られていない」(404)は1時間です。とくに公式レースのraces/ はまだ存在しないため、これまで毎回100%空振りの問い合わせを1回していましたが、これも覚えるようにしました。あわせて、大会のエントリー一覧も同じ仕組みを通しました(従来は大会1件につきAPI を1回使っており、大会を4本開催すると起動あたり4回で元の水準に戻ってしまうためです)。なお ETag による条件付き取得も試しましたが、304(変更なし)でも1回消費することを実測で確認したため採用していません(残り57→56→55)。「公式レース」と「ランキング」の再読込ボタンはどちらも一時保存を捨ててから取り直すので、押せば必ず最新になります。新しい投稿が見えるまでの遅れは、index.json 由来の5分に配信側(raw)のキャッシュ約5分が乗るため、最大で10分ほどとお考えください。安全面では、index.json に書かれたファイル名を素通しせず、ディレクトリ区切りや相対参照(../)を弾き、記号や日本語を含む名前をURL エンコードしてから取りに行くようにしています(素のまま繋ぐと「a#b.json」が別のファイルを指します)。すべてブラウザ内で完結する変更で、サーバ側の仕組みは増やしていません(このリポジトリは単体で完結するという方針のままです)。走行物理・決定論ハッシュf0〜f3・公式記録の verifyHash・共有URLはすべて不変です。
