SlideShare a Scribd company logo
1 of 27
Download to read offline
ゲーム会社でのRuby / Rails活用事例
About me
植森康友
twitter: @wakaba260yen
github: yuemori
所属:株式会社Aiming
Webエンジニア
RailsでのAPIサーバやWebアプリケーション開発
インフラサイドも少し
今日のテーマ: 「ゲーム会社でのRuby / Rails活用事例」
「ゲーム会社でRuby / Railsって何に使ってるの?」についてお話します
Aimingについて
ソーシャルゲーム・オンラインゲーム開発
企画、開発から運営・プロデュースまで
主なエンジニアリング領域
ゲームクライアント開発
ゲームサーバ開発
リアルタイムサーバ
WebAPIサーバ
バッチサーバ
開発環境
基盤開発
インフラ
運用
主なエンジニアリング領域
ゲームクライアント開発
ゲームサーバ開発
リアルタイムサーバ
WebAPIサーバ
バッチサーバ
開発環境
基盤開発
インフラ
運用
ゲーム開発
RailsによりゲームのAPIサーバを開発
バックグラウンドサーバにも活用
ゲーム開発
WebAPI
RailsによるゲームのWebAPIの開発
ゲームクライアント、リアルタイムサーバとやり取りする
データフォーマットはMessagePackを採用
内製のIDLを利用して異なる言語間でのプロトコルを定義
Unity(C#),リアルタイムサーバ(C++)などとのやり取りに利用
IDL = Interface Description Language
詳しくは後述
ゲーム開発
バッチサーバ
ResqueやSidekiqといったgemによるバッチ処理用サーバ
利用シーンはプロジェクトにより様々
キャラクターへのギフト配布
データベースのお掃除
Push通知の送信
開発環境
開発環境の効率化にRubyを活用
シェルスクリプトよりも複雑な作業を自動化する
開発環境
IDL
IDL = インターフェース記述言語
RubyのDSLを使って異なる言語間でのメッセージを定義する
専用のパーサを使って定義を読み込んだ後、ERBを使ったテンプレ
ートで各言語のコードを生成する
IDL
Contract(インターフェース定義)例
rpc(:create_sample) {
  url '/sample/create'
  method 'POST'
  request {
    param 'id', :int, 'ID'
    param 'name', :string, '素敵な名前'
  }
  response {
    param 'sample', :sample, '作成したさんぷる'
  }
}
IDL
コードテンプレート例
<%‐ document.each_rpc do |rpc| ‐%>
module <%= rpc.name.camelize %>
  class Request < Type::Base
    <%‐ rpc.response.params.each do |param|‐%>
    attribute <%= param.name %>, <%= param.type %>
    <%‐ end ‐%>
  end
  class Response < Type::Base
    <%‐ rpc.response.params.each do |param|‐%>
    attribute <%= param.name %>, <%= param.type %>
    <%‐ end ‐%>
  end
end
<%‐ end ‐%>
生成されるコード例
module Sample::Create
  class Request < Type::Base
    attribute :id, Integer
    attribute :name, String
  end
  
  class Response < Type::Base
    attribute :sample, Type::Sample
  end
end
IDL
レスポンスの例
sample = Type::Sample.new(id: 1, name: 'foo')
response = Sample::Create::Response.new(sample: sample)
respond_to do |format|
  format.msgpack(body: response.to_msgpack)
end
生成された型を使ってMessagePackでシリアライズ・デシリアラ
イズをする
Contractからコードを自動生成するメリット
各言語のテンプレートを用意することで、異なる言語間での型
の違いなどを吸収しやすい
開発効率の上昇
インターフェースのドキュメント化
開発環境
rakeタスク
マスターデータのインポート
大量のデータを扱うゲーム開発ではExcelなどで設定を行うこ
とが多い
データベースにExcelからデータをインポートするなど
コードジェネレータの実行など
定形作業を自動化する
クライアント、リアルタイムサーバ、WebAPIサーバと異なる
開発環境で複数の定形作業が発生することが多々ある
Jenkinsなどでのバッチ処理
CIや簡単なスクリプトなどをRubyスクリプトで記述して実行
共通基盤開発
各プロジェクトでの車輪の再発明を防ぐための基盤開発
ゲーム開発・運用に必須の機能をシステムとして提供する
共通基盤開発
認証・課金基盤システム
複数のプロジェクトをまたいで利用できる認証、課金用の基盤シス
テム
RailsでWebAPI+管理用ツールを実装
簡易的なOauth Providerとして振る舞う
SNS連携や端末の引き継ぎなどもサポートされている
共通基盤開発
会計ツール
毎月の売上を自動で計上する基盤システム
ゲーム内の仮想通貨を売上に換算する
プロジェクトによって仮想通貨の単価が異なる
各プロジェクトでの収入を単価に応じてレポートにする
日本国外の通貨にも対応
海外展開が増えてきたため、正確な収入を出す必要があった
共通基盤開発
KPI分析ツール
KPI分析に必要な指標を日時で表示するためのツール
AU
ARPPU
課金率
継続率
FQ5など
SQLクエリを登録するとグラフにして出力するのが主な機能
OSSのRe:Dashと似た機能を持つ
CSV出力などにも対応している
インフラ
主にデプロイ、バッチ処理などにRubyを利用
ミドルウェアのPluginなども必要に応じて内製ツールを作成
インフラ
Deploy / Provisioning
WebAPIでは定番のCapistranoを主に利用している
WebAPIだけならメンテナンスを挟まずにアップデートやバグ修正
が可能
gitが利用しづらいシーンではcapistrano‑scm‑copyも使っている
海外展開などで諸事情によりソースコード履歴をサーバに置き
たくないとき
特定のディレクトリだけをコピーしてデプロイしたいとき
ProvisioningにChefを使っているところもある
メインはansible
インフラ
バッチ処理
Aimingではログデータ保存先にgoogleのbigqueryを利用している
各種ゲームサーバの出力したログをバッチ処理でアップロード
ログがアップロードされているかのチェックなども
シェルスクリプトよりもRubyの方が柔軟で、リトライ処理な
ども記述しやすい
インフラ
ミドルウェアPlugin
fluentdやembulkなど、RubyでPluginが書けるものでは内製Plugin
を作成することも
fluentd: 特殊なログのデータ加工
embulk:マスターデータのインポート時のデータ加工
運用
お問い合わせ対応
インゲーム告知
お詫びのアイテム配布
など、多くの作業を非エンジニアさんが作業する必要がある
運用
管理ツール
プロジェクトで運用業務をするために必要な機能を持つWebアプリ
ケーション
主な機能
キャラクターや所持アイテム、課金履歴などのゲーム内検索
アイテム操作履歴やクエスト受託履歴などのログ検索
対象キャラクターへのギフト配布
DBからのデータ検索だけでなく、bigqueryからのデータ取得・閲
覧にも対応
プランナー向け機能として、デバッグ環境でのデータ変更なども
まとめ
様々な技術領域が求められるゲーム開発では、Rubyにはたくさんの
利用シーンがある
なぜRubyを使うのか?
すばやく価値を届けられる
スピード感の求められるゲーム開発では重要
柔軟に書けて活用できる領域が広い
Rubyエンジニアの文化も社内に良い影響を与えていると感じる
名前重要
テストコード
ツール、自動化
Happy Hacking!

More Related Content

What's hot

What's hot (20)

ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
ここにハマった!Dockerコンテナホスティング「Arukas」の裏側
 
現場!実物!実践!マルチクラスタを運用するときの課題とコツ
現場!実物!実践!マルチクラスタを運用するときの課題とコツ現場!実物!実践!マルチクラスタを運用するときの課題とコツ
現場!実物!実践!マルチクラスタを運用するときの課題とコツ
 
Sprocketsを捨てたい
Sprocketsを捨てたいSprocketsを捨てたい
Sprocketsを捨てたい
 
ApplicationTemplateのススメ
ApplicationTemplateのススメApplicationTemplateのススメ
ApplicationTemplateのススメ
 
Riot.jsとフォームのデータバインディング
Riot.jsとフォームのデータバインディングRiot.jsとフォームのデータバインディング
Riot.jsとフォームのデータバインディング
 
RubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書くRubyでGUIアプリケーションを書く
RubyでGUIアプリケーションを書く
 
Ruby on Rails の特徴とそのエコシステム
Ruby on Rails の特徴とそのエコシステムRuby on Rails の特徴とそのエコシステム
Ruby on Rails の特徴とそのエコシステム
 
すこやかRails
すこやかRailsすこやかRails
すこやかRails
 
ヤマハルーターとクラウドをVPNで繋いでDaaS環境を構築しよう
ヤマハルーターとクラウドをVPNで繋いでDaaS環境を構築しようヤマハルーターとクラウドをVPNで繋いでDaaS環境を構築しよう
ヤマハルーターとクラウドをVPNで繋いでDaaS環境を構築しよう
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
Capistrano紹介 at kawasaki.rb #002 #kwskrb
Capistrano紹介 at kawasaki.rb #002 #kwskrbCapistrano紹介 at kawasaki.rb #002 #kwskrb
Capistrano紹介 at kawasaki.rb #002 #kwskrb
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
 
bootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのかbootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのか
 
Rancherカタログ紹介 Hadoop + Yarn
Rancherカタログ紹介 Hadoop + YarnRancherカタログ紹介 Hadoop + Yarn
Rancherカタログ紹介 Hadoop + Yarn
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflow
 
こすもすえび&しばやんの「Azureアンカンファレンス~Azureについては俺たちに聞け(ばええやろ)」
こすもすえび&しばやんの「Azureアンカンファレンス~Azureについては俺たちに聞け(ばええやろ)」こすもすえび&しばやんの「Azureアンカンファレンス~Azureについては俺たちに聞け(ばええやろ)」
こすもすえび&しばやんの「Azureアンカンファレンス~Azureについては俺たちに聞け(ばええやろ)」
 
仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法 仮想マシンを使った開発環境の簡単共有方法
仮想マシンを使った開発環境の簡単共有方法
 
OpenShift のある生活
OpenShift のある生活OpenShift のある生活
OpenShift のある生活
 
趣味でのCosmos DBとの付き合い方
趣味でのCosmos DBとの付き合い方趣味でのCosmos DBとの付き合い方
趣味でのCosmos DBとの付き合い方
 

Viewers also liked

Viewers also liked (6)

DB設計を静的解析ツールを作ってみた @まべ☆てっく vol.1
DB設計を静的解析ツールを作ってみた @まべ☆てっく vol.1DB設計を静的解析ツールを作ってみた @まべ☆てっく vol.1
DB設計を静的解析ツールを作ってみた @まべ☆てっく vol.1
 
スマホ版ログレスにポストエフェクトシステムを導入した話
スマホ版ログレスにポストエフェクトシステムを導入した話スマホ版ログレスにポストエフェクトシステムを導入した話
スマホ版ログレスにポストエフェクトシステムを導入した話
 
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
 
BootstrapとRailsで、 高速にWebサイトを作ってみた
BootstrapとRailsで、 高速にWebサイトを作ってみたBootstrapとRailsで、 高速にWebサイトを作ってみた
BootstrapとRailsで、 高速にWebサイトを作ってみた
 
良くわかるMeta
良くわかるMeta良くわかるMeta
良くわかるMeta
 
Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)Railsチュートリアルの歩き方 (第4版)
Railsチュートリアルの歩き方 (第4版)
 

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

