56
20

More than 3 years have passed since last update.

謎のコミュニティ「限界開発鯖」を支える技術

Last updated at Posted at 2020-12-07

これは 限界開発鯖 Advent Calendar 2020 の 8 日目の記事です.

この Advent Calendar の主催である「限界開発鯖」は,学生を中心とするエンジニアのコミュニティです.この記事では,限界開発鯖で行われているプロジェクトと,その技術スタックについて紹介します.

そもそも「限界開発鯖」って何?

限界開発鯖という名前を初めて目にした方も多いかと思いますので,簡単にコミュニティの説明をしておきます.このコミュニティは,茨城高専 1 生を中心とする数人から始まりました.今年 3 月に開設されてから徐々にメンバが増え,12 月 5 日現在では 134 人 2 ものメンバが在籍しています.

ほかの学生コミュニティと比べた際の特徴は以下の通りです:

  • アクティブな時間の長いメンバが多い
  • 知識や技術に長けたメンバが多い
  • エンジニアリングが好きなメンバがほとんど
  • ユニークなメンバがとても多い

いわゆる趣味プログラミングを主として行っているため,楽しく活動しているメンバが多いように感じます.開設当時より招待制となっており,クローズドなコミュニティではありますが,その影響もあってか,一言で言えば「すごい・やばい人たちの集団 3 」となっています.名前の通り開発活動は活発 4 で,そのほとんどを GitHub Organisation として公開しています.

公式サイト

そんな限界開発鯖には,公式サイトが存在します.
https://approvers.dev/

技術スタックは以下の通りです:

  • 言語
    • TypeScript (TSX)
    • SCSS
  • フレームワーク等
    • Next.js
      • React
    • Sass
  • CI/CD
    • GitHub Actions
  • ホスティング
    • GitHub Pages

Next.js を採用し,静的な SPA 5 として開発しています.アプリケーションサーバなども持たないため, GitHub Actions でビルドした後 GitHub Pages での公開を設定したブランチに push してデプロイ 6 しています.

GitHub リポジトリ: https://github.com/approvers/approvers.github.io

名言記録 Discord Bot

限界開発鯖の実体は, Discord のギルド(サーバ) 7 です.つまり,限界開発鯖に所属しているメンバ == このギルドに存在するメンバ となります.

