Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)

Akatsuki Hackers Labは株式会社アカツキが運営しています。

Lanyard Sponsorとして協賛したRubyKaigiに行ってきました!

こんにちは、セキュリティチーム所属の小竹(aka tkmru)です。 最近は内製CSPMの運用・開発がメインの仕事になりつつあります。 5/11-13にRubyKaigiに参加してきました。本記事はそのレポートです。

RubyKaigiとは

RubyKaigiは、Rubyコミュニティ主催のRubyに関する国際会議で、毎年開催されています。 今年は長野県の松本での開催でした。 弊社は今年度のRubyKaigiでは、Lanyard Sponsor として、参加者全員が首に掛けるネックストラップを準備させていただきました。

私自身もケース部分に穴を開けストラップ部分と繋げるお仕事をGW前に少し手伝いました。 作成に携わったアカツキゲームスのロゴが入ったネックストラップを会場で皆さんが首から下げているのを見るのは感慨深かったです。

駅と会場の様子

松本駅に着いたら垂れ幕があって歓迎ムードを感じられてよかったです。

会場はコンサートホールのようで、椅子もふかふかで感動しました。 また、メインのスクリーン以外にサブのスクリーンが設けられていて、そこにはチャットや英語の機械翻訳された字幕が流れるようになっていてテックカンファレンスらしい工夫がされていました。 スポンサーブースが30箇所もあり、カンファレンスの規模の大きさにも感動しました。 以下はスポンサーブースでいただいたノベルティの写真です。どれも美味しかったです!!

印象に残った発表

聴講した中で印象に残った発表を2つ紹介します。

Eliminating ReDoS with Ruby 3.2

Eliminating ReDoS with Ruby 3.2」は、Takashi Yoneuchiさんによる発表です。ReDoSはパフォーマンスが悪い正規表現を入力されると処理を行うエンジンによっては処理に時間がかかり、DoSになるという脆弱性です。Ruby3.2で正規表現エンジンのパフォーマンス改善とタイムアウト機能の導入が行われた旨の紹介が行われました。 言語開発者側が対策のための機能を用意してくれるというのはとても良い試みだなと思いました。

ReDoS自体の解説のパートでは、CopilotがReDoSに脆弱なコードを生成するデモや実在するCVEの紹介を交えて解説が行われ、とてもわかりやすかったです。 今後、バグバウンティの世界では、Copilotが脆弱なコードを生成しやすいものを探していくのが流行っていくのかなと感じました。

Ruby JIT Hacking Guide

Ruby JIT Hacking Guide」は、Takashi Kokubunさんによる発表です。 Ruby内部で使用されているJITコンパイラの最適化手法や開発方法に関する発表でした。 JITコンパイラを開発するための機能がRubyには用意されており、カスタムしたJITコンパイラを使用する方法や 中間言語を出力する方法について紹介されました。全然知らない世界だったので興味深かったです。 RubyのコードがJITによって機械語に変換されていく様子を学べて面白かったです。

k0kubun.hatenablog.com

JITコンパイラを作るチュートリアルも用意されているので興味のある方はやってみてください。

github.com

まとめ

講演が面白いだけでなく、会場の雰囲気もよく、参加者に配られるノベルティ(Tシャツ、七味、お箸)も豪華ですごく楽しめました。 会場周辺の飲食店や美術館などで使えるクーポンが配られ、地域から歓迎されている雰囲気を味わえたのもよかったです。 来年は沖縄で開催されるとのことなのでぜひ来年も行きたいです!!

RubyKaigi2023にLanyard Sponsor として協賛します

こんにちは、エンジニアリングオフィス所属の島村です。

今年もRubyKaigiの季節がやって参りました!
とはいっても例年は9月ですが、今年は5月開催となっています。

  • 日時:2023年5月11日(木) 〜 5月13日(土)
  • 場所:まつもと市民芸術館( オンライン有り)
  • サイト:RubyKaigi2023

場所は急遽オンラインに変わって実現できなかった松本市での開催です。楽しみですね。

そして、今回のRubyKaigi2023もアカツキゲームスとしてスポンサーをさせていただくことなりました。

今回で最初のスポンサーから10年目です。継続って大事ですよね。

しかも今回は Lanyard Sponsor として、参加者全員が首に掛けるネックストラップを準備させていただきました。

最初は予算だけだすのかな?と思っていましたが、デザインから担当させていただけるとのことで、弊社のデザイナーの協力を得て作成いたしました。