Next GAE Heroku を使って 3分でRailsアプリをリリース
Next GAE Heroku を使って 3分でRailsアプリをリリースNext GAE Heroku を使って 3分でRailsアプリをリリース
Next GAE Heroku を使って 3分でRailsアプリをリリース
よしだ あつし
 
AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)
Akio Katayama
 
JAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作る
JAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作るJAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作る
JAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作る
Naoyuki Yamada
 

Similar to ゲーム会社でのRuby : rails活用事例 (20)

ネットワークエンジニアがWeb開発をやってみて思ったこと
ネットワークエンジニアがWeb開発をやってみて思ったことネットワークエンジニアがWeb開発をやってみて思ったこと
ネットワークエンジニアがWeb開発をやってみて思ったこと
 
Rails api way in aiming
Rails api way in aimingRails api way in aiming
Rails api way in aiming
 
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版
 
【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座
【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座
【入門】3時間でアプリ公開!ゼロからのプログラミングRails講座
 
Game BaaS Implemented in Ruby
Game BaaS Implemented in RubyGame BaaS Implemented in Ruby
Game BaaS Implemented in Ruby
 
私とRubyの付き合い方 - 岡山Ruby会議02
私とRubyの付き合い方 - 岡山Ruby会議02私とRubyの付き合い方 - 岡山Ruby会議02
私とRubyの付き合い方 - 岡山Ruby会議02
 
