中規模ソーシャルゲーム開発に学ぶWebサービス開発と運用ノウハウ。もしくは2012年にPerlでWeb開発をする理由
YAPC::Asia Tokyo
Sep 29th, 2012
自己紹介
経歴
- 2004 中国でIT起業に関わる
- 2005 語学学校
- 営業兼・システム/Web担当
- レッスン予約システム
- 2009 印刷系SIer
- 業務システム
- Webキャンペーン
- PHP, Legacy perl, Java, VB(.NET)?, 組み込みBasic
- 2011 Kayac
Perlが書ける幸せ
最近CPANに上げたモジュール
- Plack::App::Directory::Markdown
- Plack::App::DataSection
- Text::Markup::Any
- Text::Markdown::GithubAPI (not on cpan)
突然のMarkdown期!!(AA略
今日お話すること
- ソーシャルゲーム運営について
- Perlによる開発・運用
- 2012年におけるPerl開発について
あんま超大規模の話はしません(できません)
Casual Talkです
ソーシャルゲーム運営について
ぼくらの甲子園シリーズ
ぼくらの甲子園シリーズ
...
ぼくらの甲子園シリーズ
- 初代と熱闘編の2作
- 累計160万ユーザー
- 2年以上運営
...
ぼくらの甲子園シリーズ
- 初代と熱闘編の2作
- 累計160万ユーザー
- 2年以上運営
- Perl製
ぼくらの甲子園シリーズ(2)
...
ぼくらの甲子園シリーズ(2)
- 一選手になって甲子園を目指す
- 育成シミュレーション(非カードゲーム)
...
ぼくらの甲子園シリーズ(2)
- 一選手になって甲子園を目指す
- 育成シミュレーション(非カードゲーム)
- ガチャのないガチなゲーム(異質)
...
ぼくらの甲子園シリーズ(2)
- 一選手になって甲子園を目指す
- 育成シミュレーション(非カードゲーム)
- ガチャのないガチなゲーム(異質)
- 自分のチームを作るんじゃなくてユーザー同士でチームを組む
...
ぼくらの甲子園シリーズ(2)
- 一選手になって甲子園を目指す
- 育成シミュレーション(非カードゲーム)
- ガチャのないガチなゲーム(異質)
- 自分のチームを作るんじゃなくてユーザー同士でチームを組む
- 「ソーシャル」ゲーム
...
ぼくらの甲子園シリーズ(2)
- 一選手になって甲子園を目指す
- 育成シミュレーション(非カードゲーム)
- ガチャのないガチなゲーム(異質)
- 自分のチームを作るんじゃなくてユーザー同士でチームを組む
- 「ソーシャル」ゲーム
- 僕も割と真剣に遊んでます
ソーシャルゲーム運用について
...
ソーシャルゲーム運用について
- 最初は抵抗感があった
- 語学学校勤務開始時も同じような感覚を持っていたことを思い出す
...
ソーシャルゲーム運用について
- 最初は抵抗感があった
- 語学学校勤務開始時も同じような感覚を持っていたことを思い出す
- 技術的にチャレンジングだしWeb開発がしたかった
次第に情熱を持つように
...
次第に情熱を持つように
- ユーザーさんと一緒に作っていく感覚
- →つくる人を増やす
...
次第に情熱を持つように
- ユーザーさんと一緒に作っていく感覚
- →つくる人を増やす
- ユーザーさんを騙す/搾取するとかそういう感覚を持って長く運用はできない(僕は)
...
次第に情熱を持つように
- ユーザーさんと一緒に作っていく感覚
- →つくる人を増やす
- ユーザーさんを騙す/搾取するとかそういう感覚を持って長く運用はできない(僕は)
- 愛と誇りをもってとりくむこと
...
次第に情熱を持つように
- ユーザーさんと一緒に作っていく感覚
- →つくる人を増やす
- ユーザーさんを騙す/搾取するとかそういう感覚を持って長く運用はできない(僕は)
- 愛と誇りをもってとりくむこと
- ドッグフード食べる(by 闘うプログラマー)の大事!
Perlによる開発・運用
モジュールとか
- Ark
- DBIx::Class
- Text::MicroTemplate::Extended
特に不満はない。できればテンプレートはXslateにしたいかなーくらい。
ソースコードの規模
- ソースコード: 10万行
- コントローラー数: 80
- アクション数 : 500
- テーブル数: 137
規模自慢はしたくないけど
...
規模自慢はしたくないけど
- 比較的シンプルなアプリで超大トラフィックを捌くとかとはドメインが違う
...
規模自慢はしたくないけど
- 比較的シンプルなアプリで超大トラフィックを捌くとかとはドメインが違う
- ORM必須!
...
規模自慢はしたくないけど
- 比較的シンプルなアプリで超大トラフィックを捌くとかとはドメインが違う
- ORM必須!
- DBIx::Class最高w
...
規模自慢はしたくないけど
- 比較的シンプルなアプリで超大トラフィックを捌くとかとはドメインが違う
- ORM必須!
- DBIx::Class最高w
- スキーマ管理とかもできるし
...
規模自慢はしたくないけど
- 比較的シンプルなアプリで超大トラフィックを捌くとかとはドメインが違う
- ORM必須!
- DBIx::Class最高w
- スキーマ管理とかもできるし
- アプリケーションに応じてモジュールを選定する
構成
- Web x2 (Nginx)
- App x6 (Starman Haproxy)
- DB x5 (MySQL5.1 + InnoDB Plugin/5.5)
- Session x2 (KyotoTycoon memcached)
- Batch x2 (daemontools Gearman cron)
- Admin x1 (Mongo)
大規模じゃん…と思う人もいるかもしれない
...
大規模じゃん…と思う人もいるかもしれない
- 小規模だと思う人もいるでしょう
- 用途ごとにミドルウェアを使っているだけ
...
大規模じゃん…と思う人もいるかもしれない
- 小規模だと思う人もいるでしょう
- 用途ごとにミドルウェアを使っているだけ
- サーバーの台数的はもっと少なくても良いし多くても大丈夫
...
大規模じゃん…と思う人もいるかもしれない
- 小規模だと思う人もいるでしょう
- 用途ごとにミドルウェアを使っているだけ
- サーバーの台数的はもっと少なくても良いし多くても大丈夫
- →スモールスタートできて、スケールアウト出来る構成
App
- Server::Starter + Starman + daemontools
- DBやSessionへの振り分けにHaproxyかましてる
- Flash生成はSWFEditor
- 行動ログ収集のためfluentd
WAFは好きなの使えばいいんじゃないでしょうか。
Arkはなにげにソーシャルゲーム開発向きだった
Haproxy 便利
...
Haproxy 便利
- DB SlaveやSessionが落ちても寝ていられる
...
Haproxy 便利
- DB SlaveやSessionが落ちても寝ていられる
- プロセス数(nbproc)とかを調整しないとボトルネックになったりするので注意
...
Haproxy 便利
- DB SlaveやSessionが落ちても寝ていられる
- プロセス数(nbproc)とかを調整しないとボトルネックになったりするので注意
- 事前にちゃんと負荷試験!!
...
Haproxy 便利
- DB SlaveやSessionが落ちても寝ていられる
- プロセス数(nbproc)とかを調整しないとボトルネックになったりするので注意
- 事前にちゃんと負荷試験!!
- Parallel::Benchmark + Furlでお手軽ベンチマーク
DB ~ MySQL
- Master x1
- Slave x4 (うちバックアップ用 x1)
...
DB ~ MySQL
- Master x1
- Slave x4 (うちバックアップ用 x1)
...
DB ~ MySQL
- Master x1
- Slave x4 (うちバックアップ用 x1)
- Shardingとかしていない幸せな構成
- データの肥大化を防ぐためにPartitionを活用
...
DB ~ MySQL
- Master x1
- Slave x4 (うちバックアップ用 x1)
- Shardingとかしていない幸せな構成
- データの肥大化を防ぐためにPartitionを活用
- →メモリにデータが乗り切る幸せな構成
...
DB ~ MySQL
- Master x1
- Slave x4 (うちバックアップ用 x1)
- Shardingとかしていない幸せな構成
- データの肥大化を防ぐためにPartitionを活用
- →メモリにデータが乗り切る幸せな構成
- Masterが冗長構成取れていないのは不安
Cache
- KyotoTycoon (Session)
- memcached (動的生成したFlashのキャッシュなど)
KyotoTycoonはDualMaster構成
KyotoTycoon便利
- memcachedと同じような感覚で使える
- データが揮発しない
- Dual Master構成でfail over可能
- ulog(更新ログ)がもりもりたまるので、定期削除しないといけないのが注意どころ
KyotoTycoon便利(2)
memcached互換モードで、Cache::Memcached::Fastでアクセスできる!
圧縮転送も可能!
my $kt = Cache::Memcached::Fast->new({
servers => [...],
compress_threshold => 500,
compress_ratio => 0.9,
});
HTTPでもアクセスできるからNginxでプロキシするとかもできる
Batch
- ランキング作成
- 試合シミュレータの実施
- WebとCliでモデルが共有できるのは便利
...
Batch
- ランキング作成
- 試合シミュレータの実施
- WebとCliでモデルが共有できるのは便利
- Gearman便利
- daemontools便利
Gearmanはオワコン?
...
Gearmanはオワコン?
- RedisがあればGearman要らない! by typester
...
Gearmanはオワコン?
- RedisがあればGearman要らない! by typester
- typesterの真似をして使い始めた頃には彼の中でオワコン化している事例が多々
...
Gearmanはオワコン?
- RedisがあればGearman要らない! by typester
- typesterの真似をして使い始めた頃には彼の中でオワコン化している事例が多々
- Sporkとか
マスタ系データ(アイテムデータとか)管理
- GoogleSpreadSheet
- 中途半端な管理画面とかを使ってもらうと、エクセルとか使われて二重管理になって死ぬ
- パラメータなどをテスト・チェックしたい
- 変更履歴も追いたいので、バージョン管理したい
→ Data::GoogleSpreadsheet::Fetcher(Net::Google::Spreadsheetsのラッパ)
マスタ系データ(アイテムデータとか)管理 2
...
マスタ系データ(アイテムデータとか)管理 2
...
マスタ系データ(アイテムデータとか)管理 2
- GoogleSpreadSheet編集
- yaml or csv にしてコミット {table名}.yml
- % script/spreadsheet2yml.pl item
- # item.yml生成 & 値の検証
...
マスタ系データ(アイテムデータとか)管理 2
- GoogleSpreadSheet編集
- yaml or csv にしてコミット {table名}.yml
- % script/spreadsheet2yml.pl item
- # item.yml生成 & 値の検証
- 本番DBに流し込み
- % script/import_dbdata.pl item.yml
テスト&CI
- Test::mysqld
- 起動時にスキーマの流し込みとともに前述のマスタ系データも全部流し込む。
- テストファイルごとにトランザクション開始、終わったらrollback
- 並列実行も可能
- テストに時間かかるのでJenkinsおじさんに頼りっぱなし
うまくいっていない部分もある
残り10分くらい?
色々なミドルウェアのバインディングに事欠かないのがPerl開発で便利な部分の一つですね
Rubyも
- 構成管理にCap + Chef
- Fluentd便利
2012年におけるPerl開発
Perlを使う個人的な理由
...
Perlを使う個人的な理由
- 中国語を扱うのに便利だった
- 内部表現がUTF-8なの良いよね!
...
Perlを使う個人的な理由
- 中国語を扱うのに便利だった
- 内部表現がUTF-8なの良いよね!
- 正規表現便利!
...
Perlを使う個人的な理由
- 中国語を扱うのに便利だった
- 内部表現がUTF-8なの良いよね!
- 正規表現便利!
- Unixとの親和性
...
Perlを使う個人的な理由
- 中国語を扱うのに便利だった
- 内部表現がUTF-8なの良いよね!
- 正規表現便利!
- Unixとの親和性
- ちょっとしたツールから大規模開発までつかえる
...
Perlを使う個人的な理由
- 中国語を扱うのに便利だった
- 内部表現がUTF-8なの良いよね!
- 正規表現便利!
- Unixとの親和性
- ちょっとしたツールから大規模開発までつかえる
...
Perlを使う個人的な理由
- 中国語を扱うのに便利だった
- 内部表現がUTF-8なの良いよね!
- 正規表現便利!
- Unixとの親和性
- ちょっとしたツールから大規模開発までつかえる
- どこにでも入っている(最近そうでもないけど)
...
Perlを使う個人的な理由
- 中国語を扱うのに便利だった
- 内部表現がUTF-8なの良いよね!
- 正規表現便利!
- Unixとの親和性
- ちょっとしたツールから大規模開発までつかえる
- どこにでも入っている(最近そうでもないけど)
- シェルスクリプト力が足りないので…
Perlが使われる理由
...
Perlが使われる理由
- WebプログラムもUnixプログラムもまかなえる
- ワンライナー。書き捨てスクリプト。システムツールからWeb開発まで
...
Perlが使われる理由
- WebプログラムもUnixプログラムもまかなえる
- ワンライナー。書き捨てスクリプト。システムツールからWeb開発まで
- コミュニティの成熟
...
Perlが使われる理由
- WebプログラムもUnixプログラムもまかなえる
- ワンライナー。書き捨てスクリプト。システムツールからWeb開発まで
- コミュニティの成熟
- CPAN
...
Perlが使われる理由
- WebプログラムもUnixプログラムもまかなえる
- ワンライナー。書き捨てスクリプト。システムツールからWeb開発まで
- コミュニティの成熟
- CPAN
- 多様なミドルウェアのバインディング
...
Perlが使われる理由
- WebプログラムもUnixプログラムもまかなえる
- ワンライナー。書き捨てスクリプト。システムツールからWeb開発まで
- コミュニティの成熟
- CPAN
- 多様なミドルウェアのバインディング
- 後方互換性
...
Perlが使われる理由
- WebプログラムもUnixプログラムもまかなえる
- ワンライナー。書き捨てスクリプト。システムツールからWeb開発まで
- コミュニティの成熟
- CPAN
- 多様なミドルウェアのバインディング
- 後方互換性
- なにより進化してる
Perlの位置づけとか
...
Perlの位置づけとか
- Unix言語
- Perlで書かれたツールも多く、知らず知らずのうちに恩恵にあずかっている
...
Perlの位置づけとか
- Unix言語
- Perlで書かれたツールも多く、知らず知らずのうちに恩恵にあずかっている
- Perl Python Ruby辺りが似たり寄ったりで、互いに切磋琢磨しているのは周知の事実
...
Perlの位置づけとか
- Unix言語
- Perlで書かれたツールも多く、知らず知らずのうちに恩恵にあずかっている
- Perl Python Ruby辺りが似たり寄ったりで、互いに切磋琢磨しているのは周知の事実
- (PHPはテンプレート言語。スクリプト書いたりするのに向いてなさすぎる)
なぜPerlがDisられるのか
...
なぜPerlがDisられるのか
- 古臭い印象
- 新しいものほど良いというよくわからない風潮
...
なぜPerlがDisられるのか
- 古臭い印象
- 新しいものほど良いというよくわからない風潮
- 古くて腐ったものはもちろん駄目だけど
...
なぜPerlがDisられるのか
- 古臭い印象
- 新しいものほど良いというよくわからない風潮
- 古くて腐ったものはもちろん駄目だけど
- 長い間後方互換性を保ったまま柔軟に進化している
...
なぜPerlがDisられるのか
- 古臭い印象
- 新しいものほど良いというよくわからない風潮
- 古くて腐ったものはもちろん駄目だけど
- 長い間後方互換性を保ったまま柔軟に進化している
- その辺りをよくわかってないのでしょう
個人的には他の言語も使ってるし学んでる
...
個人的には他の言語も使ってるし学んでる
- いろいろな言語を使ってきて結局Perlを使っている
...
個人的には他の言語も使ってるし学んでる
- いろいろな言語を使ってきて結局Perlを使っている
- 別にPerlばかり使っているわけでもないし
...
個人的には他の言語も使ってるし学んでる
- いろいろな言語を使ってきて結局Perlを使っている
- 別にPerlばかり使っているわけでもないし
- 他の言語を学ぶことでPerlへの理解が深まる(自然言語も同じ)
...
個人的には他の言語も使ってるし学んでる
- いろいろな言語を使ってきて結局Perlを使っている
- 別にPerlばかり使っているわけでもないし
- 他の言語を学ぶことでPerlへの理解が深まる(自然言語も同じ)
- Perlを深く使わないでDisる人がよくわからない
Perlはボトムアップ文化
...
Perlはボトムアップ文化
- 「Unixという考え方」
- もともとWeb言語ではなかった
...
Perlはボトムアップ文化
- 「Unixという考え方」
- もともとWeb言語ではなかった
- 小さなパーツを強調させて自分好みのソフトウェアを作る
...
Perlはボトムアップ文化
- 「Unixという考え方」
- もともとWeb言語ではなかった
- 小さなパーツを強調させて自分好みのソフトウェアを作る
- パーツの中身自体はどう書いても良い TMTOWDI
...
Perlはボトムアップ文化
- 「Unixという考え方」
- もともとWeb言語ではなかった
- 小さなパーツを強調させて自分好みのソフトウェアを作る
- パーツの中身自体はどう書いても良い TMTOWDI
- TMTOWDI とは他人のやり方に口出しをしないということ
...
Perlはボトムアップ文化
- 「Unixという考え方」
- もともとWeb言語ではなかった
- 小さなパーツを強調させて自分好みのソフトウェアを作る
- パーツの中身自体はどう書いても良い TMTOWDI
- TMTOWDI とは他人のやり方に口出しをしないということ
- 小さなパーツは読解も楽
...
Perlはボトムアップ文化
- 「Unixという考え方」
- もともとWeb言語ではなかった
- 小さなパーツを強調させて自分好みのソフトウェアを作る
- パーツの中身自体はどう書いても良い TMTOWDI
- TMTOWDI とは他人のやり方に口出しをしないということ
- 小さなパーツは読解も楽
- 教義はない
...
Perlはボトムアップ文化
- 「Unixという考え方」
- もともとWeb言語ではなかった
- 小さなパーツを強調させて自分好みのソフトウェアを作る
- パーツの中身自体はどう書いても良い TMTOWDI
- TMTOWDI とは他人のやり方に口出しをしないということ
- 小さなパーツは読解も楽
- 教義はない
- 協調する
小粒でぴりりと辛いモジュール
- Sub::Retry
- Array::Diff
- JSON::Types
小さなイノベーションが誰でも起こせるし、それが大きなイノベーションになることも
Perl程長い間愛されている言語はなかなかない
...
Perl程長い間愛されている言語はなかなかない
...
Perl程長い間愛されている言語はなかなかない
- やむを得ずイヤイヤ使われているわけではない
- 大人の恋愛をしている
...
Perl程長い間愛されている言語はなかなかない
- やむを得ずイヤイヤ使われているわけではない
- 大人の恋愛をしている
- 他者をDisるのはまだ成熟していない証
...
Perl程長い間愛されている言語はなかなかない
- やむを得ずイヤイヤ使われているわけではない
- 大人の恋愛をしている
- 他者をDisるのはまだ成熟していない証
- 自分の嫁最高。
...
Perl程長い間愛されている言語はなかなかない
- やむを得ずイヤイヤ使われているわけではない
- 大人の恋愛をしている
- 他者をDisるのはまだ成熟していない証
- 自分の嫁最高。
- 他人の嫁もきっとその人にとっては素晴らしいのでしょう。という境地
...
Perl程長い間愛されている言語はなかなかない
- やむを得ずイヤイヤ使われているわけではない
- 大人の恋愛をしている
- 他者をDisるのはまだ成熟していない証
- 自分の嫁最高。
- 他人の嫁もきっとその人にとっては素晴らしいのでしょう。という境地
- 云われのないDisを受けるのは腹立たしいこともある
...
Perl程長い間愛されている言語はなかなかない
- やむを得ずイヤイヤ使われているわけではない
- 大人の恋愛をしている
- 他者をDisるのはまだ成熟していない証
- 自分の嫁最高。
- 他人の嫁もきっとその人にとっては素晴らしいのでしょう。という境地
- 云われのないDisを受けるのは腹立たしいこともある
- 「Perlはなんでもできるからコードが汚くなりがち。Rubyは柔軟だから黒魔術的なコードが書けて素晴らしい」
...
Perl程長い間愛されている言語はなかなかない
- やむを得ずイヤイヤ使われているわけではない
- 大人の恋愛をしている
- 他者をDisるのはまだ成熟していない証
- 自分の嫁最高。
- 他人の嫁もきっとその人にとっては素晴らしいのでしょう。という境地
- 云われのないDisを受けるのは腹立たしいこともある
- 「Perlはなんでもできるからコードが汚くなりがち。Rubyは柔軟だから黒魔術的なコードが書けて素晴らしい」
- …おまえは何を言っているんだ
まとめ
...
まとめ
- ソーシャルゲーム運用は楽しい
- 用途にあったミドルウェアを組み合わせてスケール可能なWeb開発を
...
まとめ
- ソーシャルゲーム運用は楽しい
- 用途にあったミドルウェアを組み合わせてスケール可能なWeb開発を
- Perlはまだまだ戦える
ご清聴ありがとうございました