AtCoder 通知 Bot の裏側
Hi I'm Kicky
どうも、Kickyです。X 上では Kangping として活動しています。私はいつもAtCoder 通知 Botの開発にいそしんでいます。
AtCoder 通知 Botとは
AtCoder 通知 Bot とは私が運営している DiscordBot の名前です。AtCoderのコンテスト開始前に通知をしたり、ACをしたときに通知したりできます。
目玉機能は、コンテスト中に表示されるランキング機能です。サーバー内に入っている人や入っていない人などのAtCoderのユーザーを登録して、そのコンテスト中にサーバー内ランキングを作成することができます。
もともと、これは友達の競プロ鯖に導入する予定だったので作成しました。
前世代の Bot たち
実は AtCoder 通知 Bot には3世代のBotがあります。第一世代と第二世代はTypescriptによって書かれています。第一世代はとあるDiscordサーバーのために開発を開始しました。完成したところで機能の拡張がものすごく難しい構成になってしまっていたので、すべて一から書き直し第二世代ができました。第二世代は現在もバリバリ活動中です。
第三世代のBotの概要
先ほど、AtCoder 通知 Bot の第一世代と第二世代は Typescript で書かれているといいましたが、第三世代は別の言語で書かれています。それはメモリ安全で高速なRust言語で書かれています。その理由は第三世代では大きな野望がありました。それは、全ユーザーのレーティングを AtCoder社 が発表する前に計算を終えるということです。Typescriptで書かれたプログラムでは全ユーザーの計算に約1分程の時間がかかってしまっていました。しかしRust言語では数秒、いや数百ミリ秒程の速度で計算を行うことができました。なので私はRust言語で書くことにしたのでした。(実際にはRust言語の入門書を買って放置してたからという説もある)
なぜ第二世代の遺産を活用しなかったのか
先ほど書いたようにメモリ安全で高速なRust言語を採用したと書いたのですが、実は高速である必要がなかったということがのちに発覚しました。なぜ私がすべての人のレーティングを数秒単位で計算しないといけないと思っていたのかは、AtCoder Problems の diff を計算するときにすべての人の更新後のレーティングを用いると勘違いをしていたからです。その後しっかりとAtCoder Problemsのソースコードを読んでいたところ、レーティングの更新前のレーティングが用いられていました。なので別に Typescript でもよかったのではないかという意見があります。しかし、私は Rust 上でDiscordBotを書くためのフレームワーク、poiseにドはまりしていたのです。私はもう、discord.jsに戻れないような気がしたのです。なので私はそのまま Rust言語 で開発を続けました。
AtCoder 通知 Bot の動作環境
データベース
MariaDBを用いています。なぜなら私は 第一世代と第二世代両方で JSON ファイルも用いていました。しかし、その時にブレーカーが落ちたときにデータがすべて 00 で置き換えられるという事件が起きたのです。なので、しっかりとしたデータベースソフトウェアを用いて作成しようと思いました。
サーバー管理ソフトウェア
PM2を用いています。理由や有名であり、ネット上に大量のデータが転がっていたからです。昔から愛用していたソフトウェアでした。
サーバー
自分のPCを用いています。普通のデスクトップPCで性能は Intel Core i7-12700 RAM 32GB という構成です。ラックマウントサーバーなどの逸般の誤家庭設備などはございませんのであしからず。添い寝できます。
Webサーバー
actix_webを用いてwebサーバーを立て、cloudflaredを用いてインターネット上に配信しています。ポート開放?何それおいしいの?
作ってみた感想。
初めて Rust言語を用いた大規模な開発をしました。結構楽しかったです。非同期処理周りのところが複雑で友達に聞いたりしながら開発に取り組みました。一番苦労したのはデバッグビルドでも平気でビルド時間が30秒を超えるということでした。今でも苦労しています。どうしたらいいんでしょうかねぇ。
その他いろいろ
AtCoder通知Botの第二世代と第三世代のソースコードはオープンソースで配布しています。また、AtCoderに関するサービスもありますので、そちらもぜひご利用ください