YYPHP#92「なぜDockerは日本で受け入れられてないのか？」「RiinさんにLTのコツを聞く」「オレオレフレームワークからLaravelに移植する上での悩み」「インターフェースって何？」

これは2019年7月12日に開催したPHPerイベント[YYPHP#92]のイベントレポートです。

[YYPHP#92]: https://yyphp.connpass.com/event/132256/
[YYPHP]: https://yyphp.connpass.com/

[YYPHP]は一言で「PHPerの部室」です。PHPについて、雑に、ゆるく、ワイワイ話し合う集いです。毎回お題を決めずに雑談を出発点にいろいろなことを突発的にやります。集まった人でコードリーディングをすることもあれば、一緒に開発ツールを触ってみたり、フレームワークについての情報交換をすることもあります。開催はほぼ**毎週**、高田馬場にて。

__今回の配信動画__

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">YYPHP生配信はじめました！「なぜDockerは日本で受け入れられてないのか？」「RiinさんにLTのコツを聞く」「オレオレフレームワークからLaravelに移植する上での悩み」「インターフェースって何？」等 <a href="https://t.co/Z2qoJPDXZh">https://t.co/Z2qoJPDXZh</a></p>&mdash; suin❄️TypeScriptが好き (@suin) <a href="https://twitter.com/suin/status/1149633628973830145?ref_src=twsrc%5Etfw">July 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

__過去回の配信動画__

https://www.youtube.com/playlist?list=PLpOeTEye3Bg6PodrLHHC72jWMJYZz8VbG

__前回__ → [YYPHP#91「PHPerの初級・中級・上級の定義とは」「フリーランスの始め方」「詰まったときの切り分け方」「ウォーターフォール型チームを説得してアジャイルを導入したい」「PHP7.4、新しい認証技術、マイクロフロントエンドなど」 - Qiita](https://qiita.com/suin/items/a6b91b4171dc3167ab04)


## 雑談

### オリジナルフレームワークを使っているところからLaravelに移植しようとしている (とし)

社内にLaravelに詳しい人がいない。
どのくらいの期間がかかるのか分からない。

...

* 既存のシステムからLaravelに移植したことあるひといます？
* 個人でWordPressのデータを取り出してLaravelにリプレースしたというのはある。
    * CMSの機能を移植したわけではないが、1週間弱はかかった。
* 画面数とかテーブル数ってどのくらいですか？
    * 物量が多いと全然変わってくる
* あとはどういうふうに移行していくかによる
    * 既存システムを全部すてて、データだけ移行するのか
    * 動かしながら部分的にリプレースしていくのか
* コードベースがどのくらい大きいのか？ 何年かけて作ったものなのか？
* B2CかB2Bによっても戦略が異なってくると思う
* それ系のシステムって移植というより、書き直しが多い気がする
    * 移植はあんまり見たことながない
* 動いているサービスで全く使われていない機能はないか
* 全く同じ機能として作るのか、良くするのか、顧客の要望によって異なる
* 移行したい動機は？
* オレオレフレームワークからCakeに移植することを検討したことがある
    * オレオレフレームワークの使い勝手が悪い部分のうち、新規開発の部分をCakeの機能を使うようにした
        * オレオレフレームワークはORマッパーが使い勝手が悪かったので、CakeORMを取り出してまず使ってみた
* リプレースやるならデグレのチェックどうやるのか気になる
* E2Eテストがないとリプレースが難しい

使っているフレームワークがオブジェクト指向じゃないが、Laravelにしたときにどのくらいインパクトがあるのか？

* テストが無さそうな気がする。
* 手続き型でもちゃんと書かれているなら、そんなでもないと思うが、なかなかそうなってないことが多い。
* Laravelを使えばオブジェクト指向になるわけではない。
    * まずはクラスに慣れるところから始めるといいかも

### LTで気をつけていること(Bulker)

リンさんにLTの練習術聞きたい。(suin)

* ただスライドを読み上げるだけじゃつまらない。
    * スライドとは別に自分がしゃべることは別に用意しておくのが基本。
* スライドをいきなり作り込まない。
    * Markdownで文章を書いて、
        * ハイフン3つを並べてページ区切りをつける。
    * Keynoteなどに移す
        * 画像を加えたり、見栄えを調整したりする
    * 最初からスライドを作り込みすぎると、あとで変更するのが大変になってくる
    * 骨組みを作って、だんだん肉付けしていく。
* スライドは作り込む派？
    * Azusa Colorsを基本として使う + 自分用のカスタマイズ
    * そんなにアニメーションしまくったりとかはしない
        * 費用対効果が良くない
        * 作る手間の割に嬉しくない
        * うっかりアニメーションが発火して寒い感じになってしまうことも……
        * シンプルな方が故障しにくい

Decksetいいよ。markdownがそのままスライドになる → https://www.deckset.com/

* GitPitchを使ってたこともあるが、Keynoteに戻った理由
    * https://gitpitch.com/
    * Markdownだと画像を自由に配置できない
        * Decksetはそのへんできますよ: https://www.deckset.com/
* 練習はしゃべるだけ
    * 時間はちゃんとはかる
    * Keynoteには発表者ノートに時間を表示する機能がある
    * 終わったときに時間を見て尺の調整をする
    * 発表者ノートを読み上げる練習をしている
        * すらすら読み上げられるところまでノートを作り上げる

### プログラミングのインターフェイスって何？ (にしかわ)

前職のときにインターフェイスってあるよとは聞いた。
講師の人に聞いたら「インターフェイスはあんまり使わないから気にしないでいいよ」って言われたが。

* 先にインターフェイスを用意しておくと、それをimplementsする
    * クラスにメソッドの実装を強制できる
* 実装を切り替えたいときに使ったり
    * メール送信の機能をしたいけど
    * テストときはメール
* インターフェイスは中間という意味なので、その中間
    * 入出力の定義をまとめたセット
* インターフェースには動詞がある
    * 結びつける、調和する　といった意味を持つ
    * プロトコルとほぼ同じ意味。約束事
* あとで機能の切り替えを考慮しないプログラムならば、インターフェイスは重要ではないという裏のメッセージかも
    * インターフェイスが必要になってくるのは単体テスト
    * PHPはランタイムなので、Javaと違って結合度が高ければ必要性が低いかも
* PSRとかはLoggerのインターフェイスを定義してて、いろんな実装が出てきてて便利になったり
* interfaceの勉強はJavaのコレクションがおすすすめ
    * LinkedList, ArrayListいろいろなリストがある

### 未読/既読管理を実装するにあたってのベスト・プラクティス・アンチパターン (ゆーきゃん)

お知らせ機能: 管理者がユーザにニュースを出す。ユーザが読んだかどうかを管理する必要がある。


* 管理者がお知らせを発行する
* お知らせはユーザやスタッフに送られる
* ユーザは選択したカテゴリのお知らせを受信する
* メンテナンス情報などがお知らせ
* お知らせを見たか管理しないといけない
* 1件1件既読管理しないといけない

...

```
お知らせテーブル <--- 中間テーブル ---> ユーザの未読既読ステータス
```

...

* 実装方法を気にしているのか、データ量を気にしているのか
    * 新規のユーザーには過去のお知らせを出さない
* 未読既読以外の状態はあるのか
        * 仕様を確認中
* 中間テーブルを作より、既読テーブルだけ作るのが良さそう

### なぜDockerは日本に受け入れられてないのか？ 日本の普及が10%未満らしい (reoring)

* 世界にはFTPでアップロードしている現場がある
* 本番環境で10%くらい
    * 開発のツールで使ってるのはもっと多いと思う
* Docker以外だと仮想マシンをそのまま使うとか？
    * VPS, ECSとか
* Dockerを本番を運用するには、Dockerのために構成を考える必要するがある
* Dockerでデプロイするときの手順て？
    * Swarm、 Kubernatesでデプロイのしかたが違う
    * コンテナはそのまま使える
* コンテナ自体は規格が共通化されてきてる
* データの永続化は難しそう
    * DBのボリュームを分ける
    * EFSとかNFSをつかったり
* 開発環境をDockerにしてないと、本番環境をDockerにすることはなずない
    * 開発環境がWindows 10 Pro の環境がないのではないか？ Win7とかが多そう
* WindowsユーザーにとってDockerはLinuxの知識が敷居が高い
* Windowsはサポートが手厚いかも
* GUIがあるのが初心者に優しいかも
    * C#はLinuxでも動く
* 世界はまだDockerで動いていない


### VSCodeでコマンド 1、2、3でタブを切り替える技を知りたい (とし)

* https://stackoverflow.com/questions/38957302/is-there-a-quick-change-tabs-function-in-visual-studio-code
* https://yyphp.slack.com/archives/C6VM76BUL/p1562929028014900

```json:keybinding.json
  {
    "key": "cmd+1",
    "command": "workbench.action.openEditorAtIndex1"
  },
  {
    "key": "cmd+2",
    "command": "workbench.action.openEditorAtIndex2"
  },
  {
    "key": "cmd+3",
    "command": "workbench.action.openEditorAtIndex3"
  },
  {
    "key": "cmd+4",
    "command": "workbench.action.openEditorAtIndex4"
  },
  {
    "key": "cmd+5",
    "command": "workbench.action.openEditorAtIndex5"
  },
  {
    "key": "cmd+6",
    "command": "workbench.action.openEditorAtIndex6"
  },
  {
    "key": "cmd+7",
    "command": "workbench.action.openEditorAtIndex7"
  },
  {
    "key": "cmd+8",
    "command": "workbench.action.openEditorAtIndex8"
  },
  {
    "key": "cmd+9",
    "command": "workbench.action.openEditorAtIndex9"
  },
```

### NginxとApacheの違い (にしかわ)

違いをおしえて

...

* Apacheでさばけるリクエスト数がきついからNginxができあがった。
* Apacheを1万リクエストが限界(C10K問題)
    * Apacheはリクエストごとにプロセスがある(prefork)
* ApacheはブロッキングIO
    * NginxはノンブロッキングIO
* Apacheのほうが老舗
    * Apacheがさばききれないときはサーバを増やして対応してた
* 重い処理がしたいというよりリクエスト数
* フロントにNginxをおいて、裏でApacheを置く構成もある
    * 今はNginxでいい気がする
    * NginxとFPM
* Nginxが使っているのはepoll(7)
    * Linuxのイベント駆動のシステムコール
* Nginxは一つのプロセスがいくつものリクエストを処理している



# YYPHPは毎週やってます

PHPについてワイワイ話したい方は、[YYPHPのイベント情報](https://yyphp.connpass.com/)をチェックしてみて下さい。

以上、YYPHPのレポートでした。次回もワイワイやっていきたいと思います！ では、また来週！