2026年10月10日、登録者1万人超の匿名投票サイト 「ツイッタラー世論調査」で、第1回ツイッタラー衆院選が開幕しました。 総選挙を中止して始まったこのイベントは、全登録者が自動で候補者になり、実際の 選挙制度に近いルールで議席を争うという、ちょっと変わった2週間の企画です。
ここでは、この選挙を成立させるためにやった技術の話を書いておきます。派手な 機械学習もブロックチェーンもなく、必要なのは「地味なデータ整備」と「毎日止まらない運用」でした。
議席設計: 1994年の制度を再現する
せっかくリアルな選挙シミュレーションをするなら、定数もそれっぽくしたい。ということで、衆議院は300小選挙区+比例212の合計512議席(1994年の選挙制度改革で生まれた 300選挙区+比例という骨格をベースにしています)、参議院は1970〜2000年当時の47選挙区152+比例100=252議席を採用しました。
小選挙区は1位当選(好き票+1・嫌い票-0.5)、比例はサン=ラグ方式で党の得票から配分し、 党内は得票順の名簿で当選——という本格ルールです。参議院は非拘束名簿式にしました。
いちばん大変だったのは「地図」だった
選挙区ページには日本地図を表示して、当選者が確定した区から色が塗られていく演出を 入れています。ここで問題になったのが、手元にあった選挙区ポリゴンデータが289区 (2022年時点の現実の区割り)しかなかったこと。
しかも、足りない11区を最初は「多角形を直線で2分割」という手抜きで作ったら、 「そんな区割りはおかしい、市区町村の境に沿わせて」と当然の指摘が入り、作り直しになりました。 最終的には共同通信が公開している「市区町村×選挙区」のオープンデータから、実際の市区町村境界に 沿った11区を生成するパイプラインを組み直しています。投影法の微妙なズレ補正(メルカトル図法の当てはめ)、 北海道だけ元データと系統が違う問題など、地図データの落とし穴は記事一本分ありました。
毎時スナップショットで「情勢」を見せる
開票中は「党勢の推移グラフ」や「注目の接戦区」を表示していますが、これらは1時間ごとに議席状況をDBに記録するスナップショット基盤の上に成り立っています。この定期処理はメインPCとは別の小型サーバー(N100)側のcronで動かしていて、 万が一メインPCが落ちても記録は進み続ける構成です。
掲示板には技術を盛り込みすぎた
リアルタイムの議論の場として、管理スレ(掲示板)や人物ページのコメント欄には:
- Markdown(太字・リスト・引用・表・リンクカード)と2ch互換の色タグ
- LaTeX数式(KaTeX) と Mermaidの図(```mermaid コードブロックがそのまま図になる)
- レス番号と >>アンカー、返信のスレッド表示、レス内検索
- 既読管理+新着ジャンプ、アンカーのホバープレビュー、スクリーンショットなしで済む レス単体リンク共有
- !dice 2d6 みたいなコマンド(乱数は本文から決定的に生成するので、 誰が見ても同じ結果になる)
ユーザー投稿はすべて sanitize を通し、MermaidやKaTeXのような重い処理は 必要なときだけ遅延読み込みする——「盛りたい」と「軽くしたい」の戦いでした。
運用: 不正対策とノーログの両立
開幕後、特定ページへの組織的な一斉投票が観測されました。こうした投票は 「そのページに初めて来た1票だけ」などの行動パターンから検知し、退避テーブルに移して後から無効化できる仕組みを作っています (誤検知しても戻せるようにしています)。
一方で、IPアドレスはそもそも保存していません。レート制限はメモリ上だけで完結させ、 アクセスログも切る。匿名・無法地帯というサイトの性格上、「何かあったときに記録を見せる」 運用はしない、というのが一貫した方針です。
おわりに
選挙はまだ開票期間中です。この規模のイベント運用は初めてでしたが、 「データを正しく整えて、小さく継続する」だけで、ここまでリアルなものを作れるのだなと 自分でも思いました。結果が出たら、また振り返りを書くかもしれません。
▼ 関連: ツイッタラー世論調査 / 第1回ツイッタラー衆院選