Setting Analyzer Pro(パチスロ設定推測・期待値計算ツール)
パチスロ・スマスロの設定推測(ベイズ推定)と天井期待値をブラウザで計算できる静的サイトです。
機種データは app.js に保持し、解説記事・機種別ランディングページは Node スクリプトで HTML を生成します。
目次
主な機能
| 機能 | 説明 |
|---|
| 設定推測 | 総ゲーム数・BIG/REG(機種によりラベル変更)から、各設定の推定確率(%)を算出 |
| 天井期待値 | 現在ゲーム数から天井到達までの期待値・狙い目ゲーム数。機種により通常時/朝一リセット時を表示 |
| 機種スペック表 | 選択機種の設定別スペックを一覧表示 |
| 設定推測要素ページ | setGuessElement/ 配下に機種別の判別要素(外部画像リンク含む) |
| 解説記事 | guide/ に設定・天井・ツールの使い方などの記事(テンプレート+本文で生成) |
- 天井のみ:機種名と現在ゲーム数だけ入力して「推測する」でも、天井期待値ブロックのみ表示可能。
技術スタック
- フロント: HTML / CSS / JavaScript(
index.html + app.js + style.css)
- 計算: ベイズ推定(対数尤度 + Log-Sum-Exp で数値安定化)
- ホスティング想定: 静的ファイルのまま配信(サーバー不要)
- ビルド: Node.js(記事生成・機種LP生成のみ)
ディレクトリ構成
ビルド方式: ソース(index.html・app.js・articles/・templates/・data/machines/)を git 管理し、node scripts/build.js が dist/ に全ページを生成します。Vercel はこの dist/ を配信します。guide/・machines/*/index.html・setGuessElement/index.html・sitemap.xml・machines-data.js は生成物のため git 管理外(.gitignore 済み)です。
**機種データの正本は data/machines/*.json(1機種1ファイル)**です。以前は app.js と LP生成側に同じ配列が二重に存在していましたが、JSON に一本化しました。ビルドが dist/machines-data.js(window.MACHINES)を生成し、index.html が app.js より前に読み込みます。
winSlot/
├── index.html # メインアプリ(machines-data.js → app.js の順で読み込む)
├── app.js # 推測・UI ロジックのみ(MACHINES は window から取得)
├── style.css
├── 404.html # Vercel が未存在URLに配信(noindex)
├── og-default.png # OGP / Twitter カード用(トップ)
├── ads.txt # AdSense 用(公開ルートに配置)
├── robots.txt
├── vercel.json # buildCommand / outputDirectory / リダイレクト
│
├── data/
│ └── machines/ # ★ 機種データの正本(1機種1 JSON)
│ ├── index.json # 表示順を保った id の配列
│ └── {id}.json # スペック・天井・cautions・guessElementPath
│
├── setGuessElement/ # 設定推測要素ページ(*/index.html は手動メンテのソース)
│ # ※ ルートの index.html はビルド生成(git 管理外)
├── templates/
│ └── article-layout.html # 解説記事の共通レイアウト
├── articles/
│ ├── manifest.json # 記事メタデータ
│ └── *.html # 記事本文断片
│
├── scripts/
│ ├── build.js # ★ ビルド統括(dist/ に全ページ生成 + machines-data.js)
│ └── build/
│ ├── machines.js # data/machines/ のローダ(唯一の正本読み込み)
│ ├── articles.js # guide/ を生成
│ ├── landing-pages.js # machines/・setGuessElement/index・sitemap.xml を生成
│ └── setguess-seo.js # setGuessElement の meta / 機種LP 導線を付与
│
├── dist/ # ビルド出力(git 管理外。Vercel が配信)
├── .githooks/ # Git フック(post-commit で自動 push 用・任意)
└── .cursor/
└── skills/ # Cursor Agent Skills(リポジトリ単位・任意)
Cursor Skills(エージェント)
このリポジトリ用の Cursor Agent Skills を .cursor/skills/ に置いています(プロジェクト限定。他リポジトリには自動では効きません)。
| Skill | 用途 |
|---|
japanese-concise | 日本語で簡潔に答える方針 |
post-implementation-security | 実装後の静的サイト向けセキュリティチェックリスト |
チャットで /japanese-concise など Skill 名を指定して使えます(Cursor のバージョンにより UI が異なる場合があります)。
ローカルでの確認
- リポジトリをクローンまたは展開する
node scripts/build.js を実行して dist/ を生成する
npm run preview(= npx serve dist)で dist/ を配信し、ブラウザで開く
メインアプリ単体は index.html を直接開いても動きますが、guide/ や machines/{id}/ への遷移を含めて本番同様に確認するには、ビルド後の dist/ をローカルサーバで配信してください。
使い方(アプリ)
- 機種名を入力または候補から選択
- 総ゲーム数・BIG/REG 等を入力(天井のみなら現在ゲーム数のみでも可)
- 推測する を押す
コミット後の自動 git push(任意)
ファイルを保存しただけでは GitHub に送られません。
Git は「コミット」された変更だけを push できます。このリポジトリでは、コミットが終わった直後に git push する Git フックを用意しています(Vercel は従来どおり GitHub への push をトリガーにデプロイ)。
注意
- ローカルでのみ有効です。
core.hooksPath は各クローンごとに1回設定が必要です。
- すべてのコミットのあとに push が走ります。まとめてコミットしたくない場合は
git commit --no-verify でフックをスキップできます。
- upstream(
git push -u)が未設定のブランチでは push をスキップし、メッセージを出します。初回だけ手動で git push -u origin <ブランチ名> してください。
有効化(リポジトリのルートで1回)
git config core.hooksPath .githooks
macOS / Linux ではフックに実行権限が必要なことがあります。
chmod +x .githooks/post-commit
Windows(Git for Windows) では通常、そのままで動きます。
無効に戻す
git config --unset core.hooksPath
(デフォルトの .git/hooks に戻ります。)
フックの中身
.githooks/post-commit … 追跡ブランチがあるときだけ git push を実行
デプロイ(Vercel)
- Vercel は
vercel.json の buildCommand(node scripts/build.js)を実行し、outputDirectory(dist/)を配信します。GitHub への push がトリガーです。生成物は git に含めません。
vercel.json では /articles/:slug → /guide/:slug、および旧機種LPパス(/machines/:id/ceiling・setting・beginner など)→ /machines/:id/ の 301 リダイレクトを定義しています(trailingSlash: true に合わせ、末尾スラッシュあり/なしの両方をカバー)。
- 未存在URLには
dist/404.html(noindex)が HTTP 404 で返ります(以前の「全URLに index.html を 200 で返す catch-all rewrite」はソフト404の原因になるため廃止)。
vercel.json のリダイレクト定義は node scripts/verify-vercel-machine-redirects.js で確認できます(デプロイ前のチェックに利用)。
- デプロイ直後(本番): Search Console の URL 検査で旧パス(例:
/machines/hokuto/ceiling/)が正規の machines/{id}/ へリダイレクトされることを確認し、必要なら インデックス登録をリクエスト。サイトマップから sitemap.xml の再送信も推奨。数週間後に ページ レポートでインデックスの推移を確認する(即時には完了しない運用タスク)。
- 本番ドメイン(例:
pachislot-setting.com)に合わせて、index.html の canonical / og:url、各ページの絶対URL、contact.html の Formspree _next、Search Console の所有権確認などを揃えてください。
ビルドスクリプト
node scripts/build.js(= npm run build)が唯一のビルド入口です。dist/ を空にして静的ファイルをコピーし、以下のモジュールを順に呼んで全ページを生成します。Vercel もこのコマンドを実行します。
| モジュール | 内容 |
|---|
scripts/build/machines.js | data/machines/index.json + {id}.json を読み、MACHINES・GUESS_ELEMENT_PAGES・CAUTIONS_BY_ID・SUGGESTION_RANKS を返すローダ(機種データの唯一の読み込み口)。suggestions のスキーマ検証もここ |
scripts/build/suggestion-rates.js | 設定示唆ランク → 設定別出現率の生成器。Node(スキーマ検証)とブラウザ(尤度計算)の両対応で、ビルドが dist/suggestion-rates.js にコピーする |
scripts/build/articles.js | templates/article-layout.html + articles/* から dist/guide/*.html と dist/guide/index.html を生成 |
scripts/build/landing-pages.js | 機種データから dist/machines/*/index.html・dist/setGuessElement/index.html を生成し、dist/sitemap.xml を出力 |
scripts/build/setguess-seo.js | dist/setGuessElement/*/index.html(コピー済み)に meta / OG / パンくず / 機種LP導線を付与。既存の手書き description は上書きしない |
build.js は機種データを1回だけロードして各モジュールに渡し、ブラウザ用の dist/machines-data.js(window.MACHINES / window.SUGGESTION_RANKS)と dist/suggestion-rates.js も生成します。
検証用のスクリプトが scripts/dev/ にあります。
| スクリプト | 役割 |
|---|
scripts/dev/baseline.js | 設定判別の回帰テスト。実装前に測定した基準値と照合し、差異があれば exit 1 |
scripts/dev/suggestion-check.js | 設定示唆の尤度計算と入力UIの検証(要 npm run build) |
scripts/dev/suggestion-sanity.js | 設定示唆の校正ガードレール。「示唆が1つも出ていない」ことの尤度比を投入済み全機種で測る(要 npm run build) |
scripts/dev/dist-sandbox.js | 上記2つが使う共通処理。dist/ の実物をブラウザ相当の vm で読み込む |
scripts/dev/mini-dom.js | 上記で使う検証用の極小DOM(依存パッケージを増やさないため jsdom は使わない) |
ソースを編集したら node scripts/build.js を一度実行して dist/ を確認すれば、本番と同じ出力になります。dist/ は git 管理外なのでコミット対象はソースのみです。
その他の運用スクリプト(ビルドとは独立。手元で実行):
| コマンド | 内容 |
|---|
node scripts/gsc-analyze.js data/gsc.csv | Search Console のCSV/TSV(検索パフォーマンス)を解析し、CTR低/順位11〜20の改善候補を reports/gsc-actions.md に出力 |
node scripts/update-access-ranking-from-gsc.js data/gsc.csv | GSC エクスポートからクリック数上位5件を data/access-ranking.json に更新(トップのアクセスランキング表示用) |
node scripts/verify-vercel-machine-redirects.js | vercel.json の 301 定義が揃っているか検証 |
解説記事の追加(パターンB)
レイアウト1本(templates/article-layout.html)+本文だけ別ファイルで管理しています。
手順
-
articles/manifest.json に1件追加(slug は英数字とハイフンのみ推奨)。author(省略時は slotterY)・published(YYYY-MM-DD)を入れると、記事ページの h1 直下・JSON-LD・一覧に反映されます。追記更新時は updated も利用可能です。
{
"slug": "my-article",
"title": "記事タイトル",
"description": "meta description 用の説明文",
"author": "slotterY",
"published": "2026-04-02"
}
-
articles/{slug}.html を新規作成(<!DOCTYPE> 不要)。既存記事と同様に次の骨子で:
<section class="card page-card">
<h1 class="page-title">記事タイトル</h1>
<div class="page-body">
<p>リード文</p>
<h2>見出し</h2>
<p>本文…</p>
</div>
</section>
-
ルートで実行:
node scripts/build.js
dist/guide/{slug}.html が生成され、dist/sitemap.xml にも自動で列挙されます。トップの 解説・使い方 セクション(index.html)にリンクを足す場合は手動で追加してください。
本文に <!-- generated:ceiling-list --> と書くと、ビルド時に全機種の「期待値がプラスになる回転数」の表(scripts/build/ceiling-list.js)に置き換わります。いまは ceiling-target-list(天井狙い目一覧)だけが使っており、機種を追加・修正すると表も自動で更新されます。
レイアウトだけ変更したいとき
templates/article-layout.html を編集後、再度 node scripts/build.js で全記事に反映されます。
機種の追加・編集
機種データの正本は data/machines/{id}.json(1機種1ファイル)です。app.js にも LP生成側にもデータを書く必要はありません。
追加手順
data/machines/{id}.json を作成する(既存ファイルをコピーして値を変更するのが楽)。設定スペック・天井・avgBonusReward・normalCostPerGame・addedDate のほか、設定推測要素ページがあれば guessElementPath、注意点があれば cautions(最大3件表示)を入れる。機種名に漢字・英字が含まれる場合は、機種選択の検索用に aliases(読みや略称。例: ["ほくと", "ほくとのけん"])も入れる。カタカナ・ひらがな・全角半角の違いは検索側で吸収するので、機種名の表記と同じ語は不要。天井期待値は settings の最低設定の big を「天井のカウントが戻る当たり」として計算する。CZ 確率を big にしている機種や天井が CZ 行きの機種など、この前提が合わない場合は ceilingEv(hitRate・avgReward・ceilingReward・costPerGame・出典を書く note)で計算用の値を別に持たせる。朝一リセット後だけ1回の平均獲得や天井恩恵が違う機種は ceilingEv.resetAvgReward・resetCeilingReward も入れる。周期天井・ランダム天井など、ゲーム数で決まる当たりの形で表せない機種は ceilingEvUnsupported に理由を書くと、ツールと機種ページで期待値を出さなくなる。設定1を0Gから打つ期待値がプラスになる機種(出玉率と矛盾)はビルドが警告する。
data/machines/index.json の配列に id を1行追加する(この配列の順序が一覧・サイトマップの表示順になる)。
node scripts/build.js を実行 → dist/machines/{id}/index.html・dist/machines-data.js・dist/sitemap.xml が更新される。
- トップの
index.html の「対応機種一覧」(静的 <ul>)にも <li><a href="machines/{id}/">…</a></li> を追加する。
- 設定推測要素ページを置く場合は
setGuessElement/{dir}/index.html を作成し、JSON の guessElementPath をそのパスに合わせる。
解析待ちの新台(先行ページ)
設定別の確率が揃っていない新台も、導入前から検索されるので機種ページだけ先に出せます。JSON に pending を入れると「解析待ち」の機種になります(例: 通常機種に移す前の vivy.json。2026年10月30日時点では akamatar.json・ryza_atelier.json が解析待ち)。
pending.known … 判明していること、pending.unknown … まだ分かっていないこと(どちらも文章の配列)。機種ページの冒頭に出る。
settings は分かっている設定・値だけ入れ、分からない reg は null(スペック表に「調査中」と出る)。big は全設定に数値が必要。天井は ceiling ではなく known に文章で書く。
- 計算ツールの機種選択には出さない(残った設定だけで推測してしまうため)。新台ピックアップには「導入・解析待ち」として出す。「N機種対応」の数にも含めない。
- 1日回したときの設定の見分けやすさ・合算列・期待値表は出さない。トップの「対応機種一覧」(手順4)にも追加しない。
- 解析が揃ったら
pending を消し、ふつうの機種として値を埋めて手順4を行う。
仕組み
scripts/build/machines.js が data/machines/ を読み、MACHINES(LP生成・サイトマップ用)と window.MACHINES(ブラウザ用 dist/machines-data.js)の両方を供給します。
- 旧構成の
/machines/{id}/ceiling/ 等へのリンクは、本番の vercel.json で同一の machines/{id}/ に 301 されます(ページ内 #lp-ceiling 等へは手動でスクロール)。
設定示唆演出の判別への組み込み
AT終了画面などの設定示唆演出の観測回数を入力として受け取り、既存のベイズ設定判別の尤度に乗算します。データを入れた機種だけで動き、suggestions が無い機種は従来どおりです。投入済みの機種数は npm run build の Suggestions: N / 97 machines の行、機種の一覧は node scripts/dev/suggestion-sanity.js で確認できます(README に機種名を書くと必ず古くなるため置いていません)。
まずここに注意(データ転記の事故源)
- ファイル名の規則が2系統です。
data/machines/ は snake_case(street_fighter6.json)、setGuessElement/ は camelCase(streetFighter6/)。両者は guessElementPath でのみ繋がっています。
setGuessElement の ge-badge-* クラスは示唆文言と一致していません。 例えば sengokuOtome5 では「設定3以上濃厚」に confirm4、「設定5以上濃厚」に high-strong が当たっています。必ず文言を正本にし、クラス名は見ないでください。
settings のキーは1〜6で揃っていません。 97機種中19機種が非連続(valvrave2 は設定3なし)。率は固定の6列表ではなく Object.keys(machine.settings) から生成しています。
書き方
data/machines/{id}.json のトップレベルに suggestions を足します。
"suggestions": {
"trialSource": "big",
"groups": [
{
"id": "stamp",
"label": "出陣ボーナス終了画面(スタンプ)",
"exclusive": true,
"items": [
{ "id": "none", "label": "スタンプなし", "rank": "default" },
{ "id": "ryo", "label": "良スタンプ", "rank": "ge4" },
{ "id": "goku", "label": "極スタンプ", "rank": "eq6" }
]
}
]
}
| フィールド | 必須 | 説明 |
|---|
trialSource | 任意(既定 "big") | 試行回数(分母)の出所。"big" / "reg" / "bigPlusReg" |
groups[].id / .label | ✅ | id は機種内でユニーク。label は入力欄の見出し |
groups[].exclusive | 任意(既定 true) | 下記参照 |
items[].id / .label | ✅ | id はグループ内でユニーク |
items[].rank | ✅ | ランク名。配列も可(["ge4","odd"] のような複合表記用) |
items[].settings | rank:"set" のとき | 例 [2,4,6] |
items[].rates | 任意 | 出現率の実測値が公表されている演出用。設定別の率を直接書くとランクより優先(例: valvrave2 のコクピットモニターは解析ページに「約1%」とあるので {"6": 0.01}) |
trialSource の選び方
bigLabel と regLabel のどちらがその示唆の契機かを必ず確認してください。 機種によって初当たりが reg 側に入っています。
| 機種 | bigLabel | regLabel | 示唆の契機 | trialSource |
|---|
sengoku_otome5 | AT初当たり | (なし) | AT終了 | big |
street_fighter6 | ファイターズバトル初当たり | ボーナス初当たり | ボーナス終了 | reg |
tokyo_revengers / jashin_chan | 初当たり / ボーナス初当たり | AT初当たり | AT終了 | reg |
reg を指定したのに regLabel が null だと入力欄自体が非表示になり分母が常に0になるため、ビルドが落ちます。
exclusive の選び方
その演出の分母が trialSource と一致するかどうかで決めます。73機種を入れた結果、判断はこの3分類で足ります。
分母と trialSource の関係 | 扱い | 例 |
|---|
| 一致(その契機ごとに必ず1回抽選される) | true +デフォルト行 | AT終了画面、ボーナス終了画面 |
| 部分集合・倍数(同系統だがズレる) | false、デフォルト行は置かない | ATセット開始ごとの扉絵、REG側のカットイン、CZ失敗時のみの示唆 |
| 完全に別系統(頻度が連動しない) | 不採用 | エンディング中のシール・ボイス・サイン |
true は多項分布で扱い、入力しなかった項目は「出なかった」という否定的証拠になります。
false は項目ごとの独立二項。獲得枚数・トロフィー・ボイスのように出ること自体が稀な単発事象もこちら(獲得枚数系は35グループ中34グループが false)。非排他グループではデフォルト行は尤度に効かないので置きません。
- 同じ抽選を条件で分割したグループは必ず
false。 birdie_wing のイヴ周期/葵周期のカードや discup_ultraremix のREG中モード別演出は、1回の試行がどちらか一方でしか発生しません。両方を true にすると、各グループが同じ試行回数ぶんのデフォルトを数えて否定的証拠が二重に効きます。
- 同じ画面上の別抽選を2つとも
true にしない。 sao2 はAT終了画面とコパンダトロフィーを両方 true にしたところ、1枚の画面を見た事実から「何も出なかった」証拠を2回取る形になり、尤度比が 1:280 まで伸びました(トロフィー側を false にして 1:29.5)。
採用してはいけないもの
- 分母が別系統の演出。
trialSource はグループ単位ではなく機種単位なので、契機が違うものを同じ機種に混ぜられません(valvrave2 のハラキリチャレンジ中演出、street_fighter6 のエンディング中ボイス/LED は、この理由で採用していません)。
- 同じ抽選を違う粒度で言い換えた表。
monhan_rise の「キャラ性別(女性=偶数示唆/男性=奇数示唆)」は終了画面キャラと同じ抽選なので、両方入れると同じ観測を二重に数えます。
- 設定と無関係な示唆。 モード示唆・テーブル示唆は
rank: "ignore" にします(尤度には寄与せず、結果欄に「設定判別には使用していません」と出ます)。
ランク
正本は data/suggestion-ranks.json。ge2〜ge5(設定N以上濃厚)、eq6(設定6濃厚)、not1〜not5(設定N否定)、even / odd / evenWeak / oddWeak / evenHard、highWeak / highMid / highStrong、upWeak / upMid / upStrong、set、favor5、default、ignore の25種です。
率の数値はすべて推定値で公表値ではありません(各ランクの "source": "estimate")。「1グループの示唆が設定6で1割前後の頻度で出る」を目安に置いています。これより高くすると、示唆を1つも見ていないこと自体が強い低設定証拠になりすぎます。調整するときはこのファイルの base / from / to だけを触ってください(app.js の変更は不要)。
favor5(設定5優遇)だけは weights で設定ごとの重みを持ちます。当初は設定1・2の重みが無く、出現率0=除外として扱われていました。「設定5優遇」という文言は設定1・2の否定までは意味しないため、低い重み(0.1 / 0.2)を与えて除外をやめています。
確認
npm run build # スキーマ検証。ランク名の打ち間違い等はここで落ちる
node scripts/dev/baseline.js # 回帰。既存の推測結果が変わっていないか
node scripts/dev/suggestion-check.js # 示唆の尤度計算とUIの検証(要 npm run build)
node scripts/dev/suggestion-sanity.js # 校正ガードレール(要 npm run build)
suggestions を足したら必ず4つとも通してください。特に baseline.js は、示唆機能が既存の判別を壊していないことの唯一の担保です。
suggestion-sanity.js は、投入済み全機種について「初当たり20回ぶん、どのグループにも示唆が1つも出ていない」の尤度比(最高設定 : 最低設定)を測ります。exclusive: true のグループは「入力しなかった項目=出なかった」を否定的証拠として使うため、これがグループのぶんだけ積み上がります。 効くのはグループ数だけではなく、グループ内の非デフォルト項目の率の合計です(項目が多いほどデフォルトの取り分が小さくなり、デフォルトを引き続けることが強い低設定証拠になる)。
事後確率ではなく尤度比で見るのは、事後確率が機種のスペックと測定点に依存するからです(初当たりの重い機種は示唆と無関係に設定6が低く出るので、機種間で比べられません)。尤度比が 1:1000 を超える、または1グループの示唆出現率が30%を超えると落ちます。落ちたらその機種の項目を減らすか、複数機種で出ているなら data/suggestion-ranks.json の base / from / to を一律で下げてください。1:100 を超えた機種は落ちませんが「示唆を1つも見ていないだけで設定が決まる」水準なので、出力の末尾に見直し候補として並びます。
お問い合わせ(Formspree)
Formspree でフォーム送信を受け付けています。
- Formspree でフォームを作成し、Form ID(
https://formspree.io/f/ の後ろ)を取得
contact.html の <form action="https://formspree.io/f/..."> をその ID に合わせる
- 本番URL用に hidden の
_next を https://あなたのドメイン/contact-thankyou.html などに変更
スパム対策用に _gotcha(ハニーポット)を入れています。
Google AdSense / ads.txt
- 各ページ
<head> に AdSense スクリプトを埋め込んでいます(クライアントIDはご自身のものに差し替え可能)。
ads.txt をサイトルートに置き、クローラが https://ドメイン/ads.txt で取得できるようにしてください(Vercel ならリポジトリ直下でOK)。
ファビコン
-
favicon.png はビルド(scripts/build/pwa.js)が dist/ に描きます(リポジトリには置かない)。天井ラインと右肩上がりの棒グラフを紺地に金で描いた意匠で、タブの小ささでもつぶれないよう棒を3本に減らした版です。
-
全ページ(手書きのページを含む)が favicon.png をタブと iPhone のホーム画面の両方に使っています。トップ・機種ページ・解説記事だけは、iPhone のホーム画面用に細部まで描いた /icons/apple-touch-icon.png を指しています。
-
意匠を変えるときは pwa.js の MARK(ホーム画面用)と MARK_SMALL(タブ用)を直します。
-
setGuessElement を新規追加したとき、未反映なら必要に応じて:
node scripts/add-favicon-setguess.js
SEO(sitemap / robots)
sitemap.xml: dist/sitemap.xml としてビルド時に生成されます。新ドメインへ移行した場合は生成元(scripts/build/landing-pages.js の SITE_URL)を本番ドメインに統一してください。
robots.txt: Sitemap: の URL も本番に合わせることを推奨します。
og-default.png: トップの SNS シェア用(og:image / twitter:image)。差し替える場合は 1200×630 前後の PNG を推奨します。
- 機種ページの OGP 画像:
scripts/build/og-images.js がビルド時に dist/machines/{id}/og.png(1200×630)を機種ごとに描きます。機種名・天井・等価で期待値がプラスになる回転数・機械割を、機種ページと同じ計算から入れます(解析待ちの機種は「解析待ち」バッジと導入日)。SVG を @resvg/resvg-js で PNG にしており(X は SVG の og:image を表示しないため)、フォントは assets/fonts/ の Noto Sans JP Bold(SIL OFL、OFL.txt)だけを使います。Vercel のビルド環境に日本語フォントが無いので、このファイルは消さないでください。全機種の描画には約45秒かかりますが、描いた画像は node_modules/.cache/og-images/ に残し、機種データ(画像に載る値)が変わった機種だけ描き直します。
PWA(ホーム画面に追加)
scripts/build/pwa.js がビルドの最後に dist/manifest.webmanifest・favicon.png・dist/icons/(iPhone 用 180・PWA 用 192・512・maskable)・dist/sw.js を出します。
- Service Worker の正本はルートの
sw.js。ネットワーク優先で、圏外のときと、4秒待っても返ってこないときだけ前に開いたときの保存分を出します(キャッシュ優先にすると機種データを直しても古い数字が出続けるため)。他サイト(広告・フォント)のリクエストには関わりません。
- バージョンはトップの計算ツールに要るファイル(
index.html・app.js・machines-data.js など)の中身から決まるので、デプロイで中身が変われば古い保存分は自動で消えます。
- 登録はトップを開いたときに
app.js の initPwa が行い、「ホーム画面に追加」カードも出します(Android は追加できるときだけボタン、iPhone の Safari は手順の案内)。
- 確かめるときの注意: puppeteer の
setOfflineMode は Service Worker のリクエストには効かないので、オフラインの確認はサーバーを止めて行います。Windows で npx serve を止めても子の node が残ることがあります。
アクセス解析(GA4)
scripts/build/analytics.js がビルドの最後に、dist/ の全 HTML の </head> 直前へ GA4 の計測タグを入れます(ソースの HTML には書かない。手で管理しているページが多く入れ忘れが出るため)。
- 測定 ID はこのファイルの
GA_MEASUREMENT_ID。空のあいだと、本番以外(VERCEL_ENV が production でない=ローカル・プレビュー)のビルドでは入れません。
- 送るのはページの閲覧だけです。計算ツールに入力した回数などを送るイベントを足す場合は、先に
privacy.html を直してください(「入力内容は送信しない」と書いてあります)。
Lighthouse(パフォーマンスの目安)
初回描画まわりの改善として、トップでは Google Fonts のウェイトを 900 除外(見出しは 700 に統一)、AdSense スクリプトを </body> 直前へ移しています。さらに詰める場合は次で計測します。
- ビルドして別ターミナルで静的配信(例):
node scripts/build.js && npx serve dist -p 8080
- 計測:
npx lighthouse http://127.0.0.1:8080/ --only-categories=performance --view
- レポートの LCP 要素 と CLS を確認し、フォント読み込み・広告枠のレイアウトシフトなどを順に潰す
Search Console(GSC)改善ループ(運用)
ベースライン記録(改善の起点)
定期的(例: 月1回または施策前後)に次を記録しておくと、施策の効果測定がしやすいです。
- Search Console → 検索パフォーマンス → 期間を「過去3ヶ月」などに設定
- ページ フィルタで
https://www.pachislot-setting.com/(トップ)を選択し、総クリック数・総表示回数・平均CTR・平均掲載順位をメモまたはスプレッドシートに保存
- 同様に主要機種LP(例:
/machines/hokuto/、/machines/kabaneri/)をそれぞれフィルタして同じ4指標を記録
- クエリ タブで、トップと主要LPそれぞれ 上位20クエリ(クリック数または表示回数順)をエクスポートまたはスクリーンショットで残す
以降の改善(メタ・導線・速度)は、このベースラインとの差分で評価します。
CSV からの自動解析
- Search Console → 検索パフォーマンス から CSV/TSV をエクスポート(クエリ×ページ推奨)
data/gsc.csv(または任意のパス)に置く
- 解析:
node scripts/gsc-analyze.js data/gsc.csv
- 出力された
reports/gsc-actions.md の上位から、title/description・見出し・内部リンクなどを改善していく
※ data/gsc*.csv は .gitignore しています(個人データ・運用データなのでコミットしない想定)。
新機種追加時のチェックリスト(SEO・整合性)
data/machines/{id}.json を追加し index.json に id を足したあと、次を忘れずに行う(詳細は「機種の追加・編集」を参照)。
node scripts/build.js を実行する(dist/machines/{id}/ の LP と dist/sitemap.xml の URL・lastmod、dist/machines-data.js が更新される)
- トップの
index.html の「対応機種一覧」の該当 <details> 内の <ul> に <li><a href="machines/{id}/">…</a></li> を追加する
- 設定推測要素ページを持つ機種は、JSON に
guessElementPath(例: setGuessElement/fooBar/index.html)を設定する
- デプロイ後、Search Console の サイトマップ から
sitemap.xml を再送信する(任意だが推奨)
- 数週間後に GSC で新 URL の 表示・クリック が付き始めているか確認する
収録機種について
- Aタイプ(ジャグラー系・ディスクアップ・うみねこ2・秘宝系・エヴァBT など)と AT/ART(スマスロ) を収録。
- 収録数・スペックの正本は
data/machines/*.json(app.js とLP生成側で同じ配列を二重管理していた構成から一本化済み)。下記リストはメンテ用の目次です。
- 機種追加は「機種の追加・編集」の手順どおり JSON を1ファイル足して
node scripts/build.js。必要なら setGuessElement/ と index.html のリンクも追加します。
AT / ART機(スマスロ)
| ID | 機種名 |
|---|
kabaneri | 甲鉄城のカバネリ |
kabaneri_unato | スマスロ 甲鉄城のカバネリ 海門決戦 |
banchou4 | 押忍!番長4 |
hokuto | スマスロ北斗の拳 |
karakuri | からくりサーカス |
valvrave | 革命機ヴァルヴレイヴ |
monkey_turn_v | モンキーターンV |
tokyo_ghoul | L 東京喰種 |
kaguya_sama | かぐや様は告らせたい |
god_eater | ゴッドイーター リザレクション |
bakemonogatari | スマスロ 化物語 |
hokuto_tensei2 | 北斗の拳 転生の章2 |
koukaku | スマスロ 攻殻機動隊 |
dmc5 | デビル メイ クライ 5 |
hihouden | スマスロ 秘宝伝 |
tenken | 転生したら剣でした |
valvrave2 | L革命機ヴァルヴレイヴ2 |
enen | 炎炎ノ消防隊 |
tekken6 | スマスロ 鉄拳6 |
prism_nana | プリズムナナ |
azurlane | L アズールレーン THE ANIMATION |
zettai4 | L 絶対衝激IV |
railgun2 | スマスロ とある科学の超電磁砲2 |
onimusha3 | スマスロ 新鬼武者3 |
zenigata5 | L主役は銭形5 |
tokyo_revengers | スマスロ 東京リベンジャーズ |
iza_banchou | いざ!番長 |
monhan_rise | スマスロ モンスターハンターライズ |
enen2 | Lパチスロ 炎炎ノ消防隊2 |
magireco | スマスロ マギアレコード 魔法少女まどか☆マギカ外伝 |
okidoki_duo |
Aタイプ
| ID | 機種名 |
|---|
aim_juggler_ex | アイムジャグラーEX |
my_juggler_v | マイジャグラーV |
funky_juggler_2 | ファンキージャグラー2 |
gogo_juggler_3 | ゴーゴージャグラー3 |
ultra_miracle_juggler | ウルトラミラクルジャグラー |
discup_ultraremix | A-SLOT+ ディスクアップ ULTRAREMIX |
smaslo_hanabi | スマスロ ハナビ |
thunder_v | スマスロ サンダーV |
umineko2 | うみねこのなく頃に2 |
crea_hihouden | クレアの秘宝伝 BT |
eva_bt | エヴァンゲリオン 約束の扉 |
isekai_quartet_bt | A-SLOT+ 異世界かるてっと BT |
lb_triple_crown_seven | LB トリプルクラウンセブン |
kerotto5_bt | スマスロケロット5BT |
rooteisu | ローティス |
taco_slot | スマスロ タコスロ |
my_juggler_vi | マイジャグラーVI |
LP のパスは machines/{ID}/index.html です。
免責
本ツールの推測結果・期待値は参考用であり、実際の設定や収支を保証するものではありません。パチスロは法令とホールのルールを守り、楽しめる範囲でご利用ください。
ライセンス
未指定の場合はリポジトリ管理者の方針に従ってください。公開用リポジトリなら LICENSE ファイルの追加を推奨します。