pyramid + socket.io 人狼を作ってみた

25
Pyramid + socket.io 人狼を作ってみた PyCon JP 2014 林 淳哉

Upload: junya-hayashi

Post on 01-Dec-2014

1.816 views

Category:

Software


13 download

DESCRIPTION

Pyramid + socket.io で人狼を作りました。PyConJP 2014 の LT 発表資料です。 - 人狼アプリ: http://ec2-54-64-134-137.ap-northeast-1.compute.amazonaws.com/ - ソースコード: https://github.com/ledmonster/werewolf

TRANSCRIPT

Page 1: Pyramid + socket.io 人狼を作ってみた

Pyramid + socket.io 人狼を作ってみた

PyCon JP 2014 林 淳哉

Page 2: Pyramid + socket.io 人狼を作ってみた

Who am I ?• 林 淳哉(35歳)

• 1児のパパ

• Python 歴10年くらい?

• Pylons, Pyramid

Page 3: Pyramid + socket.io 人狼を作ってみた

みんなの人狼

村に参加して、

チャットで人狼。

!

Web API + JavaScript

http://bit.ly/YAb5f7

Page 4: Pyramid + socket.io 人狼を作ってみた

https://github.com/ledmonster/werewolf

Page 5: Pyramid + socket.io 人狼を作ってみた

DDDを 意識してみた

Page 6: Pyramid + socket.io 人狼を作ってみた

UI

App

Domain

Infra

/api /socket.io

Pyrmid ViewNamespace

Backend

Flywheel

Repository

Game DomainUser

Domain

MessageHandler

Frontend

Repository

Handlebars

Web Page

Bacon.appView

Model

Router

jQuery

Bacon.js

Page 7: Pyramid + socket.io 人狼を作ってみた

UI

App

Domain

Infra

/api /socket.io

Pyrmid ViewNamespace

Backend

Flywheel

Repository

Game DomainUser

Domain

MessageHandler

Frontend

Repository

Handlebars

Web Page

Bacon.appView

Model

Router

jQuery

Bacon.js

Pyramid

socket.ioBacon.js

Flywheel

handlebars

Page 8: Pyramid + socket.io 人狼を作ってみた

Backend

Page 9: Pyramid + socket.io 人狼を作ってみた

Backend• AWS

• Python

• Pyramid

• gevent-socketio

• google-api-python-client

• DynamoDB

Page 10: Pyramid + socket.io 人狼を作ってみた

ルーティング

Page 11: Pyramid + socket.io 人狼を作ってみた

チャット

gevent-socketio へ委譲

Page 12: Pyramid + socket.io 人狼を作ってみた

ChatNamespace

• ディスパッチ • MessageHandler へ処理を委譲 • Client へメッセージを送信

Page 13: Pyramid + socket.io 人狼を作ってみた

Frontend

Page 14: Pyramid + socket.io 人狼を作ってみた

Frontend• 構成管理

• npm

• gulp

• bower

• bacon.js

• handlebars

• socket.io-client

Page 15: Pyramid + socket.io 人狼を作ってみた

送受信

Page 16: Pyramid + socket.io 人狼を作ってみた

bacon.appbacon.js ベースの社内FWを利用

• ルーティング

• View の描画

• Event 処理

• DOM: bacon.js

• socket.iohttps://github.com/xica/bacon.app

Page 17: Pyramid + socket.io 人狼を作ってみた

DDD

Page 18: Pyramid + socket.io 人狼を作ってみた

UI

App

Domain

Infra

/api /socket.io

Pyrmid ViewNamespace

Backend

Flywheel

Repository

Game DomainUser

Domain

MessageHandler

Frontend

Repository

Handlebars

Web Page

Bacon.appView

Model

Router

jQuery

Bacon.js

Page 19: Pyramid + socket.io 人狼を作ってみた

コンテキストマップ

!1. ユーザ、認証 2. 人狼 3. チャット

※ 妄想込みなので注意

Page 20: Pyramid + socket.io 人狼を作ってみた

ドメインモデル• Entity の識別子に UUID を利用

• Value Object には Enum 型を活用

• namedtuple も使えるかも?

Page 21: Pyramid + socket.io 人狼を作ってみた

リポジトリ• ドメインモデルからのアクセスは・・・?

• NG派: アプリ層のサービスで処理

• OK派: リポジトリの I/F は知っててOK

• Pyramid の Root Factory を使って、context として各ビューに引き渡した。

http://www.infoq.com/jp/news/2008/02/ddd-di-aop

Page 22: Pyramid + socket.io 人狼を作ってみた

ドメインイベント• DDD本には載ってない重要オブジェクト

• ドメイン層のイベントを他のレイヤーやコンテキストに通知する仕組み

• 例: ゲーム → EventBus → チャット

• Pyramid Event が活用できる?

• EventModel として永続化した※ 人狼では EventBus の実装が間に合わず

Page 23: Pyramid + socket.io 人狼を作ってみた

コアドメイン• コンテキストマップの中で、事業的に最も集中すべきドメイン

• もっと早く知りたかった・・

この1ヶ月、コアドメイン(人狼)以外の実装しかやってなかった・・・

Page 24: Pyramid + socket.io 人狼を作ってみた

まとめ• Pyramid で DRY な開発ができる

• SPA に bacon.js はオススメ

• Python でも DDD は役に立つ

• (Flywheel はまだちょっと微妙)

• iPhone アプリ版を作りたい

Page 25: Pyramid + socket.io 人狼を作ってみた

https://github.com/ledmonster/werewolf