全体のデザインは当日のお楽しみですが、デザイナーが気合いを入れて公式サイトのトーンに合わせた素敵なネックストラップを作ってくれました。

名入れに挿入する台紙も今回用意させていただいています。
こちらも同デザイナーが作成してくれています。

当日はアカツキゲームスのロゴ入りストラップを参加者やスピーカーの皆さんが身につけることを想像するととても楽しみです。

 

今回はアカツキゲームスとしてはブースを出展していませんが、ノベルティを持ち歩いていますのでお声掛けいただければお渡し出来るかと思います(数に限り有)

また弊社の技術アドバイザーの松田明氏や 弊社所属フルコミッターのnobuさんも登壇する予定で、いち参加者としてもとても楽しみです。

ぜひ会場でお会いしましょうー!

参考:RubyKaigi2019の記事RubyKaigi2022の記事

最後に、アカツキでは一緒に働くメンバーを募集しています!
カジュアル面談もやっていますので、気軽に応募や話す機会をいただけるとうれしいです。

アカツキゲームスでクライアントサイドエンジニアのインターンに参加しました

こんにちは。2021/8/10〜2021/8/27の3週間、アカツキゲームスのサマーインターンに参加させていただいた佐藤と申します。今回はインターンで取り組んだこと、学んだことについてまとめていこうと思います。

 

自己紹介

北海道情報大学に通う学部3年生です。普段はUnity、C#を使ってゲーム開発を行なっています。

私の実力が実際の現場でも通用するか、実際の開発現場はどのようになっているのか、また、自身のスキルアップのために今回のインターンを志望しました。

取り組んだこと

私が参加したのは『八月のシンデレラナイン』(以後ハチナイ)というゲームの現場でした。その中でも主にUI関係の改修タスクを行いました。

 

ミッションリストの順番変更

最初のタスクはミッションリストのソート機能です。今まではすでに終了したミッションでも一番上にきており、初めてきた人が迷いやすい状態でした。なので、終了したミッションは下に来るように変更します。

f:id:katsumi-sato:20210827132202p:plain

※画面は開発中のものであり、実際の仕様とは異なる場合があります

やることとしてはミッションUIを表示するためのミッション一覧を取得している部分を見つけ、そこに終了していないミッションが上に来るようにLINQでソートする機能を差し込みます。
ブレークポイントを使ってUI表示メソッドから一覧を取得している場所を特定し、その日のうちにプルリクエストを出すことができました。

 

報酬受け取り期限の表示/非表示

次に行ったタスクは、ミッション期間内のタスクはミッションの報酬受け取り期限を表示しないようにするタスクです。

これは、「ミッション挑戦可能な期間中に受取期限を挑戦期限だと勘違いして、思ったより早めに挑戦できなくなってしまった。」という事故を防ぐための変更です。

 

f:id:katsumi-sato:20210827132302p:plain

画面は開発中のものであり、実際の仕様とは異なる場合があります

受け取り期限のオブジェクトをアタッチするGameObject変数を追加し、ミッション一覧を表示した時に表示、非表示の判定を行いました。

こちらもその日のうちにプルリクストを出すことができました。

 

ランキングマッチでの選手ボーナスでのソート機能の追加

次のタスクはランキングマッチでのみ、オーダー変更時の選手一覧で選手ボーナスでのソートをできるようにします。

ランキングマッチで選手ボーナスを活用したい時に便利な機能となります。

 

f:id:katsumi-sato:20210827133012p:plain

画面は開発中のものであり、実際の仕様とは異なる場合があります

こちらのタスクは非常に厄介な部分があります。それは「ランキングマッチでのみソートのボタンを出現させる」という機能です。今まではただソートの一覧を表示しているだけでよかったのですが、今回の変更で前のシーンがランキングマッチなのか、通常マッチなのか、選手強化画面なのかについて知る必要が出てきます。この前のシーンがなんだったのかについての取得、判定に非常に苦労しました。実際、この調査だけで3日もかかってしまいました。

その後、関係するメソッドのシグネチャの変更や、ボタンの選択時のバグ修正などを行いプルリクエストを出すことができました。

 

練習中の選手の一覧表示

現状の練習画面での練習メニュー表示は、選手の数のみ表示されており、具体的にどの選手が練習しているかは表示されていませんでした。

そのため、練習中の選手を表示するダイアログを作成します。

f:id:katsumi-sato:20210827133216p:plain

画面は開発中のものであり、実際の仕様とは異なる場合があります

