大本営発表データベースを作っている話

# はじめに

この記事は「[長野高専アドベントカレンダー2024](https://qiita.com/advent-calendar/2024/nnct)」の8日目の記事となっています！

まさかの、7日ぶり2回目の記事となります！

前回の記事は、わが校が試験期間のため、初日の記事は主催してくれた@Crysta1221でした！

さて、私はというと、12月15日に行われる**あること**（これもアドカレで書きます！）の準備で、テスト終わりだというのにワタワタしています。
そのため、記事に時間をあまり割けませんでした ~~（計画性の無さが伺える）~~ 。
駄文で申し訳ありませんが、読んでいただけると幸いです。



# わたしはだーれ？

どうも！[**まっしぃ**](https://x.com/massy1102)です！長野高専の学生をやってます。
学年とか学科とかは、Twitter(現X)とかを漁ってもらえればわかるので、知りたい人はがんばってください。
今年は実名と顔を露出してしまうという~~愚かな~~行為をしたわけですが、幸いにも悪いことはまだ起きていません。よかった。

<!--
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E9%AB%98%E5%B0%82%E3%82%AD%E3%83%A3%E3%83%AA%E3%82%A2?src=hash&amp;ref_src=twsrc%5Etfw">#高専キャリア</a> のふりかえり〜<br><br>「準優勝」＆「オーディエンス賞」ありがとうございました🙏🏻<br><br>ぼく「皆さん正気ですか？」<br><br>会場にいた皆さん！ありがとうございました！！<br>初LTでしたが、とっても良い空気で発表しやすくて楽しかったです！ <a href="https://t.co/Q6wP9khRju">pic.twitter.com/Q6wP9khRju</a></p>&mdash; まっしぃ (@massy1102) <a href="https://twitter.com/massy1102/status/1830597804529738189?ref_src=twsrc%5Etfw">September 2, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
-->

# 今日12月8日は？

今日からちょうど83年前の1941年12月8日は、**「真珠湾攻撃」** が起きた日です。
これがきっかけに、日米の全面戦争がはじまり、太平洋戦争がはじまりました。

さて、太平洋戦争中の戦果発表として有名なのは、 **「大本営発表」** ですね。

なぜ急にこんな話をしたかというと、私は **「高専生なのに日本史が大好き」** という変な属性を持っており、特に**近現代史**が大好きなんですね。

## 閑話休題。ビブリオバトルに出た話
そういえば今年、学校の図書館がやっている**ビブリオバトル**(好きな本を紹介するコンテスト)で、個人的なイチオシ本である **『裏切りと嫉妬の「自民党抗争史」』** という本で発表をしました。
しかし、あろうことか**優勝**してしまい、政治的中立が求められる弊校のサイトに**自民党**という単語を載せるという行為をしてしまいました。申し訳ないと思ってます。

https://www.nagano-nct.ac.jp/news/240201

## 大本営発表とは

さて、コトバンクには、大本営発表をこう説明しています。

> だいほんえい‐はっぴょう〔‐ハツペウ〕【大本営発表】
> １ 太平洋戦争中、大本営が国民に向けて発表した、**戦況に関する情報**。末期には、**戦況が悪化しているのにもかかわらず**、優勢であるかのような**虚偽の発表**をくり返した。
> ２ 転じて、政府や有力者などが発表する、自分に都合がよいばかりで**信用できない情報**。

そこで、こんなことを気になりました。

ぼく「**『末期には』ということは、どこで虚偽を混ぜ始めたんだ？**」

調べると、Wikipediaには、

> 発表はラジオにより、全国に大々的に発表された。 太平洋戦争初期は戦果を概ね正確に発表していたが、**珊瑚海海戦（1942年5月）の発表から水増しが始まり**、以降は戦況悪化による実態と乖離した虚偽の大戦果発表を行った。

ぼく「ほう。珊瑚海海戦か～。その前後で、どんなふうに発表が変わったんだろう。**大本営発表を一覧できるデータベースとかないかな**」

... ... ...

ぼく「**ない！！**」


というのが、始まりでした。

# 大本営発表データベースの設計

さて、大本営発表を作り始めるんですが、最初にデータベースの設計のために、必要な情報を洗い出しました。

まず、先述の通り、今日12月8日は**太平洋戦争が始まった日**ということで、1941年12月8日の午前6時に発表された**太平洋戦争開戦の大本営発表**を見てみましょう。

> **【大本營陸海軍部發表】**（十二月󠄁八日午前󠄁六時）
> 帝󠄁國陸海軍は本八日未明󠄁西太平󠄁洋において米英軍と戰鬪狀態に入れり

音声＆字幕付きも聞きたい方は↓（私のブログ記事）

https://3.14159.jp/daihon-ei/s16120806_1/

ということで、当初考えていたのは、
- **発表日時**
　例： 1941年12月8日 06:00
- **発表元**
　例： 大本營陸海軍部
- **本文**
　例： 帝󠄁國陸海軍は本八日未明󠄁西太平󠄁洋において米英軍と戰鬪狀態に入れり


しかしここで、**ある問題にぶち当たります**。

# 旧字体どうやって出そう

さて、かなりマニアックな話なんですが、上で何回も引用している大本営発表文の **「太平洋」** の部分が **「太平󠄁洋」** となっています。（平の2,3画目が「＼ ／」ではなく「／ ＼」）

この字体の違いはUnicodeに入っていない（＝同じ文字コードが割り当てられている）ため、単純に管理するのは難しいです。

そこで、 **「異体字セレクタ」** という技術を使うことにしました。

:::note
**異体字セレクタ**
> UnicodeやUCSにおける、文字の字体をより詳細に指定するためのセレクタ (選択子) 。（Wikipediaより引用）


例として「**帝国**」という文字の旧字体は「**帝󠄁國**」となります。
このうち、「**国**」と「**國**」は、どちらも使用実態があり、漢字の形が大きく違うため、**異なる文字コード**が割り当てられています。
しかし「**帝**」と「**帝󠄁**」といった、本当に**微妙な漢字の違い**は異なる文字コードが**割り当てられておらず**、　**「異体字セレクタ」**　というのを使って表現する必要があります（もしかしたら閲覧環境によっては正常に見られない可能性もあります）
:::



# やったこと・今やっていること

さて、やったことが２つ、今やっていること２つあります。

### ① Webサイトの開発

まず、いつも使っていた**PHP**と**MySQL**をつかって開発しました。

![old_site.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3045371/4aa86718-6546-15e6-c348-0f3f6ff669a7.png)

開発したんですが、**ある問題**がありました。

それが、内閣官房のサイトを~~パクって~~非常に参考にして作った点です

![www.cas.go.jp_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3045371/eeb82148-899b-c7c1-6287-cfb99bb81f95.png)

開発当初は、公開するつもりはなかったので、「まあいいか」と思って似せたんですが、途中で設計を変える必要があり（異体字セレクタの対応）、ほぼ白紙に戻す必要がありました。

### ② 異体字セレクタ入力補助エディタの開発

異体字セレクタを導入したときに、入力がとても大変になりました。

そこで、 **「大本営発表専用異体字セレクタ入力補助エディタ」** を開発しました

![editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3045371/48a3d998-5e65-774f-0a80-f13611ca4654.png)

上図のように、異体字セレクタで入力できる文字を常に表示することで、 **「この字体って入力できたっけ」** というのをすぐに確認できるようにしました。

### ③ Webサイトの開発　その２

①では、枯れた技術を使っていましたが **「最近の技術も触りたいな～」** と思い、重い腰を上げ**Next.js**をつかった、リッチなサイトを開発しています！

コンセプトは、 **「古い内容と新しい技術の<ruby>邂逅<rt>かいこう</rt></ruby>」** です。
古い内容とは、言わずもがな大本営発表なんですが、新しい技術として、PHPを使うのもどうなんかなと思い、Next.jsを採用しました。

今月の試験が終わった12月4日から今日まで数日でしたが、このような感じで開発しています！

![sample_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3045371/2cb3dd9f-2bfb-edf8-61d9-25e31d741ff4.png)

さて、こだわりが1つあります。それが　**「Notionをデータベースとしている」** ことです。

そのため、②の異体字セレクタ入力補助エディタの開発は一時停止していますが、こっちもいずれやりたい...

あと、大本営発表は、現代の **「西暦・24時間表記」** に反して、 **「和暦・午前午後の12時間表記」** を採用しています。

元号とか、もうどうしようもないので、原始的な方法で解決しました。

```js:getWareki
const getWareki = (date: string) => {
    const parsedDate = new Date(date);
    const year = parsedDate.getFullYear();
    const month = parsedDate.getMonth() + 1;
    const day = parsedDate.getDate();
    const hours = parsedDate.getHours();
    const minutes = parsedDate.getMinutes();
    const period = hours < 12 ? '午前' : '午後';
    const formattedHours = hours === 12 ? 0 : hours % 12;
    const formattedMinutes = minutes === 0 ? '' : `${minutes}分`;
    
    if (year > 2019 || (year === 2019 && month >= 5 && day >= 1)) {
        return `令和${year - 2018}年${month}月${day}日 ${period}${formattedHours}時${formattedMinutes}`;
    } else if (year > 1989 || (year === 1989 && month >= 1 && day >= 8)) {
        return `平成${year - 1988}年${month}月${day}日 ${period}${formattedHours}時${formattedMinutes}`;
    } else if (year > 1926 || (year === 1926 && month >= 12 && day >= 25)) {
        return `昭和${year - 1925}年${month}月${day}日 ${period}${formattedHours}時${formattedMinutes}`;
    } else if (year > 1912 || (year === 1912 && month >= 7 && day >= 30)) {
        return `大正${year - 1911}年${month}月${day}日 ${period}${formattedHours}時${formattedMinutes}`;
    } else if (year > 1868 || (year === 1868 && month >= 9 && day >= 8)) {
        return `明治${year - 1867}年${month}月${day}日 ${period}${formattedHours}時${formattedMinutes}`;
    } else {
        return `${year}年${month}月${day}日 ${period}${formattedHours}時${formattedMinutes}`;
    }
}
```

**これはひどい**

でもこうするしかないよな？

:::note 
**少し小話**

なんとなく現代だと、例えば12:15(24時間表記)を、「午後0時15分」ではなく、「**午前12時15分**」と表す場合が多いような気がする。
**「「正午を過ぎているんだから午後やろうがい！！」」**
すこし物申したいぼくでした。
（大本営発表の方は、ちゃんと午後0時を採用しています。 えらい！）

:::


### ④ 大本営発表の発表文の入力

実はこれが一番大変なんです。

今のところこんな感じで入力しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3045371/ee4098fc-bfcb-0978-fac7-7db27389e57c.png)

太平洋戦争中の大本営発表は、847回[^1]あります。

1回の発表で、図のように短いのもあれば、**500文字を超える発表** もあります。

私が入力する文字数は、少なめに見積もって、150文字×847回=127050文字なので、**10万文字のオーダー**の文章を入力することになります...

## 最後におねがい

**まとめなんてねえよ。** 
現状で書けることを書いて、とりあえずおしまい。

最後に１点だけお願いです！

大本営発表の文章の入力を **「助けるよ！」** と言っていただける知り合いの方は、資料を貸しますので声をかけてください。まじでおねがいします。~~何かおごります。~~


# こぼれ話：Qiitaと大本営発表

試しに、Qiita内で「大本営発表」と調べてみると、**「大本営発表ソート」** なるものを見つけました。


https://qiita.com/Ytz_Ichi/items/91b4d548cdedb7c424d6

そのソースコードがこちら（上記サイトより引用）
``` Propaganda.py
def propaganda_sort(list):
    return [1, 2, 3]
```

>「**真実を握りつぶし**あらかじめ決められた情報を流す」

とのことで、私は爆笑してしまいました。**ボゴソートよりひどい**

ソートプログラムで$\mathcal{O}(1)$とは、すごいですね(白目)

プログラマー業界にも、大本営発表は愛されていてよかった！(笑顔)



[^1]: 辻󠄀田真佐憲，『大本営発表　改竄・隠蔽・捏造の太平洋戦争』，p.281より引用