Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Remix + Cloudflare Pages + Cloudflare D1 で ポケモン SV のレンタルチームを検索できるアプリを作ってみた

Atsusuke
January 21, 2023

Remix + Cloudflare Pages + Cloudflare D1 で ポケモン SV のレンタルチームを検索できるアプリを作ってみた

BuriKaigi2023 登壇資料です。Twitter で公開されているポケモンSVのレンタルチームを検索できるアプリを Remix + Cloudflare Pages + Cloudflare D1 で作成しました。Edge location でデータベース操作とレンダリングを行う爆速アプリの構成についてお話します。

アプリ:https://pokemon-rental-teams-search.pages.dev/

Atsusuke

January 21, 2023
Tweet

More Decks by Atsusuke

Other Decks in Programming

Transcript

  1. Twitter でレンタルチー ムを検索してみよう! # レンタルチーム , # レンタルパーティ or #pokemon

    vgc で検索! → 自分のお気に入りのポケモ ンが含まれているチームを見 つけるのが大変 13
  2. なぜ Cloudflare D1 を採用したのか Edge location で DB が動く =

    Origin server (DB)へのアクセス時間を短縮できる コールドスタートなし 22
  3. 投稿, 更新, 削除の実装 action POST, PUT, PATCH, DELETE など のミューテーションを定義する

    form 要素, useSubmit などからリ クエストする ルートに対して GET 以外のリクエ ストが行われた場合、loader の前 に action が呼び出される。 33
  4. Styling Flowbite を採用した - Tailwind CSS ベースの UI コンポーネントライブラリ バンドルサイズが

    1MB を超えないようにライブラリを選んだ UI ライブラリや CSS in JS ライブラリを入れると 1MB に抑えるのがきつい 34
  5. Remix v1.11.0 で CSS Modules と Vanilla Extract がサポ ートされました

    With this release, we can now support: Direct CSS side-effect imports CSS Modules Vanilla Extract remix v1.11.0 - GitHub 35
  6. pokemon-rental-teams-app まとめ Remix + Cloudflare D1 構成は  Edge location で

    DB 操作とレンダリングを行うので非 常に高速 Remix が変更があったレイアウトのみデータフェッチしてくれるため、検索のレスポン スも高速 バンドルサイズ 1MB (無料枠)の制限に注意 37
  7. Cloudflare Workers か ら Lambda を実行 AWS Lambda を叩くとレンタルチ ームの画像を含むツイート情報を

    返してくれるので、そのレスポン スを DB に書き込む CPU runtime が 10ms しかないか つ、Worker 非対応のライブラリが まだまだ多いため、DB 操作以外の 処理は AWS Lambda に切り出した 43
  8. レンタルチームの画像を 含むツイートを返す Twitter の Recent Search API を叩 いて取得したツイート情報から画 像の

    URL を取得する 取得した画像の URL を 画像比較 用の AWS Lambda に渡すと、画像 の一致率が返ってくる 一致率が閾値以上ならメモリにス タック、閾値未満なら破棄 44
  9. 画像の一致率を求める 単純な画素の比較 ユーザーは Switch の Twitter 連携 機能を使ってレンタルチームの画 像を投稿するので、縦横幅のサイ ズが

    1280 x 720 の JPEG 画像に 統一されている JPEG 形式の画像をバイナリデータ に変換して比較しているだけ 45
  10. AWS Lambda の並列実行 1280 x 720 の画像の画素比較にかかる時間は 1 枚あたり約 1

    秒 100 枚ほどの画像を比較すると、Amazon API Gateway の Timeout 時間 30 秒を超えて しまうため、Promise.All で並列実行する 1 分 30 秒 →19 秒に短縮 Lambda URL を使うと Timeout を 15 分まで伸ばすことが可能だが、今回は素直に並列 実行した 46
  11. pokemon-rental-teams-data-sync のまとめ 定期実行でレンタルチームのツイートを DB に書き込んでいる Cloudflare Workers は DB の操作のみ行い、他の処理は外部に切り出している

    レンタルチームの比較は単純な画素比較 画像比較の方法を変えると自動で収集できるツイートが増えるかも 48
  12. 全体のまとめ Twitter で公開されているレンタルチームを検索するアプリを作ってみたので、ポケモン 対戦に興味のある方はぜひ使ってみてください Remix + Cloudflare D1 で Edge

    location で動くアプリを簡単に作れるよ Worker の制限内に収まるように外部サービスをうまく活用してアプリケーションを設計 しよう 49