ITフォーラム2024 AITCセッション(2)
ITフォーラム2024 AITCセッション(2)ITフォーラム2024 AITCセッション(2)
ITフォーラム2024 AITCセッション(2)
 
Next GAE Heroku を使って 3分でRailsアプリをリリース
Next GAE Heroku を使って 3分でRailsアプリをリリースNext GAE Heroku を使って 3分でRailsアプリをリリース
Next GAE Heroku を使って 3分でRailsアプリをリリース
 
Redmine4時代のプラグイン開発 redmine.tokyo #13
Redmine4時代のプラグイン開発 redmine.tokyo #13Redmine4時代のプラグイン開発 redmine.tokyo #13
Redmine4時代のプラグイン開発 redmine.tokyo #13
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話Rubyの会社でPythonistaが三ヶ月生き延びた話
Rubyの会社でPythonistaが三ヶ月生き延びた話
 
増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの広め方〜PR・継続できる目標の立て方・改善編 先生:増井 雄一郎
増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの広め方〜PR・継続できる目標の立て方・改善編 先生:増井 雄一郎増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの広め方〜PR・継続できる目標の立て方・改善編 先生:増井 雄一郎
増井雄一郎の「wri.pe」を事例に学ぶ、自作サービスの広め方〜PR・継続できる目標の立て方・改善編 先生:増井 雄一郎
 