普段はこのギルド内で会話をするため, Discord Bot が多く存在しています.執筆時現在オンラインのものだけで 26 つ 8 もあります.具体的には,以下のようなものがあります:

  • ボイスチャンネルの参加・退出・移動をお知らせする Bot
  • メッセージを編集・削除すると元のメッセージを復唱する Bot
  • 絵文字 📌 でリアクションをするとメッセージを永久保存 9 する Bot
  • カラーコード(#XXXXXX)を発言するとどんな色か教えてくれる Bot
  • 名言を登録しておいていつでも呼び出せる Bot

他にも様々な Bot が開発・運用されていますが,その一つの 名言を登録しておいていつでも呼び出せる Bot について取り上げます.この Bot はその名も 「MeigenBot」 で,限界開発鯖のなかで最も使用されている Bot といっても過言ではありません.

執筆時現在 2028 個 10 もの名言が登録されています.

技術スタックは以下のとおりです:

  • 言語
    • Rust
  • フレームワーク等
    • Tokio
    • MongoDB
  • CI/CD
    • GitHub Actions

言語には,その速さと安全性から注目されている 11 Rust を採用し, Tokio を使用することで非同期ベースで開発されています.名言の実体はクラウドの MongoDB Atlas に保管され, MongoDB コネクションで取り出されます.

GitHub リポジトリ: https://github.com/approvers/MeigenBot-Rust

名言読み取り Bot

人間は,時に失言をします.そして,それを取り消そうとします.限界開発鯖でも,失言 12 をしてしまったときにはメッセージを削除することができます.しかし同時に,それを見逃さずにスクリーンショットを撮影して投稿する人がいます.そして先ほど紹介した MeigenBot に文字起こししたものを登録されることがあります.

そうした時に,スクリーンショットから文字を起こすのは,長いものであればあるほど面倒です.名言読み取り Bot 「CADOCR」 13 では OCR 技術を用いてスクリーンショットから文字起こしをし, MeigenBot を通じて名言として登録 14 します.

技術スタックは以下の通りです:

  • 言語
    • C#
  • フレームワーク等
    • .NET Core 3.1
    • Google Cloud Vision
    • Discord.Net
  • CI/CD
    • GitHub Actions
    • GitHub Packages Registry
    • Docker

GitHub リポジトリ: https://github.com/approvers/cadocr

メンバデータベース

GitHub Organisation で多くのリポジトリが Public になっているように,限界開発鯖で行っている活動はそのほとんどが公開されています. Discord ギルドでの発言は普段は非公開ですが,面白い発言 15 をすれば公開されることも多々あります.

しかし,センシティブな情報はメンバ内のみにその公開範囲を絞る必要がありますし,いわゆる Write 操作はメンバのみに許可されるべきです.そして,インターネット経由でメンバ向けに公開されるサービスでその制限を行う必要があります.

現在,そうした認証・認可体系の確立に向けていくつかのプロジェクトが開始しています.その一つがメンバデータベース 「members-db」 です.メンバかどうかを判定するためのプルーフと,メンバとしての識別子を提供する手段として,このプロジェクトが開始されました.

GitHub リポジトリで YAML ファイルを管理 16 し,各メンバの識別子(UUID) 17 及び Twitter / GitHub / Discord アカウントの識別子を JSON で静的にサーブ 16 しています.
https://db.siketyan.approvers.dev/

技術スタックは以下の通りです:

  • 言語
    • Rust
  • フレームワーク等
    • Rocket
  • CI/CD
    • GitHub Actions
    • GitHub Packages Registry
    • Docker

先ほど紹介した公式サイトのメンバ一覧でも,この members-db を基にして生成するようにする作業が行われている途中です.今後, WebAuthn などを活用してモダンな認証・認可体系 18 を構築していく予定です.

GitHub リポジトリ: https://github.com/approvers/members-db-rust

共有コンテナサーバ

ここまで紹介してきた各プロジェクトは, 24/7 で稼働するためにデプロイ先が必要となってきます.メンバ全員で共有するものであることと,クラウドサービスへの多額な課金が難しい学生も存在することから,共有の VPS 19 を借りて Docker コンテナベースでの運用を行っています.

このサーバは 「containers」 と呼ばれており,各プロジェクトのリポジトリで GitHub Packages Registry へ push しておいたイメージを docker-compose.yml から参照して, master ブランチ 20 へのマージ時に実体のサーバへ自動で展開 21 しています.

技術スタックは以下の通りです:

  • 言語
    • シェルスクリプト (Bash)
  • CI/CD
    • GitHub Actions
    • Docker
  • OS
    • Ubuntu Server 20.04
  • VPS
    • Vultr Cloud Compute

シングルノードであることからフルの Kubernetes を利用することは現実的ではありませんが,現在 Microk8s への移行を検討 22 しています.

GitHub リポジトリ: https://github.com/approvers/containers

RADWIMPS

君の.then().then().then().世から僕は君を探し始めたよ
―― RADWIMPS (2016)

という歌詞をご存知の方は多いでしょう.こうした .then().then().then() はメソッドチェーンと呼ばれ,多くの言語で見ることのできる書き方です.また ECMAScript 23 ではこれは Promise に対して利用できる 24 メソッドです.

「RADWIMPS」 と名付けられたリポジトリでは,このような書き方を利用して .then().then().then().世 を多数の言語で再現しています.執筆現在で 71 種類もの言語で実装されています. pseudo code 25 ではないので,すべて実際に動作させることが可能です.

お察しの通り完全なネタプロジェクトではありますが,限界開発鯖で一番多い 215 Stars を記録し,外部からの Pull Request も多数いただきました(ありがとうございます).皆さんが書いている言語がもしなかったら,ぜひ PR を作成いただければと思います.

GitHub リポジトリ: https://github.com/approvers/RADWIMPS

おわりに

紹介してきたプロジェクトたちは,限界開発鯖のなかのほんの一部です.完成しているものばかりではありませんが,ほかにも多数リポジトリが存在しますので,ぜひ目を通していただければと思います.
https://github.com/approvers

今後も,活発な学生コミュニティであり続けるよう,私自身もできる限り貢献していければと思っています.もしこの記事を読んで「参加したい」と思った方がいましたら,知り合いのメンバにお知らせください.



普通に書いてたら 25 個も注釈が生えてしまったのですが,ちょうど Advent Calendar っぽい数になったのでよしとしましょう.


  1. 独立行政法人 国立高等専門学校機構 茨城工業高等専門学校. 

  2. Bot ユーザを含む. 

  3. いい意味です. 

  4. 学生の割合が多いため,テスト期間等で活発でないときもあります. 

  5. Single Page Application の略で,ページ遷移時にサーバとの HTML のやりとりが行われないアプリケーションを指します. 

  6. GitHub Pages は静的なサイトのホスティングのみに対応しているため,別途ビルドしたものを push しておく必要があります. 

  7. Discord の「サーバ」は API 的には「ギルド」という扱いになっています.余談ですが, Twitterの @XXXXXXX は「ID」と呼ばれることが多いですが, API 的には「スクリーンネーム」です(ID は永続的な識別子として別に存在します). 

  8. オフラインのものも含めると 56 つ存在します. 

  9. 別チャンネルに原文とアタッチメント(画像など)がまるごとコピーされます. 

  10. 重複しているものも一部ありますが,だいたいこのぐらいです. 

  11. 余談ですが,限界開発鯖で使用されやすい言語は Go / Rust / TypeScript です.私は主に PHP / C# を扱うのでそのスタックを組むと他のメンバに見向きもされないことがあります. 

  12. 年齢層もあってか,いわゆる下ネタがほとんどです. 

  13. この Bot ができる前から,スクリーンショットとともに capture done の略で「CAD」と投稿するメンバがいました. CAD を OCR で自動化するので CADOCR と名付けました. 

  14. 「cad」と小文字で投稿すると dry-run モードとなり実際に名言としての登録はされません. 

  15. Twitter で「#限界開発鯖」で検索するとどんなものが公開されているかお分かりいただけるかと思います. 

  16. 管理を YAML で行うのは Git との親和性が高いため,サーブを JSON で行うのはパースしやすさとデータ量削減のためです. 

  17. 愛称は「限界 ID」です.とりあえず「限界」を接頭辞にすると限界開発鯖っぽくなります. 

  18. ユーザ名とパスワードでログインする体系がそろそろ滅びてほしいと心から願っています. 

  19. Virtual Private Server の略で,共有マシンの上に仮想的に設置されたサーバマシンを指します. 

  20. Organisation のデフォルトは main になっているのですが, Git CLI で Initial commit を発行する時につい変更を忘れて master にしてしまいます. 

  21. Docker Machine みたいなハイカラなものは使わっておらず, rsync した後に docker-compose up -d を実行しているだけです. 

  22. 検討はしています.検討は…… 

  23. JavaScript ってやつはブラウザによって解釈が違うので ECMAScript として標準化されています.IE は早く [検閲により削除されました] . 

  24. 空の .then() をつなげても実際には動作しません.それっぽいものならばいいのです. 

  25. 疑似コード.処理の流れを分かりやすく書くけど実際には動かないよっていうコードです. 

56
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
20