こんにちは! 25年度1-Monthonの11班です。(メンバー紹介は #メンバー紹介 の項を見てください。)
私たちの班では、traP内で使用されているSNS「traQ」で使えるスタンプを検索するサービスを開発しました!
作ったもの
このようなサービスを作りました!


検索機能も実装してあります!


UIも工夫しています。検索結果に表示されたアイコンをタップすると
- まずモーダルで表示されます。モーダルとして表示することで、検索画面に容易に戻ることができます。
- モーダルの右上の拡大ボタンをタップすると、そのスタンプのページに遷移します。
- モーダルと内容は同一です。
- スタンプ名、スタンプの作者、スタンプのIDなど、必要な情報を簡単にコピーできます。
- 共有ボタンを押すと、そのスタンプのページへのリンクを共有できます。


ちなみに、traPicture は1-Monthonで他の25Bのみの班が開発したサービスです。
1-Monthonとは
夏休み中にtraP内で行われるハッカソンです。準備期間一か月・開発期間一か月をかけて、Webサービス・ゲーム・映像作品など、さまざまな作品が製作されます。詳細は次の運営の方々によるブログを参照してください。

わたしたち25B(一年生)は、運営の方々にチームを組んでいただきました。7/12にチームが発表され、そこから一か月間の準備期間を経て、8/11~9/7の約一か月間で開発しました。開発開始から2週間が経過した8/24には中間発表も行われました。
サービスの概要
11班で開発したサービスについて説明します。traQには、現在(2025/09/28)7464個のスタンプ(絵文字)が登録されています。Unicode絵文字も含めると、合計で9370個になります。この大量にあるスタンプについては、次の @Pugma 先輩の記事が参考になります。(現役traP部員によるtraQのスタンプ紹介!)
追記
2025/10/22時点で、9582個に増えていました
一か月で200個以上増えたことになります。
こんなに大量にあるスタンプですが、知らないスタンプを調べる方法は、おそらく次の二通りしかないのです。
- スタンプの名前で検索する
- 実際にtraQで使われているのを見つける
多くの人が使うスタンプであれば、いつの間にかスタンプの名前を覚えているはずです(traQでの会話に慣れすぎた結果、日常会話でスタンプ名を使ってしまうひともかなりいるようです...)。また、例えば :arigato: のように、日本語がそのままスタンプ名になっているものは、簡単に見つけられます。
しかし、traQには次のようなスタンプもあります。
:nikunoyakeruoto:
:Japanese_no:
:ikanai:
運よく他の人が使っている場面に遭遇すればよいですが、いかんせんスタンプが多すぎます。日本語で検索したり、スタンプにタグをつけ、同じタグが付いたスタンプで検索したりしたい!!!
無いなら作ろう!ということで開発する内容が決まりました。
そういえば1-Monthonってテーマがあったような...
メンバー紹介
メンバーは全員25Bです。役割分担は次のようになりました
- @yasako
- リーダー, クライアント, デザイン
- @mamo
- サーバー
- @dislike_fruits
- サーバー, LLM
- @hachimitsu
- サーバー
- @rurun
- クライアント, LLM, デザイン
- @ikea
- クライアント
※「LLM」という分担については後述します
開発の様子
開発の様子を振り返ります。2か月も前のことなんて覚えてないよ!!
準備期間
メンバーが発表されたあと、みんなで自己紹介をしました。メンバーそれぞれが何の分野に挑戦したいのかを聞きつつ、開発期間で何をつくるのか相談しました。
初回のアイディア出しは7/13に行ったようです。

みんなでテーマからアイディアを膨らませようとしたもののうまくいかず...
テーマから考えるのは諦めて、実際に欲しいものを作ることにしました。
作るものが決まったので、実装する内容や仕様を考えていきます。次のメモ書きは、8/6頃のものです。8/11開始なので時間に余裕がありません。

具体的に開発するスタンプ検索サービスですが、一つ問題がありました。スタンプの画像を、どうやって日本語で検索するのかという点です。今回は、スタンプに対してユーザーが説明文を投稿できるようにし、投稿された説明文を検索できるようにすることを考えました。また、スタンプの画像とスタンプが使われた投稿をデータ化し、LLMに渡して説明文を生成させておくことで、ユーザーに説明文を投稿してもらわなくとも、スタンプを日本語で検索できるようにしようと考えました。traP内のSysAd班 genAI チームに相談し、LLMを使用するAPIキーを作成していただきました。
traQからデータを取得して整理し、そのデータをもとにLLMを呼び出し、LLMが作った説明文をデータベースに保存する、という過程を自動化する必要があります。先ほどの役割分担にあった「LLM」の担当の人にこの機能を実装してもらいました。
開発開始~中間発表
さて、開発期間が始まりました。しかし、開発が始められません。その理由として
- サーバーとクライアントでやり取りするデータの形式が完全には決まっていなかった
- 開発環境の構築, プロジェクトのセットアップが終わっていなかった
- Go初心者がGoの環境構築を行った
ことがあげられます。準備期間の最後の一週間はずっと設計を考えていたはずなのですが、本格的に開発がスタートしたのは開発開始から一週間が経過してからでした。もっと早くから仕様を詰めておいたほうがよかったと思います。
データベースの形式が確定したのが8/18だったはずです。

@rurunが、検索にヒットしたスタンプをどんな順番で並べるのかを考えてくれました。

実装の流れとして、issueを起点として開発を行いました。その際に立てた方針として、「開発のためのルールを最小限にする」というものがありました。プログラミング経験は多少あっても、共同開発はみんな初心者でした。余計なルールを作りすぎると、そのルールの理解に時間がかかってしまうので、できるだけ簡略化しました。
- やることを細かく分けて、それぞれをissueにする
- issue番号を含んだブランチを切る
- ブランチで頑張って開発する
- 完成したら、自分のPCの開発環境で正しく動作することを確認する
- Pull Requestを立てる
- 開発用の環境にデプロイして、うまく動くか確認する
- 別の誰かが一応コードを眺める
- よさそうだったらマージする
ここで、isseuの数がどのように変化したのかについての統計データを見てみます。今回の開発では、GitHub Projects にissueが自動で登録されるようにしていました。緑色はまだ開いているissueで、完了したissueは紫色になっています。


開発開始は8/11なのですが、サーバーもクライアントも、仕様策定に追われまだスタートできていません。 サーバーでは、 @mamo がサーバーの構成を固めてくれた8/15に、一度にたくさんのissueが登録されています。クライアントはもっと遅く、8/20あたりから実際の開発がスタートしました。
今回のハッカソンのデプロイ先は、部内Paasである NeoShowcase を使用しています。
中間発表後~最終発表
認証機能や検索機能などを実装しました。正直なところ、実装した内容が多すぎて追いきれません。毎日みんなで開発しました。常に開発に追われており、当時のことを全然覚えていません。
分野別振り返り
今回のハッカソンで学んだことについて、メンバーに箇条書きにしてもらいました。
進捗管理, 開発外の部分について
- やりたいことを詰め込みすぎない方が良いと思った
- 中間発表直前に軌道修正し、中間発表までに何が完成しているべきかを整理できたのが良かったと思う
- Taki Plaza に集まってみんなで開発したのは良かったと思う
- 横に座っている人の画面を見れば大体の進捗が分かる!
- わからないところがあればすぐに相談できる!
- 昼間に予定があって集まれない場合は、Discordで画面共有しながら開発した
- TakiPlaza から帰宅してすぐDiscordに集合した日もあったはず
クライアントについて
- UIライブラリを使い倒そう
- 技術選定がうまくいった気がしないでもない
サーバーについて
- 設計がぐちゃぐちゃになっていて役割分担が大変だった。
- 書き方の統一などをしなかったので、あとから見て誰が担当したのかがわかりやすいコードになってしまった。
データベースについて
- データ取得とLLMの処理がボトルネックだったので、早くからやり始めたほうがよかった
クライアントとサーバーの両方に関係する部分について
- 認証の実装がとても難しかった。
- 認証に問題があったまま本番を迎えてしまった
メンバーより
参加したメンバーに感想を書いてもらいました。
dislke_fruits
春ハッカソンでは先輩に頼りっぱなしでしたが、今回はメンバー全員が25B(1年生)。些細な問題は自力で解決しなければなりません。
Go言語で開発するのは初めてでした。最初に驚いたのは、大量のif err != nilのブロック。普段C++やPythonで競プロのコードを書いていてエラーハンドリングとは無縁だった私にとって、これは冗長にしか思えませんでした。しかし、開発終盤にかけてPythonを書いたときに、この悪い印象は一変します。Goの堅牢さに慣れてしまい、Pythonの例外処理があまりにも心許なく感じられたのです。今では、エラーに向き合うGoの設計思想を心強く感じます(もちろん、今後競プロでGoを使うことはないでしょう)。
恥ずかしながら、初めてGoでfor文を書いたのは締切2日前、Goにwhile文が存在しないことを知ったのは締切当日でした。
hachimitsu
サーバーを担当しました。春ハッカソンと違い、1-manthonはメンバーが1年生で構成されていて、自分たちだけで全部考えるというのがとても新鮮で貴重な体験でした。サーバーは @mamo さんが引っ張ってくれて色々助けられました dekadekaarigatou すこしづつ自立していきたいです…!
一か月を振り返って、夏休み中も対面で協力して作業を進められたのがよかったと思っています。ほかのメンバーの様子も聞きながら開発できました。
とても楽しくて最高のハッカソンでした。みんなありがとー thanks-nya
ikea
クライアントサイドを担当しました。traPに入るのが少し遅くなってしまったこともあって春ハッカソンなどに参加することができず、web開発を含めてプログラミング自体今回が初めての経験でした。右も左もわからない中で、色々調べたりAIに聞いたり:@yasako:君に聞いたりして、何とか形になるものを作ろうと四苦八苦していました。みんなに教えてもらいながら開発を進めることができて、色々な事を知れたし本当に良い経験になりました。1か月ありがとうございました!
rurun
サイトのUIを考えて @yasako @ikea に投げたり、検索の仕様を考えて @mamo @hachimitsu に投げたり、@dislike_fruits が取得してきてくれたデータをLLMに投げたりする仕事をしていました。チームのみんながとても頼もしかったです。自分自身ももっと成長していきたいなと思いました。
私自身、日常でChatGPTなどのLLMを使うことはありますが、OpenAIのAPIを通して大量のリクエストをする経験は初めてだったので面白かったです。的外れな回答をすることも多く、プロンプトを考えるのに苦労しました。
進捗部屋やTakiPlazaに集まってみんなでわいわいしながら開発したのが楽しかったです。ギリギリにはなりましたがなんとか動くものが作れてよかったです。
mamo
サーバーを担当しました。 @yasako がサーバーで何をつくってほしいかなど詳しく指示を出してくれたのでとても助かりました。自分が設計したものをなかなか詳しくチェックできる人がいなかったので、不安になりながらもなんとか形にできてよかったです。エラーが解決できないときよく助けてくれた @yasako には感謝しかないです。難しくて大変なところもありましたが、動いたときはとてもうれしく1-Monthonに参加してよかったと思います。対面で動くメンバーも多くて夏休みに充実した時間を送れました。メンバーの皆さん、メンターの方々、ありがとうございました!
yasako
開発開始前の設計や、クライアントの開発を担当しました。いちおうリーダーでしたが、何人かで一緒に開発するのは春ハッカソンに続いて2回目で、最終的に動くものが作れるのか心配でした。最低限の機能でいいから、とにかく動くものを作るのを目指しました。なんとか完成して本当に良かったです。ぼくはGoが読めないのですが、@mamo @rurun と一緒に考えたAPIの仕様をもとに、mamo がバックエンドを設計してくれました。気づいたらAPIができていたので、クライアント用のモックサーバーを作っていません。 :wa_haya:。@dislike_fruits @hachimitsu (@mamoも)は、@mamo が細分化してくれたバックエンドのIssueを、ひとつづつ実装してくれました。クライアントのデザインを(手書きで)考えてくれたのは @rurun なのですが、当初計画の1/4も実装出来ていません。理想が高すぎました。 LLMを使ってスタンプの説明文を書かせる処理を書いてくれました。リーダーなのに、Pythonのソースコードを一度も見ていません。クライアントの実装は僕と:@ikea:で進めました。最終発表(2025/9/7)の数日前に立ててくれたプルリクがまだ(2025/10/22時点)マージできてなくて本当にごめん!!僕はそこまでプログラミングが強いわけではないのですが、みんなができることを頑張ってくれたおかげで何とか動くものができました!このメンバーでよかった!本当にありがとう!
今後について
2025/10/17に、9/7の最終発表日以来となるミーティングを行いました。放置運用をするためには、すくなくともあと30個くらいのIssueを消化する必要があります。毎週金曜に進捗を報告することにしたので、完成を目指して開発を継続する予定です!

何気にPull Requestも13個たまっている... 何とかしなければ...
