「9種セット」を中身ごとに分けて、偽の商品が80個できていた
トレカダッシュ 開発の記録 / 2026年10月
iOS アプリ「トレカダッシュ」の商品リストを点検していて、ポケモンカードの「30th CELEBRATION カードセット」の周りに、実在しない商品が 80 個あることが分かりました。公式の商品は、9 つだけです。残りの 80 は、「9 種セット」を、中身ごとに分けてしまった結果、作られた偽の商品でした。HANDOFF の記録で、何が起きて、どう直したかを書きます。
このサイトには、トレカダッシュの作品ページがあります(トレカダッシュ)。ここに書くのは、開発の記録です。
9 種セットは、「1 つの商品」だった
店が出している「カードセット(9 種セット)」の抽選は、1 つの商品です。カタログには、「9 種類セット」(10,800 円)として登録されています。ところが、アプリの商品照合(複数の商品が書いてある記事を、商品ごとに分ける処理)が、この題名を、中身ごとに分けていました。「メガミュウツー X」や「ニャビー」のように、9 種の中身の名前が、それぞれ別の商品として扱われたのです。
その結果、こうなっていました。
| 状態 | 件数 |
|---|---|
| 分けられた元の記事(親)が、非表示になっていた | 22 |
| 分けて作られた記事(子) | 190(うち表示中 63) |
| 子のために作られた、偽の商品 | 80 |
画面には、1 つの抽選が、中身ごとの別々の抽選のように、並んでいました。
直し方:入口を止める、そして戻す
- 入口で、分けないようにする。「カードセット」+「N 種」という形の題名は、分割しません。
- 親を戻す。非表示にされた親 22 件を、「9 種類セット」の商品に戻しました。戻し方は、記事ごとに違います(表示に戻したもの 5 件、同じ店に表示中の 9 種セットがあって重複とみなしたもの 3 件、締切が切れていたもの 13 件、締切が無かったもの 1 件)。
- 子を外す。子 190 件は、「誤った分割」の印(
hiddenByWrongSplit)を付けて非表示にして、商品との結び付きを外しました。 - 偽の商品を消す。80 個を削除しました。消す前に、参照しているものが 0 であることを確かめて、元の内容を控えに保存してあります。
ただし、例外があります。「スターターセット ex ニャオハ/ホゲータ/クワッス 3 種セット」のように、題名に、商品名がすべて書いてある出品は、これまでどおり分けます。「N 種セット」は、1 つの商品として売られている、というのが、今回分かったことでした。
同じ点検で見つかった、ほかの偽の商品
- カードではないもの。アパレル、フィギュア、大会、音楽 CD の商品が、9 月 3 日から 10 月 3 日にも、作られていました。商品を作る入口に、カードではない名前の関門(
looksLikeNonCardMerchOrEventName)を足して、全カタログで誤爆 0 を確かめました。25 件を削除しました。 - 単品のカード。スニダン(スニーカーダンク)の出品に由来する、単品カードの商品を、合計 30 件、削除しました。その単品カードには、「定価」が付いているものがありました。「定価がある」ことは、「公式の裏取りがある」証拠にならない、と分かりました。裏取りの証拠は、
imageIsOfficialです。 - 3 パックを 1 つにした商品。複数の弾名を並べた、非公式の商品を、1 つ削除しました。紐付く 49 記事は、すべて期限切れでした。
これらを見張るために、監査(audit_catalog_clean.js)を足しました。単品カードの商品、複数の弾名の商品、応募ページの題名と商品の食い違い、商品から写した定価のズレ、カードではない名前の商品、の五つを、毎回数えます。
分かったこと
「分ける」処理には、「分けない」条件が要る。
- 1 つの商品を、複数に分けると、偽の商品が増える。分割は、「本当に複数の商品か」を確かめてから行う必要があります。
- 消す前に、参照を数える。参照がゼロであることと、控えを取ってあることを確かめてから、削除しました。
- 偽の商品は、入口と中身の両方で止める。入口の関門だけでは、すでにできたものが残ります。監査が、残りを数えます。
この記事は、HANDOFF(§272)の記録(2026年10月7日)から書きました。件数は、記録に書かれたものです。
この話に出てくるもの
- 「9種セット」の正体は御三家9商品だった — 同じ商品の、突き合わせの記録
- 「重複は実質ゼロ」と数えたのに、監査は112組を出していた — 同じ日の、別の記録
ほかの記録
- 「9種セット」の正体は御三家9商品だった:同じ商品なのに、決して一致しなかった — 他のまとめサイトと突き合わせたら、抽選の表示は54%だった。商品の取り違え、比べ方の左右非対称、記事IDの穴。カバー率を91%にした記録。
- 「重複は実質ゼロ」と数えたのに、監査は112組を出していた — 重複を統合する処理が、毎晩、先頭のジャンルの途中で時間切れになっていた。「ゼロ」と数えた自分の測り方が間違っていた。持ち回りに直して112組を0組にした記録。
- Firebase Auth:アプリを完全に終了すると、匿名アカウントが量産された(currentUser の復元待ち) — 「アプリを落とすと、また Apple のサインインを求められる」。管理画面を開くと、19人中17人が使い捨ての匿名アカウント。起動直後に currentUser を同期チェックしていた競争を、addStateDidChangeListener で直した記録。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。