feature image

2025年12月8日 | ブログ記事

工大祭運営用ツールを作った

💡
この記事はアドベントカレンダー2025 8日目の記事です

はじめに

今年の11月2,3日には工大祭が開催されました。traPも traPalette という名前で出展していました。詳しくは↓の記事をお読みください。

【工大祭】traPalette 開催します!
今年の工大祭は、11月2日(日)、3日(月)に開催されます!traPは「traPalette」という企画を開催します! 概要 * 場所 : 西9号館 3階 W9-324 * 野外ステージの裏に入口があります。入口が2階なので、1階上がってください。階段で上った右手にあります。 * 日時 : 11/2(日) 10:00~18:00, 11/3(月) 10:00~17:00 * 一日目と二日目で展示時間が異なるため注意してください。 主な内容 * ゲーム展示・試遊 * その他制作物の配布、頒布、展示 * 普段の活動紹介 ビラ・ポスター: 23B @botoku_izm ゲーム展示・試遊 部員が制作したゲームの展示・試遊を行います。

 今年の工大祭は爆破予告のおかげで色々かき回されてしまいました...
僕は今年の工大祭出展責任者の一人だったので、初日夜以降忙しかったなぁ

 そんな予告犯への私怨はそれとして、工大祭の出展にはそこそこに作業が発生します。大まかにこんな感じです:

 どれもそこそこに重いタスクではありますが、ポスター管理は特に厄介者です。他のタスクは最低限進捗の管理ができますが、ポスター管理は少し違います。張り出したポスターを回収する時、どこにポスターを貼ったかを正確に覚えている必要があり、忘れてしまうと回収漏れが発生してしまいます。またポスターは飛んで行ってしまうこともあるので、単に枚数で管理しても、足りない原因が回収漏れなのかポスターの消失なのかわかりません。

この記事では、そんなポスター管理のためのツールを作成したよ、ということについて書いていきます。

チャットBOTでの管理

 事の始まりは工大祭準備日。ちゃんとポスター管理しないとなぁと思いながら部室でレンタルPCの到着を待っていました(このPCの納品書が入った箱が途中で配送止まっていて丸一日潰れたという話はまた今度)。こうしたツールを作るとき、最も手っ取り早い方法はDiscordBOTのようなチャットツールのBOTとして実装することです。通常ツールの作成は裏のロジックと表のUI作成が必要ですが、BOTはUI部分をすっ飛ばしてくれるからです。便利。

 ところで、僕はtraQ(traPのチャットツール)にろぼるーくというBOTを作っていて、これに僕の発言の一部を記録してもらっています。

こんな感じでマルコフ生成で時々応答してくれます

つまりろぼるーくの 機能として ポスター管理を実装すれば、初期の環境構築もすっ飛ばしてツールが作れてとても嬉しいわけです。

というわけでさくっと1時間で実装完了。CopilotのおかげでほぼTab連打みたいな開発だったものの、ここまで早くできるとは思っていませんでした。

機能

 ろぼるーくのポスター管理機能は次の機能(コマンド)を備えています

あとは、ポスターの裏に数字を振ってID管理をすれば、このツールに乗っけることができるようになります。

 このツールには一点、懸念点がありました。それはポスターの情報の保持がインメモリだったことです。ろぼるーくは家で動かしている Raspberry Pi 4B 上で動いています。つまり、ろぼるーくが何かしらのエラー(ネットワークエラーなど)で落ちたり、誤って電源コードをひっかけて抜いてしまったりしたらポスターの情報が全て消えてしまうんです。エラーハンドリングはしっかりしている(はず)なので、準備日から撤収までラズパイには絶対に触らないようにしていました。結局最終日までろぼるーくは落ちずに動いてくれました。感謝です。

使ってみる

 準備日・撤収で使用した感じ、割としっかり使えました。残ってるポスターがどこにあるのかが一発でわかるのはとても助かります。

 ところで、ろぼるーくはそもそもチャットBOTで、他の人の発言に反応して発言します。一応コマンドに対しては反応しないようにしていますが、連絡などをすると反応してしまうことがあります。運用中もちょいちょいしゃべっていました。(反応確率は5%なのに、僕のほぼすべての発言に反応してきました...なにがあった)

言ったそばからしゃべるろぼるーく。もはや自己紹介

 3日を通じてろぼるーくはしっかり仕事してくれました。ありがとう。

ちゃんと開発

ろぼるーくのポスター管理機能ですが、色々不便なところはありました。

 ということで、工大祭が終わってひと段落してからはポスター管理を効率的に行うためのWebアプリの開発に着手しました。

技術スタック

以下のような構成で組み立てました。僕がフルスタックで立てるときにいつも使うスタンダードな設定です。

バックエンド

Goは良いですよね。シンプルな言語仕様で複雑な処理を書けます。エラーハンドリングが面倒とか、記述が冗長とか言われたりしますが、冗長こそ正義です。

フロントエンド

traPのフロントエンドはVue.jsが主に使われるのですが、Next.js (React) のコンポーネントで記述する仕組みと、サーバーコンポーネントとクライアントコンポーネントの仕組みが大好きです。

成果物

こんなものができました。

ポスター一覧
ポスターの詳細ページ
ポスター作成ページ

回収処理がワンタップでできるようになったり、各ポスターの状態が一目でわかったりするのが特徴です。

作ってみて

 まだWebのフルスタック開発の経験はなく、ドメイン駆動設計なるやり方とか、たまねぎアーキテクチャとかよくわかっていませんが、それでも技術として色々得るものがありました。開発をレイヤーで分け、各部分で行うべき処理・責任を分けることで、開発の見通しが良くなりました。データのバリデーションも、こうして分けると良く明確になるんだなと感じました。

追加機能:物販管理

 ポスターを実装して、まだモチベーションがあったので、物販管理機能も実装することにしました。物販管理には次の機能があります

 ポスターの余興のような感じで実装した物販管理ですが、ポスター管理よりも複雑な構造になってしまいました。複数のイベントで利用できるようにするため、物品そのものと販売物を分けたせいで実装がほぼ二倍になったのが原因です。とはいえちゃんと実装できてよかったです。

おわりに

 今回は工大祭で使えるツールを作ったことを記事にしてみました。次の工大祭の前に一度どこかでテストしてみたいですね。これで未来永劫traPの工大祭タスクが軽くなってくれるとありがたいです。

明日は @SAH123 さんの記事です。楽しみ!

Luke256 icon
この記事を書いた人
Luke256

(≧^・ω・^≦)

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2024年9月20日
2024年 1-Monthonを開催しました!!
Synori icon Synori
2025年9月30日
2025年 1-Monthonを開催しました!!!
YMAC icon YMAC
2025年9月15日
traPでの一年半を振り返る〜全班所属の体験記(?)〜
gurukun41 icon gurukun41
2023年12月11日
DIGI-CON HACKATHON 2023『Mikage』
toshi00 icon toshi00
2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記