---
# System prepended metadata

title: phpcon tokyo 2019

---

# phpcon tokyo 2019
---
# MVCとはなにか
## はじめに
- MVC as Observerでのモデル : 状態を与える、状態をウォッチ
  - fluxっぽさあるs
## ドメインモデル
- 複写式伝票(飲食とかで使われる伝票)の処理フロー
  - 厨房の人とホールの人に取って処理したい部分が違う
    - 厨房 : 料理する順のみ
    - ホール : 出したかどうか(true/false)
  - 注文伝票と券売機の差
    - キャンセル方法が違う
      - 注文 : そのまま続行
      - 券売 : 別のシステムが必要
  - 問題領域(ドメイン) : ビジネス/目的
    - 顧客が食べたいものを出す(目的)など
  - 解決領域(ドメインモデル) : 手段
    - メモおいつかない
    - 国家とか(紛争解決をどのように効率化するか)
  - ドメインモデル : 社会的なシステム(業務の形を作ったり)で個人の制約になる
## メンタルモデル
- 行動のイメージを表現したもの(左右に動かすならそれをするためのレバーも左右に動かすみたいな)
- ユーザーイリュージョン
  - ユーザーがドメインの情報を直接操作出来るようにする(後述)
  - メンタルモデル構築のためには必要
  - 例 : スプレッドシートとか
## パーソナルコンピュータ
- システム(社会)と個人の関係を変えようとした
- プログラミング言語の表現が人からかけ離れてはいけない
  - ユーザーが理解可能な言語を作るべき
## MVCとはなにか
- MVC自体が3DCGのカメラとワールドの関係に似てる
  - 情報システム(ドメイン)から個人が(パーソナルコンピュータで)メンタルモデルを構築する
  - 色々構築であったりデザインしずらいと思って個人が色々ツールを導入する
  - そういうツールの一種がMVC?
---
# 「グランブルーファンタジー」開発エンジニアの考え方
## はじめに
- グラブル : LAMP環境
- webゲームなので操作ごとに通信がサーバーに飛ぶ
  - ユーザー多いので結構負荷が結構かかる
- ラピュタ放映時のツイッターの2倍の負荷が最大秒間かかるらしい
## 大切にしていること
- 計測と改善
## 改善活動の例
### phpバージョン5.6 -> 7.2にした話
- 7.2対応
  - 2018年年明けには完了
  - 静的解析・それで見つかったエラー対応
  - フレームワークバージョンアップ(FuelPHPらしい)
- 効果
  - 平均レスポンスタイムが半分に
  - メモリ使用量・CPU使用量も半分
  - フレームワークというよりはゲームロジック自体の処理が速くなった(後述)
- なぜ速くなったか
  - 処理が大きく改善した関数において
    - 配列の生成・アクセス、特にメモリブロック上の(連想配列が不要なやつ)としての配列
    - グラブルのルールのために大量のパラメータを配列で管理している、なので配列操作もおおい
    - 7.2でメモリブロック配列付近が改善されたので速くなった
  - apache workerの追加
    - というか高速化のためにworkerめっちゃ消費したので増やした的な
- 新たなボトルネック
  - 瞬間的なリクエストがDBに
    - 負荷分散で鎮火
---
# WAFの過去・現在・未来(クラウドのセキュリティの前座)
- WAF(web application firewall)
  - 商用wafはホワイトリスト方式
    - 自分で設定するので漏れ出すと終わる
- 第一世代 : ブラックリスト時代
  - sqlのWHEREとか検知して弾く
    - クソ
- 第二世代 : 誤入力と攻撃の見分けができない
  - 変な文字列入れたらやばいalertが
- 第三世代 : よくわからん
- 現在 : 再びブラックリストらしい
  - コンテナ型のWAF
# 本題
## WAF
- ファイアウォールと重ねがけする
## 今までのWAF
- アプライアンス型
- SaaS型
- ホスト型
## docker型のWAF
---
# Laravel * Clean Architecture
- 実装例の話
- clean architecture自体は疎結合にするとこしようねみたいな話
## 具体的な実装方法
- adapterとdomainに分離
  - domain : ビジネスロジックの表現のために諸々独自にやってるぽい
    - UseCaseInput : ドメイン層におけるUseCaseの入力
    - UseCaseOut : ドメイン層におけるUseCaseの返り値
      - 教科書的な実装ではUseCase自体は返り値void
  - Adapter : データストアをドメインに、ドメインをデータストアにするMapper
  - あとはスライドみましょう
## 開発中の現場のinside
## 所感
むずかった　わかんね