株式会社インタースペース 沖本様 登壇資料
株式会社インタースペース 沖本様 登壇資料株式会社インタースペース 沖本様 登壇資料
株式会社インタースペース 沖本様 登壇資料
 
AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)
 
YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略
 
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
 
JAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作る
JAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作るJAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作る
JAWS-2013-LT 10000req/secを50msecで返すサーバーインフラをAWSで作る
 
ブラウザだけで学ぶWebアプリ開発【デザイン編】
ブラウザだけで学ぶWebアプリ開発【デザイン編】ブラウザだけで学ぶWebアプリ開発【デザイン編】
ブラウザだけで学ぶWebアプリ開発【デザイン編】
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
WebApp個人開発のすゝめ / Recommendation of personal web app development
WebApp個人開発のすゝめ / Recommendation of personal web app developmentWebApp個人開発のすゝめ / Recommendation of personal web app development
WebApp個人開発のすゝめ / Recommendation of personal web app development
 

More from Yasutomo Uemori (7)

Active job meets kubernetes
Active job meets kubernetesActive job meets kubernetes
Active job meets kubernetes
 
Ruby/Rails Benchmarking and Profiling with TDD
Ruby/Rails Benchmarking and Profiling with TDDRuby/Rails Benchmarking and Profiling with TDD
Ruby/Rails Benchmarking and Profiling with TDD
 
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境
 
サービスクラス、その前に
サービスクラス、その前にサービスクラス、その前に
サービスクラス、その前に
 
Rails on Dockerとの戦い
Rails on Dockerとの戦いRails on Dockerとの戦い
Rails on Dockerとの戦い
 
Rubocopとの付き合い方
Rubocopとの付き合い方Rubocopとの付き合い方
Rubocopとの付き合い方
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略
 

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