こちらは練習メニューの表示機能で必要な情報が渡されていたため、ダイアログとその表示ボタンを作成し、ダイアログを管理するメソッドを呼び出すだけでした。

こちらはdevelopブランチとシーンのコンフリクトを起こしていたので、それを解決し、プルリクエストを出すことができました。

 

一度習得したスキルは自由に付け替え可能にする

現状でスキルの入れ替えを行いたいとき、そのスキルが過去に習得済みであったとしても、入れ替え時にアイテムの消費がされていました。それを過去に習得していたスキルなら自由に入れ替えができるようにする変更です。

 

このタスクは今回のインターンの中で一番重いタスクでした。

なぜなら、選手の情報を取得するAPIには現在習得しているスキルの情報しかなく、「スキルは習得しているが設定はしていない」という情報が含まれていないからです。

そのため、サーバーサイドと連携してAPIの変更とクライアントサイドの変更を同時に行わなければなりません。今回は同じ期間でサーバーサイドのインターンをやっている方と協力し、APIの仕様変更について話し合い、実装を行いました。

f:id:katsumi-sato:20210827133552p:plain

画面は開発中のものであり、実際の仕様とは異なる場合があります

クライアント側の実装としてはスキル入れ替えボタンの表示や、スキル入れ替えダイアログの表示、スキル入れ替えAPIを叩くことなどがありますが、こちらは比較的簡単に実装することができました。

インターンの最終日の前日に実際にサーバーとの結合テストを行い、無事仕様書通りの挙動をしてくれました。

調査や実装する量が多く、大変な作業でしたが、サーバーサイドの方と協力してできたことは良い経験だったと思います。

 

まとめ

実際の開発の雰囲気を知れた

現場での開発に入ったことで、開発のフローや雰囲気など、なかなか知ることができないようなことを体験できました。

 

 具体的なデザイン手法を知ることができた

APIの呼び出しやダイアログの作成などで、より便利になるようなデザインパターンを見ることができました。このような手法は個人開発ではなかなか思いつくものではないので、非常に参考になりました。

 

大規模開発ならではの悩みがあること

コードを読んでいるとリファクタしたい欲に駆られることがあります。しかし、安易なリファクタは思わぬ不具合を招くこともあります。特にこのような大規模開発ではどこにどう影響しているか正確に把握することは困難です。そのため現状のコードを保ちながら目的の変更を加えるかを考えていました。動くコード=正義ということを痛感しました。

 

最後に

始まる前は長いなーと感じていたインターンでしたが、実際に始まってみると本当に早く時が過ぎていきました。その中で完遂することができなかったタスクもありますが、大変有意義で楽しいインターンでした。

短い期間でしたが、本当におせわになりました!

アカツキゲームスのクライアントサイドのサマーインターンに参加してきました

初めまして、2021年7月26日から2021年8月13日までの約3週間、株式会社アカツキゲームス(以後アカツキゲームス)でインターンをさせて頂いた叶と申します。この記事ではインターンで取り組んだ内容や感想について報告します。

自己紹介

情報系の修士1年生です。アカツキゲームスでのインターンは元々『八月のシンデレラナイン』(以後ハチナイ)を遊んでいた関係で興味があり、この度参加したいと思いました。そのためインターンでハチナイの開発に携わることができると聞いたときはとても嬉しかったです。ちなみにハチナイはアニメが放映されていたときにハマり、そこからのんびりと楽しませていただいています。

取り組んだこと

練習でキズナレベルを表示させるようにする

ハチナイでは練習という機能で選手のレベルや才能、スキルを向上させることができます。また練習ではペア設定を行うことで選手のキズナレベルを上げることができ、このキズナレベルを上げることで練習の効率上昇や専用エピソードの開放を行うことができます。しかし、既存の練習機能では練習効率を上げるためにキズナレベルが高い選手をペアにしたい、あるいは専用エピソードを開放するためにキズナレベルが低い選手をペアにしたいと思ったときに選手のキズナレベルが分からないという問題点がありました。そこでインターンの最初の週では練習でキズナレベルを表示させる機能の実装に取り組みました。

実はタスクを貰った時点では詳しい仕様やデザインが定まっていなかったため、デザイナーさんやプランナーさんの方と会議をして仕様を決めるところから始まりました。会議の結果、

  • 自動選択でも表示は行う(ただしキズナレベル表示の画像を使用)
  • マニュアル選択時はペア設定の下側にキズナレベルを表示

