Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゲーム会社でのRuby : rails活用事例

ゲーム会社でのRuby : rails活用事例

第76回Ruby関西での発表で使ったスライドです
https://rubykansai.doorkeeper.jp/events/55398

Yasutomo Uemori

January 17, 2017
Tweet

More Decks by Yasutomo Uemori

Other Decks in Programming

Transcript

  1. About me 植森康友 twitter: @wakaba260yen github: yuemori 所属: 株式会社Aiming Web

    エンジニア Rails でのAPI サー バやWeb アプリケー ション開発 インフラサイドも少し
  2. 今日のテー マ: 「 ゲー ム会社でのRuby / Rails 活用事例」 「 ゲー

    ム会社でRuby / Rails って何に使ってるの?」 についてお話します
  3. ゲー ム開発 WebAPI Rails によるゲー ムのWebAPI の開発 ゲー ムクライアント、 リアルタイムサー

    バとやり取りする デー タフォー マットはMessagePack を採用 内製のIDL を利用して異なる言語間でのプロトコルを定義 Unity(C#), リアルタイムサー バ(C++) などとのやり取りに利用 IDL = Interface Description Language 詳しくは後述
  4. ゲー ム開発 バッチサー バ Resque やSidekiq といったgem によるバッチ処理用サー バ 利用シー

    ンはプロジェクトにより様々 キャラクター へのギフト配布 デー タベー スのお掃除 Push 通知の送信
  5. 開発環境 IDL IDL = インター フェー ス記述言語 Ruby のDSL を使って異なる言語間でのメッセー

    ジを定義する 専用のパー サを使って定義を読み込んだ後、ERB を使ったテンプレ ー トで各言語のコー ドを生成する
  6. IDL Contract( インター フェー ス定義) 例 r p c (

    : c r e a t e _ s a m p l e ) { u r l ' / s a m p l e / c r e a t e ' m e t h o d ' P O S T ' r e q u e s t { p a r a m ' i d ' , : i n t , ' I D ' p a r a m ' n a m e ' , : s t r i n g , ' 素敵な名前' } r e s p o n s e { p a r a m ' s a m p l e ' , : s a m p l e , ' 作成したさんぷる' } }
  7. IDL コー ドテンプレー ト例 < % ‐ d o c

    u m e n t . e a c h _ r p c d o | r p c | ‐ % > m o d u l e < % = r p c . n a m e . c a m e l i z e % > c l a s s R e q u e s t < T y p e : : B a s e < % ‐ r p c . r e s p o n s e . p a r a m s . e a c h d o | p a r a m | ‐ % > a t t r i b u t e < % = p a r a m . n a m e % > , < % = p a r a m . t y p e % > < % ‐ e n d ‐ % > e n d c l a s s R e s p o n s e < T y p e : : B a s e < % ‐ r p c . r e s p o n s e . p a r a m s . e a c h d o | p a r a m | ‐ % > a t t r i b u t e < % = p a r a m . n a m e % > , < % = p a r a m . t y p e % > < % ‐ e n d ‐ % > e n d e n d < % ‐ e n d ‐ % >
  8. 生成されるコー ド例 m o d u l e S a

    m p l e : : C r e a t e c l a s s R e q u e s t < T y p e : : B a s e a t t r i b u t e : i d , I n t e g e r a t t r i b u t e : n a m e , S t r i n g e n d c l a s s R e s p o n s e < T y p e : : B a s e a t t r i b u t e : s a m p l e , T y p e : : S a m p l e e n d e n d
  9. IDL レスポンスの例 s a m p l e = T

    y p e : : S a m p l e . n e w ( i d : 1 , n a m e : ' f o o ' ) r e s p o n s e = S a m p l e : : C r e a t e : : R e s p o n s e . n e w ( s a m p l e : s a m p l e ) r e s p o n d _ t o d o | f o r m a t | f o r m a t . m s g p a c k ( b o d y : r e s p o n s e . t o _ m s g p a c k ) e n d 生成された型を使ってMessagePack でシリアライズ・ デシリアラ イズをする Contract からコー ドを自動生成するメリット 各言語のテンプレー トを用意することで、 異なる言語間での型 の違いなどを吸収しやすい 開発効率の上昇 インター フェー スのドキュメント化
  10. 開発環境 rake タスク マスター デー タのインポー ト 大量のデー タを扱うゲー ム開発ではExcel

    などで設定を行うこ とが多い デー タベー スにExcel からデー タをインポー トするなど コー ドジェネレー タの実行など 定形作業を自動化する クライアント、 リアルタイムサー バ、WebAPI サー バと異なる 開発環境で複数の定形作業が発生することが多々 ある Jenkins などでのバッチ処理 CI や簡単なスクリプトなどをRuby スクリプトで記述して実行
  11. 共通基盤開発 KPI 分析ツー ル KPI 分析に必要な指標を日時で表示するためのツー ル AU ARPPU 課金率

    継続率 FQ5 など SQL クエリを登録するとグラフにして出力するのが主な機能 OSS のRe:Dash と似た機能を持つ CSV 出力などにも対応している
  12. インフラ Deploy / Provisioning WebAPI では定番のCapistrano を主に利用している WebAPI だけならメンテナンスを挟まずにアップデー トやバグ修正

    が可能 git が利用しづらいシー ンではcapistrano‑scm‑copy も使っている 海外展開などで諸事情によりソー スコー ド履歴をサー バに置き たくないとき 特定のディレクトリだけをコピー してデプロイしたいとき Provisioning にChef を使っているところもある メインはansible
  13. インフラ バッチ処理 Aiming ではログデー タ保存先にgoogle のbigquery を利用している 各種ゲー ムサー バの出力したログをバッチ処理でアップロー

    ド ログがアップロー ドされているかのチェックなども シェルスクリプトよりもRuby の方が柔軟で、 リトライ処理な ども記述しやすい
  14. 運用 管理ツー ル プロジェクトで運用業務をするために必要な機能を持つWeb アプリ ケー ション 主な機能 キャラクター や所持アイテム、

    課金履歴などのゲー ム内検索 アイテム操作履歴やクエスト受託履歴などのログ検索 対象キャラクター へのギフト配布 DB からのデー タ検索だけでなく、bigquery からのデー タ取得・ 閲 覧にも対応 プランナー 向け機能として、 デバッグ環境でのデー タ変更なども
  15. まとめ 様々 な技術領域が求められるゲー ム開発では、Ruby にはたくさんの 利用シー ンがある なぜRuby を使うのか? すばやく価値を届けられる

    スピー ド感の求められるゲー ム開発では重要 柔軟に書けて活用できる領域が広い Ruby エンジニアの文化も社内に良い影響を与えていると感じる 名前重要 テストコー ド ツー ル、 自動化 Happy Hacking!