KLab Server Side Camp に参加しました

に公開

8か月 前に更新

はじめに

先日開催された、第3回 KLab Server Side Camp に参加しきました。
振り返りとしてブログに残したいと思います。
(余談ですが記事を書くたびにバグが見つかって時間が取られてしまうので、そろそろ良い感じに改修を入れたいところです)

音ゲーのユーザ登録・マルチプレイ機能のためのサーバサイドを実装するというこの企画。
このインターンのためだけに、あのスクフェスで有名な KLab さんが用意してくださった、超・高クオリティな音ゲーを題材に Python (FastAPI) をベースとしたバックエンド処理を実装していきました。


KLab Server Side Camp とは

KLab Server Side Camp(クラブサーバサイドキャンプ)は、サーバサイド特化型の技術系インターンです。本イベントの為にオリジナルで自社開発したスマホ向けゲーム(音ゲー)を題材に、そのゲームアプリの中でサーバサイドの技術がどのように使われているかを、講義形式で進めつつ実際に課題にも取り組み手を動かしてもらいながら経験を積むことができるサーバサイド特化型のインターンです。Python開発経験やGithub使用経験等は応募時に必要なスキルとなりますが、ゲーム開発経験の有無は問いません。むしろ、今まで研究活動や趣味でPythonを使ってきたけれど、それが企業でどのように活かせるのかまだ想像しきれない学部生や院生の皆さん等にぜひおすすめしたいインターンです。 ( 第3回 KLab Server Side Camp 募集要項 より)

スケジュール

今回の第3回は9月1日から9月7日の、平日5日間で開催。


1 ~ 2日目

初日は自己紹介から始まり、キャンプで使用する GitHub Codespaces、MySQL、SQLAlchemy、FastAPI について紹介・説明を受けました。 Codespaces は VSCode のリモート SSH を使った devcontainer 機能を活用し、 GitHub の Docker 環境にアクセスしながら開発できるもの。私は、個人向け無料ベータ版が少し前に解放され使用していたので慣れた環境で作業でき良かった。今回初めて知ったのですが、ポートの観測可能範囲も変更できて、クリック一つでパブリックなアドレスが入手できるという優秀な機能も。興味がある方は是非、 Wait List に登録してみてください。 ( GitHub Codespaces )


講義では CREATE SELECT UPDATE といった基本的な構文から教えてもらえるので、授業でしか SQL 文を直接触ったことのない私でも簡単についていけました。

こちらの雛形 ( GitHub: KLabServerCamp/gameserver ) をベースに、要件定義 ( docs/api.md ) をもとに機能を実装していく流れで進んでいきます。
今回の企画ではデータベースへのアクセスを全て SQL 文で行うということで、すべて Engine.begin().execute() を使用して実装しています。

Pydantic の力を借りて型安全にしつつ SwaggerUI で GUI をポチポチしながらテストができ、実装は凄くやりやすかったです。二日目にはユーザ登録・修正機能が完成し、 Room API と呼ばれるマルチ部屋機能のためのデータテーブルの構造決めに取り掛かっていました。

3 ~ 4日目

Room API の実装とデバッグをひたすら進めます。ほぼ完成していたのですが JSON のフィールド名を間違えるという初歩的なミスにより、途中大幅に時間を溶かしてしまったのが痛手でした。とはいえ一通りの実装を終えマルチプレイできる状態に持っていけたので、追加機能の実装にも着手できました。
4日目の座談会では会社の内部情報や雰囲気を知ることができ、すごく有意義な時間でした。

5日目

最終日の今日は、午前中が最後のコーディング。前日に引き続きデバッグを進めていきました。 Slcak にマルチプレイ募集用のチャンネルがあり、気軽にわいわいデバッグテストできて楽しかったです。追加機能として実装したタイムアウトの影響でスコア未送信の人が表示されなくなっているので、今後修正していきたいです。

何とか追加機能の実装も終わり、午後には成果発表 & 懇親会。
発表コメントでは、メンターのエンジニアの方々から直々にアドバイスが。「APIサーバの方が台数を増やしやすいから、クエリで全部処理せず Python にやらせてあげた方が性能向上できる」など実務目線のコメントをいただくことができました。型アノテーションがしっかりできていると褒めていただけたのは嬉しかったです。 (これまで VSCode の Python の型チェックを Strict モードにして生きてきた甲斐があったかも?)

懇親会では、今回の内容に関わらずワイワイ話すことができ、とてもよかった。音ゲーの作り方であったり、ネットワークであったりとインターン生も思い思いに話せて盛り上がりました。

今回の企画でも名前入り修了証をいただけました。


感想

事前学習用としての本だけでなく、インターン中の合間に食べるお菓子や、飲み会セットまで用意していただけるという至れり尽くせりなこの企画。私は「 エキスパートPythonプログラミング 改訂3版 」をいただきました。今回のメンターであり Python コミッターでもある稲田さんが訳したこの本。実務で必要となる最適化のテクニックやデザインパターンが載っていたりと、読むだけでも Python ガチ勢になれた気がします。

一通り仕様通りの API に加え、追加機能も実装できよかった。そして何よりも最終日の発表会で、メンター陣から現場のエンジニア目線のコメントを受講生全員にもらえたのが印象的。他のインターン生の実装も学べ、良いところ・改善点を吸収できる貴重な機会でした。
参加できて本当に良かったです!


完成品


2日目の時点から何度かコネ回し、最終的にデータテーブルは下画像のような感じに。


また仕様上、ライブ中に切断すると他の参加者が永遠に結果表示待ちとなってしまうため first_user_end_time から結果を返せるように実装しました。

Room API 周りの動作イメージ

- /room/create


- /room/join - 待機部屋に入る



- /room/leave - 待機部屋から離脱


DB 上では room.live_member フィールドは楽曲開始時のメンバ数のみ記録するようにし、 room.joined_user_count などのようにマッチしたメンバーが待機部屋から途中で出入りしても値を変えなくて良い設計に。


マルチ部屋のホストが退出したときに、 room.host_id を更新


- /room/result - ルームの結果受信

DBに first_user_end_time をおいて、一定時間が経ったのちにリザルト画面を出すように。

告知

現在、第4回 KLab Server Side Camp の募集が開始しています。
興味を持った方は是非!