radioc@?

レディオキャットハテナ

【勉強会メモ】PHP Conference Kansai 2018

2018.kphpug.jp

毎年恒例のPHPカンファレンスですが、今回初参加です。PHPは仕事では使ったことがないしあまり詳しくないのですが、今回は弊社のメンバーが登壇するとのことで午後から参加してきました。

チャットディーラーの高速開発を支えるLaravel

坂田晃平さん

speakerdeck.com

10年以上PHPでノンフレームワークで開発してきたチームがLaravelで高速開発

  • メールディーラー
  • チャットディーラー
    • Webチャットシステム(SaaS
    • Laravel使用

言語・フレームワーク

  • PHP 7.1
  • Laravel 5.5
  • Node.js,Express,Socket.IO

開発チーム構成

  • バックエンド(PHP)3名
  • チャット(Node.js)3名
  • 設計〜リリースまで半年(開発は実質2ヶ月)

新サービス立ち上げの課題

  • 短納期
  • レガシーからの脱却

フレームワークを使ってメンテナンス性向上

長期サポートされる条件を検討

  • 使用者数が多く人気がある
  • 活発なコミュニティ
  • LTSを宣言している

Laravel

  • 日本ではCakePHPが多いが世界ではLaravel
  • Googleトレンドでも右肩上がりで上昇
  • LTSに対応(5.1より)

機能性

フレームワーク選定まとめ

Laravelで良かったこと

  • オールインワンでスピード開発に向いていた
  • 標準ライブラリが使いやすい
    • Middleware…HTTPリクエストのフィルタリング
    • DI…タイプヒントするだけでDI
    • バリデーション…バラエティ豊富なバリデーションルール
    • テンプレートエンジン(Blade)…なじみやすいシンタックス
    • バッチ処理…cronレコード1行のみでPHP側に記述
    • マイグレーション…実行・ロールバクが1つのコマンド
    • デバッグ…5.5〜エラーページの情報量が多い
    • ドキュメントが充実、日本語対応

Laravelで困ったこと

  • Blade(SSR)+Vue.jsでの脆弱性
    • Laravel標準の認証画面にXSSの問題
    • Bladle、Vue.jsに限らない
    • {{}}の中身がVue.jsでスクリプトとして認識される
    • "{{"や"}}"の文字の間にMiddlewareで半角空白を挿入
  • Vue.jsは思ったより難しかった
    • jQueryに慣れ親しんだベテランメンバー
    • Vue独特の制約
    • jQueryなどのライブラリとの併用
    • jQuery脳からのパラダイムシフトが必要
    • 学習コストが低いとはいえ勉強は必要
    • 少し複雑なことをする場合はコンポーネント

Q: 実装2ヶ月Laravelの勉強法は?

  • 事前の要件定義や設計の期間2ヶ月で勉強
  • 本や学習サイト

Q: BootstrapやjQueryとVue.jsはどのようなところ?

  • フロントの画面制御の処理はVue.js
  • jQueryはVueでの実装方法がわからなかったり実装が簡単、ライブラリがある場合などに使用
  • それぞれ使いやすいところで使った

Q: LaravelでWebSocketまわりは触っているのか?

  • Laravelから直接は触っていない
  • バックエンドサーバとチャットのサーバは別
  • Laravelはスタッフ側の管理機能

PHPアプリケーションのコンテナ化入門

藤原吉規さん

コンテナが注目されている背景

コンテナの技術

コンテナとは

  • リソース隔離されたプロセス

コンテナの特徴とメリット

  • ゲストOSがリソースを持っていない
    • リソース効率…オーバーヘッドが少ない
    • スピード…起動が早い
    • 柔軟性
    • 可搬性

Dockerの登場

  • OSSプロジェクト
  • Lixnu/Mac/Win対応
  • 豊富な機能を提供…コンテナ単体では実現できない機能

Dockerキーとなるコンポーネント

  • Dockerコンテナ…プロせスとして起動するアプリの実行環境
  • Dockerイメージ…OSやアプリを含むコンテナのテンプレート
  • Dockerレジストリ…Dockerイメージを格納するレジストリ
  • Dockerfile…OSのイメージからアプリまでが動作する環境がコードとして記述されたファイル
  • Dockerクライアント…Docokerを操作

Docker環境の動作イメージ

  • ライブデモ
    • ApachとPHP 7.2を入れたDockerfileをgit cloneしてきて修正→コミットしてpush
    • コードパイプラインでビルド、ステージングで確認して承認し、本番反映

(詳細は省略)

※参考

https://github.com/twingo-b/ecs-demo-php-simple-app https://aws.amazon.com/jp/cloudformation/aws-cloudformation-templates/?nc1=h_ls

コンテナ活用のポイント

  • アプリ開発に考え方の変革が必要
  • 運用を考慮した仕組みが必要
    • 複数ホストでどうコンテナを管理するか
    • どのホスト上でコンテナを可動させるべきか?

AWSコンテナ関連サービス

  • ECS,EKS…コンテナ管理
  • ECR…マネージド型Dockerコンテナレジストリ
  • Fargate…EC2インスタンスの管理不要。計算リソースの使い方を根本的に変える
    • 先月から東京リージョンも利用可能になった

フロントエンドエンジニアが伝えたい最近の事情

大原壯太さん

speakerdeck.com

最近のフロントエンド

  • 登場人物が豊富でツライ世界

JavaScriptの罠

  • 変数の巻き上げ
  • thisの指すものが異なる
  • 型変換の問題 9 + '1'9 - '1' など

罠を回避する環境が整いつつある

  • ES2015のletかconstを使う
  • アロー関数はthisの対象が変更されない
  • FlowType or TypeScriptで型を導入する
  • コールバック地獄→PromiseやAsync/Await
  • class構文
  • Template Literalなどなど

JavaScriptも進化してきている⇒SPA,SSR,BFF

SPA(Single Page Applicatio)

Routingはフロント側で行って必要な情報をAPIで取得

  • 高速なページ遷移
  • UX向上
  • 開発・運用コストが低い

マイナス

  • 学習コスト高い
  • 初回アクセス時のパフォーマンス
  • SEO不安定
  • OGPタグ解析してくれない
    • TwitterやFBはJSを解析してくれない

SSR(Server Side Rendering)

  • 初回アクセスのときだけServer側でRenderingする
  • 初回アクセス以降はSPAとしてクライアント側でレンダリング

↓解消

BFF(Backend for Frontends)

なぜBFFが必要なのか

  • 従来
    • HTMLテンプレート
    • 更新はform
  • SPA
    • ページごとにAjax

⇒1ページ表示するのに何回もAPIを投げるのは無駄が多い

  • ドメイン単位でAPIをわける
  • ページを作る場所とデータを管理する場所を分けたい⇒責務を分ける
  • 疎結合になって責務を分割できる

フロントエンドエンジニアとうまく協業する

APIのエンドポイントとJSONの仕様を決める

Swagger

HerokuでPHPアプリ開発速度を倍にする

岡本充洋さん

HerokuはSalesforceファミリーのサービス

PHPアプリの開発の速度を上げたい

開発スピードを上げるには?

  • サーバーやDB・ビルド環境の構築は自動で行い手間をかけない
  • インフラやランタイム・ミドルウェアの管理ではなくアプリ開発に集中する
  • 頻繁に利用される機能や手法は世の中にあるベストプラクティスを活用する

⇒Herokuは開発者のためのPaaS

Herokuの実行環境

  • Dyno…アプリを動かす
  • Data…データベース
  • Elements…追加機能

Heroku で環境を構築&デプロイするには

  • composerとgitでPHPアプリを開発したらgit pushするだけ
  • ソースコードをpushすればあとはHerokuが全てやってくれる

サポートしているPHP環境

  • 5.6系、7.x系
  • Apache 2.4もしくは Nginx 1.8
  • 各種Extensionにも対応

開発を早めるには

  • Heroku CI…GitHubにあるHerokuアプリを自動テスト
  • Heroku Pipelines…複数のHerokuアプリを管理

HerokuでPHPアプリ開発速度を倍にする(デモ)

後藤さん

(デモは省略)

GAE に PHPアプリを継続的デプロイする

岸田健一郎さん

speakerdeck.com

サンプルコード

github.com

Google App Engine

※参考

www.publickey1.jp

継続的デプロイ

  • 単体/結合テストが自動化されている
  • 何がリリースされるか明確だ
  • インフラなどの構築が自動化されている
  • ブルー・グリーンデプロイの仕組みがある

継続的結合

Container Builder

  • 1日あたり120分まで無料
    • 120分以上は$0.0034/分
  • フルマネージドサービス
  • ビルドトリガーでCI/CDを自動化
  • Dockerコンテナを実行
  • SDKを使うとローカルビルドもできる

Container Registry

  • プライベートDockerレポイトリ
  • 高速なpush/pull
  • 様々なCI/CDツールとの連携も可能
  • Docker V2 Registry API対応
  • ストレージと下りの通信量が課金対象

説明&デモ

  • GAEバージョン管理
    • 1つのプロジェクトにフロントとバックエンドを共存可能
  • 新規プロジェクトの作成と設定
    • Cloud SDK
      • gcloudコマンドツールでGCP上のソースを管理
  • ビルド&デプロイ用イメージの作成 ビルドしてイメージをpush
  • ビルドトリガーの作成
    • GitHubなどにPushするとビルド&デプロイ
    • Dockerイメージを作ってデプロイもできる

※参考資料

qiita.com


ここからLT

ネコとワタシとPHP in 沖縄

ねこにしさん

speakerdeck.com

一人でおうちで作業していてさみしい

そんなあなたに ネコ駆動開発

沖縄で働くメリット

  • 他県に比べて優位性
  • インターネット回線がとおってる
  • たまにフリーのWifiが飛んでる
  • コンビニがある
  • 道に自販機がある
  • 海が近い

勉強会は結構たくさんある

コワーキングスペースもそこそこある

  • イングリッシュガーデン
    • 750円/日でフリードリンク

沖縄でネコ駆動開発いいですよ!

誰かフィクスチャ書いてくれるんなら俺もテスト書くわ

たなかひさてるさん

speakerdeck.com

  • ORMやFWとは独立して冗長な記述を減らしサービスの成長を阻害しないフィクスチャローダを作った話
  • DBのテストのデモ

(高速な発表だったのでメモの詳細は追いつかず…)

※参考

github.com

mixed型なんてけしからんと社内チャットでつぶやいたら炎上した

@kawanamiyuu さん

speakerdeck.com

PHP: rfc:mixed-typehint ⇒けしからん

  • 結局なにも型を指定しないのと一緒では?
  • PHP7でスカラー型(型に対して安全になった)⇒逆光している?

PHPチャットルームが炎上

肯定的意見

  • mixedを推奨したわけではない
  • mixedだから気をつけてという明示
  • 型を指定するハードルが下がって良い
  • レガシーコードでどうしても型を絞れないときにマーキング

⇒熱いものを感じる

まとめ

  • mixedはけしからん
  • 型をちゃんと書きたい
  • レガシーとも向き合う必要がある
  • mixed型1つでいろいろな意見がある

⇒みんな実はPHPが好き

テストを書いたことがないエンジニアがテストを書けるようになるまでやったこと

speakerdeck.com

テストを書けるいろいろなステージがある

そもそもなぜテストを書くのか

  • ちゃんとテストを書いたという自信とストレス軽減

ステージ1:自分のコードにテストを書く

  • 最初にきれいに書こうとしない
  • 迷ったらテストを書く

⇒難しくないことがわかる

ステージ2:テスト観点の網羅を意識する

  • 十分なテストを書こう
  • テストが仕様書になる

ステージ3:既存コードにテストを書く

  • 既存コードの動作を保証する
  • バグなのか仕様なのか⇒現在の動作を保証する
  • テストしやすいコードに改善⇒仕組みを使う

ステージ4:テスト駆動開発を実践してみる

ステージ5:XXX

私のDDD学習ノート「境界の設計は大事」

@kuma_nana さん

www.slideshare.net

  • ドメイン
    • 解決しようとしている問題の領域

境界づけられたコンテキスト

事例

  • 背景:自社サービスで外部のWebAPIログインを利用
  • ログインAPIのレスポンス結果をバリデーション

レガシーな例

  • コントローラークラスにべた書き
  • 複数のドメインの知識があってもつれている

STEP1:サブドメインの抽出

  • バリデーションは使うだけにする
  • バリデーションのモデルが見いだせる
  • バリデーションドメイン(汎用サブドメイン)が見出される

STEP2:ドメインの設計

まとめ


その他のセッションの参考情報

blog.hidenorigoto.com

speakerdeck.com