【meigen.life】【step1】Slide機能Only
Slide機能だけあるサイトを作る
機能
名言データからランダム順序の名言スライドを作り、1枚1枚捲れる
規律のある美しいレイアウト
コア機能実装について思考
hr.icon
全データをランダムな順序でロードしたい
背景
ユーザーが毎度毎度同じ順序で名言を見てしまうと飽きる。
アクセスするたびにランダム順序でデータを見れるようにすることで飽きを防ぐ。
毎度何かアクセスしたら刺激があるという状態にしたい。
実現可能性:全然ある
前提:
名言のIDは連番で保存される
候補
1. 初期リクエストの際にサーバーで生成されたSeed値を元にサーバー/クライアントで同じランダム順序のIDリストを生成
全データに関するIDリストをクライアント側に持たせさえすれば、あとはクライアントから徐々にデータをfetchできる。
2. サーバー側で10~20個くらいのランダム順序セットを作っておき、ユーザーにはそのうちのどれかを提供する
完全なランダムを提供できないのが痛いところ。これは避けたい。高頻度ユーザーに通用しない。
具体的な方法はそうだな。リクエスト情報は以下のような形になるだろう。
順序セットIDとoffset(順序idリストの中でどこからほしいか)
これで、ステートフルっぽくできる。
3. urlにseedとoffsetを混ぜてリクエストする方法
これもありかも。
「1.」との違いは、クライアントはデータ取得に徹することができるってこと。
結論
クライアント側でIDリストを持つ形にするか。つまり「1.」の方法。
閲覧履歴とかをlocalStorageで持たせて、見てない名言を優先的に表示したい場合とかも対応できそうだ。
思考Log
1リクエストで全データを渡すわけにはいかない。相手が4Gとかなら尚更OUTかな?
redisとか噛ませるのかな?
どうだろう...待てよ。
まず、idが1~1000だと想定した場合、idの順序リストくらいは渡してもいいんじゃないか?
どれくらいのサイズになるやろ。
受け渡しのサイズは文字列だから、1が1byteだろ?1000は4byteだ。
asciiエンコードなら。
つまり、1~1000のバイトを足したら合計なんぼになる?
Claudeに相談した結果...
redisとかいらん。そんなややこしいことしなくていい。
まず、1000個程度のデータなら、idを連番にしておいて、それをランダム順序にしてクライアントに渡し、クライアントはそのidリストを元に適宜データをloadingすればいい。
1000個程度なら、連番のidリストのサイズは3,4KBくらいに収まるだろう。屁でも無い。
10,000個となると少し大きくなる。
こうなるとランダム順序の全データのidリストをクライアントに渡すための方法は考えることになる。
方法として、ランダムシードを使う方法があるらしい。
サーバーはランダムシードを使って数十個?のデータを埋め込んだhtmlを返しつつ、ランダムシードも渡しておく。
クライアントはhtmlを受け取ったあと、裏側でランダムシードからサーバーが作ったランダム順序のidリストを生成する。
そのidリストを使って、段階的なフェッチができる状態にする。
とにかく、idリストをクライアントが持つことで、データアクセスの柔軟性が増す。
また、ユーザーがidを作らない連番形式のデータ保管なら、なおのことやりやすい
todo.icon seedに依存したランダム順序のidリストを生成できるようにする
todo.icon 生成にかかる時間を計測する。実際にCloudflare workersで動作させてチェックする
todo.icon 適当な名言データを集めておく(20個くらい)
todo.icon 超簡単なPoCを作ってみよう。
機能
リクエストを出したら、ランダムなid序列で最初の10個くらいをhtmlにレンダリングした状態で返してる。
クライアント側はseed値をもらってランダムid序列を生成し、loadアクションが行われるごとにデータを取得しにいき、都度レンダリングする。
D1を使ってみよう。D1にデータを保存しておく。