ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。プログラム&ロボット大好きなポンコツが日々の記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

PHPカンファレンス2019@東京に行ってきたメモ

本日12月1日に大田区産業プラザ(PiO)にて開催で開催されたPHPカンファレンスに行ってきましたので、そのメモを書いておきます。

会場

毎回恒例の大田区産業プラザ(PiO)ですね。 f:id:ponkotsu0605:20191201134140j:plain 毎年来ているので、駅から会場までのルートも覚えちゃいます。 (自分でも覚えられるくらいルートがわかりやすいってのもありますが) f:id:ponkotsu0605:20191201134202j:plain 今年のスペシャルスポンサーはGMOです。 f:id:ponkotsu0605:20191201134314j:plain いつものようにいろいろ資料をもらいます。

セッション

それでは各セッションのメモを書いていきます。

徳丸先生による徳丸試験例題解説とPHP7初級書籍贈呈キャンペーンと市場動向

徳丸先生による、テスト勉強。

  • 世界のWebサイトのうち79%がPHP
  • 求人数は気持ち減ったくらいだけど、全然仕事は多いよ
    • Indeed情報 f:id:ponkotsu0605:20191201134634j:plain
  • 世界のWebサイトの25%がWordPress
    • 重たくなりがちなので、Googleの速度測定ツールで思い判定が出て、順位が下がってしまいがち
    • KUSANAGI
      • WordPress用にチューニングされた無料の超高速実行環境
      • KUSANAGI for wordpressの試験があるよ
        • 1万円で(学割だと半額
  • PHP試験について
    • 累計で6000人くらい受けている
      • 初級:75%くらいの合格率
        • プロジェクトにジョインするときに、言葉が通じることを証明できるみたい
      • 上級試験は難しい
        • 9.8%くらいの合格率
        • これをもっていたらすごいコーディング力をもっているといえる
    • PHP7の問題集があるよ
      • 受験宣言すればもらえる
    • 徳丸試験は2020年春に開始
      • 試験はまだ完成していないけど、LINEスタンプ完成したらしい f:id:ponkotsu0605:20191201134708j:plain
      • ウェブ・セキュリティ基礎試験概要
      • 1万円
      • 1時間で40問。70%正解で合格。 f:id:ponkotsu0605:20191201134737j:plain
  • 例題の紹介
    • 会場でも回答が分散していて、正答率が高くはなかった f:id:ponkotsu0605:20191201134855j:plain
  • 徳丸先生登場!! f:id:ponkotsu0605:20191201134924j:plain f:id:ponkotsu0605:20191201134945j:plain f:id:ponkotsu0605:20191201135007j:plain f:id:ponkotsu0605:20191201135025j:plain f:id:ponkotsu0605:20191201135046j:plain f:id:ponkotsu0605:20191201135103j:plain f:id:ponkotsu0605:20191201135121j:plainf:id:ponkotsu0605:20191201135142j:plain f:id:ponkotsu0605:20191201135158j:plain f:id:ponkotsu0605:20191201135217j:plain

徳丸本をちゃんと読まなきゃって改めて思ったセッションでした。良い勉強になりました!

『グランブルーファンタジー』開発エンジニアの考え方-PHP7が『グラブル』にもたらしたブレイクスルーと考察

グラブルを今年のはじめの頃にPHP5.6から7.2に上げ、その時の対応とかその効果とかを分析してくれているセッション。

f:id:ponkotsu0605:20191201135648j:plain

  • はじめに
    • Cygamesの小松さん
    • グラブルって来年で6周年なのか。
      • LAMP環境
        • Linux Apache MySQL PHP
        • ユーザ吸う:2400万人突破
        • リクエスト数:15億/日
          • Yahooのアクセスと同じくらいの数値感
          • ブラウザゲームなので、よりリクエスト数が多い
            • 操作ごとに通信。3秒に1回とかで1ユーザでもアクセスが多い
          • 負荷がかかりやすいサービス
            • PHPの実力が現れてくるサービスかな
          • ピークで40億/日
          • ピークで28万リクエスト/秒
            • Tiwtterでバルスの書き込みが14万だったので、「バルスの2倍」とおぼえてもらえれば良いよ
  • 大切にしていること
    • 2つの大切な点
      • アクセスが集中しても安定している
        • サーバーダウンを起こさない
      • 快適なレスポンス速度を保つ
    • 2年前のスライド
    • 5年以上の運用
      • PHPクラスが1万を超える
    • それでも必要な対応はやる
      • チームのエンジニアの技術力tお各社各所の協力と
    • 当たり前だけど、大切なこと
      • 最高のコンテンツをつくる
  • 改善活動の例
    • PHP7対応
      • PHP5.6からPHP7.2にあげたときの事例
      • 2018年検討開始
      • 2019年年明け完了
        • ちょうど5.6はサポート終了タイミング
      • バージョンアップは大変
        • 静的解析の実施
          • PHP_CodeSnifferを使ったり
        • エラー対応
          • オーバーライドの引数を揃えないとfatalエラーになる問題とか
        • フレームワークバージョンアップ
          • これが一番たいへんだった
      • ベテランエンジニアたちの活躍
      • 社内の協力
      • 導入の効果
        • 平均レスポンスタイム f:id:ponkotsu0605:20191201190409j:plain f:id:ponkotsu0605:20191201190436j:plain
          • 大幅高速化
            • だいたい半分
        • 平均メモリ使用量 f:id:ponkotsu0605:20191201190504j:plain
          • 半分まで現象
        • CPU使用率
          • 半分
      • どうして速くなったか f:id:ponkotsu0605:20191201190558j:plain f:id:ponkotsu0605:20191201190623j:plainf:id:ponkotsu0605:20191201190639j:plainf:id:ponkotsu0605:20191201190708j:plainf:id:ponkotsu0605:20191201190728j:plain
        • 連想配列・配列処理が多かった
      • ユーザの反応 f:id:ponkotsu0605:20191201190749j:plain
        • 変化に気づいたユーザも
      • 新たなボトルネックの出現 f:id:ponkotsu0605:20191201190816j:plainf:id:ponkotsu0605:20191201190832j:plain
      • 継続的な観測と修正 f:id:ponkotsu0605:20191201190854j:plainf:id:ponkotsu0605:20191201190923j:plain
  • むすび f:id:ponkotsu0605:20191201190950j:plain
  • 質問
    • グラブルで使っているフレームワークはFuelPHP

5ヶ月でカバレッジを20%から90%にした話

f:id:ponkotsu0605:20191201191109j:plain

  • カバレッジをあげることはでアプリケーションの品質と比例することではない
  • Togetterのテストコードのカバレッジをあげる
  • 成果発表 f:id:ponkotsu0605:20191201191148j:plain
    • カンファレンス応募時は全然だめだったけど、無事達成した
      • 応募時は27%くらいだった
      • 実質3ヶ月半くらいであげました
      • 採択されてしまったので頑張った
    • なぜ、カバレッジをあげたかったのか
      • 気軽にコードの修正をしたい
        • クラスたちがカジュアルに依存しあっている
        • フレームワークレイヤの改善をし続けたいが、影響範囲がとても広い
        • 影響範囲がわからず、テスト漏れが発生する可能性があるので、それを防ぐ
      • コードリーディングのコストを下げたい
        • Togetterは10年続いているサービス
          • やっとnamespaceがあるかないかくらいの時期
        • 歴史的経緯のあるコードも当然ある
        • 読んで仕様を理解するのにコストが多くかかる
        • サービスが続けば続くほど、そのコストを支払う人数が多くなる
          • サービス自体はまだまだ伸びているらしい
          • 人件費・貴重な時間がもったいないってことで、読みやすいようにリファクタリングしつつ
    • カバレッジを上げる過程でやったこと
      • ルール・方針決め
        • まずは外側からテストする
          • ブラックボックステストなら、実装の品質を気にせずテストできることが多い
          • カバレッジが稼ぎやすそう
            • 不順な動機
        • リファクタリングは最小限に、テストを書くことを優先する
          • がっつりリファクタリングしていると時間が足りない
          • 設計やリファクタリングは継続して来る返し行っていくもの
          • いきなり完璧を目指すのではなく、一歩ずつ
        • にゃ〜んクラス
          • 理想的なリファクタリングとはほぼ遠いが、現実の都合からいびつな形で妥協せざるをえなかったクラス
          • リファクタリングの家庭では絶対に発生する
          • よくなるための第一歩として受け入れるしかない
            • DIしたいけどとりあえずsetterを作ろうみたいなクラス
      • テスト環境の整備
        • 簡単にテストデータを作る仕組みを用意する
          • 完全コンストラクタなクラスでも、ActiveRecordでも、どちらでも対応できるようにしたい
          • 柔軟に値を組み立てたい
          • 状態の具体的な値を抽象化できるようにしたい f:id:ponkotsu0605:20191201191228j:plain
        • 簡単に結合テストをできる仕組みを用意する
          • 現状だと結合テストが書きにくい
          • フレームワークのライフサイクルごとテストがしたい
          • DIコンテナの定義とかも間接的にテストしたい f:id:ponkotsu0605:20191201191257j:plain
              * レスポンス200のチェックをしていたりするコード例の写真ね
              * laravelのHTTPテストを真似して作った
            
        • テストの実行速度を早くする
          • たくさんテストのPRを出すので、CIはなるべく早く回ってくれたほうが嬉しい
          • pcovでカバレッジを計測
            • xdebugと違い、デバッグ機能がなくカバレッジ計測に特化しているため、圧倒的に速くメモリ消費も少ない
            • 簡単に導入することができますよ f:id:ponkotsu0605:20191201191322j:plain
        • グローバルヘルパーをもっくできるようにしたい
          • isDev(): boolみたいな
          • 条件分岐に使われている
          • ただ、挙動を変えることができない
            • 条件分岐のうち1パターンしかテストできない
            • いたる所で使われているので、全部リファクタリングできない
            • そこで、このサイトを参考にした「PHP-VCR が curl 関数を乗っ取る方法」
          • これはお勧めできないけどね。ご利用は自己責任で。 f:id:ponkotsu0605:20191201191400j:plain
      • やってみてどうだったか
        • かけたコストに見合った成果が出るのかは現時点ではわからない
        • 90%はやりすぎた気がする、それぞれのアプリケーションに合ったカバレッジで十分
          • 登壇駆動開発だったらやってもいいけど、別にやらなくてもいいのかも
        • カバレッジをおいかけるのは微妙
        • ローカルのPHPを7.4にあげてみたら、手動テストでは発見できなさそうなバグを見つけることができた
          • 本当は今日の時点で7.4で動かしておきたかったけど、バグがあったのでできなかった
            • でも、テストのおかげではある。
        • リファクタリングをする土台が出来上がったところなので、むしろここからがスタート
          • Togetterはフレームワークを使ってない

「CPUとは何か」をPHPで考える

f:id:ponkotsu0605:20191201191440j:plain

  • 前座
    • デジタル回路について
      • 0と1について f:id:ponkotsu0605:20191201191515j:plain
  • 自己紹介
    • PHPerKaigiのトーク募集は明日までだよ
  • 題材CPU
    • TD4
    • CPUの作り方という名著 f:id:ponkotsu0605:20191201191610j:plain
  • CPUの視点
    • プログラム実行環境
      • マシン語プログラムの実行環境
      • /usr/bin/php = マシン語プログラム
      • C言語→ニーモニック→マシン語
      • 4ビットの命令(オペコード)+4ビットの引数(オペランド)
      • 1命令=1尾後
      • 命令をメモリに格納された順番に実行
      • プログラムを実行してくれる存在
      • 自分の使う機能のみの理解でOK
        • すべての命令、仕様をしる必要はない
    • エミュレート対象
    • 電気回路
  • ハードウェアよりな話
    • 長谷川智希さんらしい内容で個人的にはよかった
  • まとめ
    • CPUといってもどんな立場でそれを見るかによって見え方が違う
    • エミュレータは難しいものではないね!
    • CPU自作も面白いよ

オニギリペイのセキュリティ事故に学ぶ安全なサービスの構築法

徳丸先生

f:id:ponkotsu0605:20191201191706j:plain

www.slideshare.net

  • オニギリペイという架空のものを事例にあげて紹介 f:id:ponkotsu0605:20191201191740j:plain
  • オニギリペイについて
    • 架空のQRコード決済
      • RFP
    • セキュリティ要件
  • 試練1
    • キャンペーンの懸賞について
      • 総付景品は取引金額の20%まで
  • 試練2
  • 試練3
    • 2段階認証をしても不正ログインが止まらない
    • 対策例
      • セッション変数を追加
        • 未ログイン
        • 二段階認証待ち
        • ログイン済み
  • 試練4
    • パスワード発行から通達まではすべてシステム化したほうがいいね
  • 試練5
    • 平文で端末に保存しているのは問題
    • パスワードは、iOSだとKeyChain、AndroidだとKeyStoreに格納
  • 試練6
    • リジェクトの警告のメール
      • iOSアプリ上にAndroid版バージョンアップのお知らせを載せてはいけない
      • 実際にリジェクトされるかわからないが、よくはないよね。
    • お知らせを差し替えて再申請する
  • 試練7
    • コマンド実行時に変数のエスケープ処理をする
    • escapeshellarg関数よりOSコマンド用のエスケープ
    • PHP7.4にて、proc_openに新機能が追加されている
  • 試練8
  • オニギリペイがサービス終了してしまったが、どうすべきだったのか
    • スライドにいろいろ書いてあるので、そちらを参考にしましょう
    • ベースは徳丸本に書いてある通りにやっておこう
    • 金融・支払いが関わってくるものは特に気をつけて実装しないといけないですね
    • アジャイル開発でのセキュリティ
      • イテレーションの外で決めるべきものは決めておこう
      • 中と外はしっかり分ける

LT

Laravel + Nuxt.js + FirebaseでDXと開発コストを意識したSPA開発

  • ビーチ駆動開発(BDD)の人
  • DXを高めた開発
    • 気持ちに余裕ができて品質が上がるらしい
  • Twitterで募集してメンバーを集めた
    • フリーランスに仕事を依頼
    • リモートワーク
  • slackの分報
  • スクラム開発
  • wrikeの導入

SwooleとWebpで遅いページを高速化する

発表なし

PHPでgRPCってどこまでいけるの?

  • gRPC
  • 結論:まだはやかった

PHP-CS-FixerをIDEに取り込ませてPSRを強制する開発スタイル

https://gitpitch.com/sogaoh/myslide?p=20191201-phpcon2019-LT#/ * コーディング規約チェック+自動修正ツール * 設定ファイルにルールを記述 * 除外対象も設定できる * 設定を書くのがちょっと大変らしい * コマンド一発で自動修正する * IDE * PhpStormでも導入できる

レガシーコードでビジュアルリグレッションテストをやってみた

  • ビジュアルリグレッションテストはスクリーンショットを撮影して前後の差分をチェックする仕組みらしい
  • https://tech.dely.jp/entry/vis_reg_test
  • BackstopJS

PHP on AWS Lambda!

  • Lambdaなのでスケールするよ
  • 金額気をつけてね
  • 初回アクセス時は遅い
    • イメージをもってきてコンテナに展開するので
  • スケールが必要なもの(Webサーバのようなもの)だったら、いいかも

2年目エンジニアがスキルアップのためにPHPで競プロやってみた

  • 結論をタイトルにもってきた
  • 元沖縄高専生
  • しっかりエキサイトの宣伝をしている
  • AtCoderを使ってチャレンジ
  • PHPで競技プログラミングはあまりやってなさそう!だから極めたらプロになれるかも

設計文化のないチームに文化を広めたが冴えない一手で混沌を招いた話を聞いてほしい

  • 失敗談
  • 説明をサボらない

運用経験ばかりのメンバーと新規開発で初めてしっかりと設計から開発までを経験した話

  • またエキサイト
  • cocorusというサービス
  • 事前に全APIのモックの開発をしておく
  • わからないことがあったら、都度チームメンバーで議論して納得して開発を勧めた
  • わからないところはわからない

エンジニアがブログや登壇で、アウトプットするとどうなる?

  • ブログの人になって、人生が変わりました
  • ブログ2年連続書いている
  • ブログを書いて、自信がついた、実績がついた
  • 記事に対して、FBがもらえる。自信がつく
  • 自信がついて、登壇するようになった
  • https://twitter.com/nyamucoro

余裕を生み出すコードレビュー

  • レビューを出すとき
    • 変更の意図
      • 目的、背景、やったこと、関連リンク
        • 文章は簡潔に
    • 変更内容がわかりやすく
      • 1つのプルリクでは1つの変更
    • 確認してほしいことをチェックボックスにしておく
  • レビュイーのひと手間でより良くなる

社内最長老のシステムにPHPUnitで立ち向かう方法

開発合宿のススメ!

  • パソコンを使わない
    • 考えを言い合える
    • コミュニケーション重視
    • 対話に集中
  • おさえておくこと
    • 合宿のゴールは決めておく
    • なんかやろうとなったときに、実行者まで決めておく
  • 特別な場なので、外部講師を呼んでもいいのかも
    • 前回はそうだいさんを呼んだらしい

おまけ

セッションの合間に会場の1Fの隣にあるカフェで休憩しました。 f:id:ponkotsu0605:20191201190029j:plain PHPカンファレンスも20回目ということで、PHPの象のぬいぐるみのelePHPantくんもちゃんと購入しました! 後輩くんの分もあるので2つなのですが、片方の目がおかしな向きを向いている。。レアものや!!

このレアものは自分のものにして、ちゃんとしてそうな方を後輩くんに渡そう。(逆に目が逆に見えるのが正常なのか?)

さいごに

20回目の今年も無事行ってこれました。 f:id:ponkotsu0605:20191201192059j:plain 来年2020年は東京オリンピックとかの影響で10月11日開催予定だそうです。 f:id:ponkotsu0605:20191201192147j:plain やはり、会場がコンパクトなので、他のカンファレンスと比べても各セッションブースとかまでの移動がとても楽ですね。 f:id:ponkotsu0605:20191201192239j:plain 最後に京急蒲田駅の前でpixel 4で写真撮影!