することになりました。 キズナレベルを表示するだけであればそれほど難しくないように見えますが、1つだけ気をつけなければいけないことがありました。それはサーバーとの通信です。練習のペア設定の画面を開くたびにサーバーへのリクエストを送るのはとても非効率的なので、出来るだけリクエストしないような実装を心がける必要がありました。メンターの方の力を借りながら注意深くコードを読み解いた結果、キズナレベルを取得するAPIはマイページで呼ばれていることが分かり、練習のシーンに到達するためには必ずマイページを1度経由している必要があるため、キズナレベルの情報を既にローカルで持っていることが分かりました。この調査結果から不必要なリクエストをサーバーに飛ばすことなく、キズナレベルを表示する機能を実装することができました。

キズナレベルの表示機能 (開発中の様子)
※画面は開発中のものであり、実際の仕様とは異なる場合があります

音楽鑑賞のマイリスト機能

インターンの2-3週目は主に音楽鑑賞のマイリスト機能の実装に取り組みました。このタスクは実はインターンの初日に自分が提案した機能の中の一つであり、結果的に自分が欲しいと思った機能をインターンで開発することになりました。背景として自分はハチナイの音楽が好きで音楽鑑賞を利用することがあるのですが、

  • 音楽一覧から気になったBGMを探すのが大変
  • 自分が好きなBGMをマイページや編成で流すことができない

という不満を持っていました。また不満の原因は

  • BGMが一つのリストに全て入ってしまっている
  • ユーザーが個別のシーンのBGMを設定することができない

と感じたため次のような改善案を提案しました。

  • 歌、BGMといった新たにタブを作ってジャンル分け
  • ユーザさんによる曲のプレイリスト作成
  • マイページやチーム編成時に流れるBGMをユーザーが設定できる機能

メンターやディレクターの方と相談した結果、2番目のプレイリストを作る機能が採用され、それに伴い音楽鑑賞の再生周りの機能を大幅にパワーアップさせることになりました。 こちらのタスクも細かい仕様やデザインについては決まっていなかったため、会議をして仕様を策定するところから始まりました。 ミーティングの結果、大まかに次のような機能を実装することが決まりました。

  1. 一通りの再生機能(再生/一時停止/次の曲へ/前の曲へボタン)
  2. マイリストタブの追加
  3. 再生設定の追加(連続再生/リスト内リピート/一曲リピート)
  4. 曲の入れ替え機能
  5. Undo機能(マイリストタブでお気に入りを削除したときの救済策)

これらの機能のうち1番大変だったのが4番目の曲の入れ替え機能でした。背景としてハチナイのスクロールリストはオブジェクトプールと呼ばれる手法を用いて実装されています。オブジェクトプールとはオブジェクトの大量生成/破棄を行わずに必要な分だけのオブジェクトを生成して使い回すという手法です。この手法を利用することメモリの消費量の節約や処理負荷の低減を行うことができます。入れ替え機能自体はグローバルメニューのカスタマイズにも似た機能があるのですが、スクロールリスト内でのアイテムの入れ替えは前例がない機能だったため、とてもやりがいがある課題でした。 他にも戻るボタンを押して2秒以内なら前の曲、そうでなければBGMの先頭から再生するといった細かな機能も仕様には含まれていて、とにかく実装する量が多かったことも苦労した点でした。

インターン中はまずはプロトタイプを作ることに専念し、再生やお気に入りボタンなどを適当なボタンに置き換えて開発を進めました。結果としてプロトタイプまででインターンの期間が終了してしまい、本実装を行うことまではできなかったものの、一通りの機能をプロトタイプ上で実装することができました。

音楽鑑賞のマイリスト機能 (開発中の様子)
※画面は開発中のものであり、実際の仕様とは異なる場合があります

感想

ハチナイの開発に携わることができ、かつ技術的にも沢山のことを学べたインターンでした。またインターンを通してアカツキはやりたいことがあればいくらでも挑戦できる環境だと感じました。実際に入社したばかりにも関わらず、小さなプロジェクトのリーダーとして活躍されている方もいるというお話を聞いて、野心家にとってどんどん挑戦して成長できる環境が与えられていると感じました。

3週間本当にありがとうございました!

アカツキゲームスのサマーインターンシップ (Unity / C#) に参加しました

はじめまして。今回アカツキゲームスのサマーインターンシップに参加させていただきました、瀬戸と申します。Unityでゲームを作ったりしている大学3年生です。

 

期間は2021/9/6 (月)〜2021/9/30 (木)の約4週間、オンラインで参加しました。コースはUnity / C#で、普段から触っていて馴染みのある環境ではありましたが、実際のモバイルゲーム開発の現場に参加するのは初めての経験なので、初日は大層緊張していました。

 

取り組んだこと

今回私が参加したのは『八月のシンデレラナイン』(以下ハチナイ)プロジェクトで、新規機能開発やバグ修正を担当しました。それぞれのタスクについてご紹介したいと思います。

タイトルアニメーションのボイス再生機能

f:id:noboru_seto_aktsk:20210930155941p:plain

ハチナイのタイトル画面では、イベントの開催等に合わせて期間限定の特別なアニメーションが再生されます。その中には選手のボイスが再生されるものがあるのですが、実はこれまでボイスはBGMに埋め込まれており、一体化した音声ファイルとして再生されていました。これにより、タイトルアニメーションをスキップした後もボイスが再生され違和感を生じることがあったり、管理上の不都合が生じることがありました。

今回の修正ではタイトルBGMとボイスの音声データを分離し、別々に管理できるようにする改善を行っています。

 

実装そのものは比較的スムーズに進みました。しかし、この機能は今後のタイトルアニメーション制作のワークフローに関係してくるという点でちょっと大変です。新しいタイトルアニメーションにボイスを入れ込む際の手順はどうなるのか、その音声データはどうやって管理するのか……「実装しておしまい」というわけにはいかず、関係者との相談が不可欠です。「エンジニアにとって大切なのはコミュニケーション能力」とはよく聞く話ですが、なるほど、これが……と思いながら作業を進めていました。

 

現時点でワークフローの見通しが立っていないのでリリース時期は未定です。

 

タイトルアニメーションが更新されないことがある不具合の修正

二つ目は不具合修正です。これまたタイトルアニメーション関係で、特定の条件下で期間限定のアニメーションに切り替わらない不具合の調査と修正を行いました。

この不具合の修正には、Unityがサーバーからアセットを取得するシステムについての知識が必要でした。よくスマートフォンゲームを遊んでいると、アプリストアからアプリをダウンロードし、ゲームを起動した後に「データダウンロード」のような処理を目にすることがあると思います。ハチナイにおいてもそのような仕組みが使われています。しかし、こういった仕組みは個人規模の開発ではまず必要とされないもので、私はあまり使用した経験がありませんでした。これに関しては特に勉強することが多く、頭を悩ませるものでもありました。

 

アイテムの詳細表示機能

三つ目はアイテムの詳細表示機能です。アイテムアイコンを長押しすると、アイテムの名称・所持数・説明文が表示されるようになりました。

f:id:noboru_seto_aktsk:20210930181852p:plain

※画面は開発中のものであり、実際の仕様とは異なる場合があります

これまで、報酬や素材のアイテムが表示される箇所では、アイコンが表示されるのみで何のアイテムを指しているのかわかりにくいことがありました。

この機能ではアイテムの所持数などの詳細情報をその場で確認することができ、利便性が向上しています。おそらく今回担当したタスクの中では最もプレイヤーにとってのインパクトがあるものだと思います。

こちらのタスク、概ねの機能は完成したのですが、残念ながらインターン期間中に全てを実装し終えることはできず、残りの作業は引き継ぐ形となりました。今回のインターンで悔やまれるポイントです。

 

得たもの

既存のプロジェクトに参加する大変さと面白さ

ハチナイはサービス開始から4周年*1を迎えたプロジェクトであり、あらゆる作業が既存の巨大な実装を読み解くところから始まります。古いコードもあれば、新しいコードもあり、それらを読み解いた上で、どこに何を足せば目的を達成できるのかを把握する必要がありました。また、既存の動作を壊さないように注意する必要もあります。この作業は大変でしたが、パズルのような面白さもありました。

大規模なチーム開発の経験

私の普段の開発は単独か少人数チームでのものがほとんどで、GitHubはほとんどバックアップ用にしか使ったことがありませんでした。プルリクエスト、レビュー、マージ……これらの概念に触れることはほとんどなく、ドキドキしながらプルリクエストを送りました。幸運にもインターン期間中にマージされたものもあり、リリースを見届けることもできました。とても嬉しかったです。

 

最後に

スマートフォンゲームの開発の現場を初めて体験し、個人開発の経験に対して、現場のチームでのゲーム開発がどんなものかを知ることができました。

初めてのことばかりで、発見が多く、刺激的な4週間だったと思います。

受け入れてくださった皆様、本当にありがとうございました!

*1:※2021年現在