うすゆきブログ

はじめてのPHPカンファレンス2022現地参戦

2022年9月28日 2022年9月26日

目次

またしても初参加

PHPerKaigiとPHPカンファレンス沖縄には参加があるものの、PHPカンファレンスは初めてだった。
そして初の現地参加。

大田区産業プラザ

PHPカンファレンスは大田区産業プラザで開催されるのが常らしい。

大田区産業プラザはPHPカンファレンスで埋め尽くされている。
つまりこの空間はPHPerで満たされている。

イチオシ登壇

私が当日拝見した中で、特に良かったものベスト3を先に挙げる。
独断と偏見だし、全部見れていないし、そもそも順位付けできるようなものではないのだが……

1日目

  • フィーチャートグルを使って素早く価値を検証する 早く安全に失敗し学ぶために
  • PHP メモリ管理術
  • Laravel を低速化する技術

2日目

  • SPAセキュリティ超入門
  • 治っていくmbstring ㋿時代の文字化け
  • 【LT】FQDN(ドメイン名)のバリデーションが意外と面倒だった

1日目 9/24

例によってここからは登壇の閲覧備忘録を連ねていく。
正確性に掛ける部分もあるので、実際の内容はここではなくPHPカンファレンス2022本体をご覧することを強くおすすめします。

あくまで備忘録なので、敬語表現ない部分もあり、手書きメモをベースに書き起こしているので情報量の濃淡がとんでもなく激しいです……

17年続くWebサービスを改善する 〜新卒2年目からみるカラーミーショップ〜

https://fortee.jp/phpcon-2022/proposal/6669e288-563e-49c5-be45-3871c730b6ab

新卒2年目の方が発表されておられた。

前半はCoustom Elements導入とFeature Toggleなどの話。
後半はSREのお話。

AWS CDK に魅入られた PHPer がオススメする IaC から入るインフラの話 

https://fortee.jp/phpcon-2022/proposal/66d8d2f7-0c5d-4df0-9fe1-cca5501be520

ちゃちいさんの登壇。PHPerもインフラ理解する必要性あるよねって感じ。

そこでAWS CDKでインフラと触れあおうといった形。
AWS CDKというのはプログラミング言語でインフラ構成を定義できるもので、GoやTSで書けるらしい。Terraformと同じIaC系。なんとPHPには対応していない……

……

……

……

プログラミング言語でサクッと定義できて、インスタンス化してインスタンスを生成みたいなことができて、気軽にクラウド環境整備できるのすごいなと思った。

フィーチャートグルを使って素早く価値を検証する 早く安全に失敗し学ぶために 

https://fortee.jp/phpcon-2022/proposal/3060b6a4-150e-405c-b21a-32623aee4ebb

PHPカンファレンス2022の1日目はフィーチャートグルの話が多かった。
この登壇はとりわけ分かりやすかった。

フィーチャートグルは機能リリースとコードデプロイメントを分離するためのもの!
そしてリリース実験、運用、権限の4つのトグルがある。

フィーチャートグルというものを私自身は正直不要だと思っていた。無駄にif文生やすだけだと思っていたので……

どうやら仮説検証して、その後フィーチャートグルは消すらしい。
あと、仮説検証ではあくまで最低限で、本番実装は改めて作り直すスタイルらしい。

スケールアウト可能なマネージドデータベースサービスTiDB Cloudのご紹介 

https://fortee.jp/phpcon-2022/proposal/c20124c7-3511-4225-b65d-ff49b0e83223

スポンサーセッションなのだが、TiDB Cloudすごいなと感じた。

レプリケーションとかシャーディングとかの事例を見たことがあって、それを解決するまさに銀の弾丸って感じした。

DB側のごちゃごちゃを意識せず、アプリ側はMySQLのノリで使えるのも強いなと思った。

PHPで始めるWeb Assembly 入門

https://fortee.jp/phpcon-2022/proposal/8e0b91bd-4606-4b1f-9ea3-ac133fd78444

最近話題のWASM。Figmaも1PassもTensorFlowも使っているみたい……

JavaScriptみたくブラウザで使うWASMとサーバーサイドで使うWASMは別仕様らしい……

WASMを作るならやはりRustが最強っぽい(Goでもできるけど、現状数値のみの引数になっちゃうらしい)

肝心のPHPに関しては、WASMでPHPをパースして実行、つまりブラウザのみでPHPを動かすことはできるらしい。なんだこの世界……

逆にPHPからWASMを使うことは現状できないっぽい。

PHP メモリ管理術 

https://fortee.jp/phpcon-2022/proposal/be58ddfa-15cb-4938-9868-b56d7ebf1144

めもり~さんによるメモリの話。

よく見る

Allowed memory size of -- bytes exhausted

をどう防ぐかみたいな話で、GC(ガベージコレクション)とか、Zend Memory Managerまで深掘りして解説。

php.iniでのmemory-limitは2の倍数が良いっぽい。(裏側の仕組み的に)

あと循環参照とかするとメモリリークの温床だとか……

変数のライフサイクルを短くすることでGCがしっかり走るようになるらしく、グローバル変数はクリーンなコードという意味だけでなくメモリの観点からもできる限り少ないほうが良いんだなって思った。

続CPUとは何か – ハードウェアエミュレータから見たCPU

https://fortee.jp/phpcon-2022/proposal/c184ec3f-27dd-4e2c-a51c-6b7608b46d2a

PHPerKaigi主催されてた長谷川さんの登壇。

まさかのPHP全く出てこなかった……

Z80のシミュレータを作成する感じなのだけど、実際の回路にRaspberryPi経由でピン繋いでエミュレートするという本格的なもの。

ラッチを使って足りないピン数を補ったり、どのようにして命令を実装するかなどソフトウェアからハードウェアの部分までエミュレータの作り方を知れた。

RFC911*から振り返るHTTPの仕様

https://fortee.jp/phpcon-2022/proposal/b96e9fc6-52a0-4eb2-a8dc-2a890bd0cac6

RFC9113がHTTP2みたいな、感じでRFCのそれぞれに何が書かれているかを知ることができた。

RFC9110のHTTP Semanticではみんな大好きステータスコードがあったり、RFC9111ではみんな大好きスーパーリロードとかで出てくるcache-controlがあったり……

FRC9112で書かれているHTTP1.1のデータ圧縮だったり、RFC9113で書かれているHTTP2のHPACKみたいなの見ると小さい工夫がたくさんあることを知れておもしろい。

Laravel を低速化する技術

https://fortee.jp/phpcon-2022/proposal/1121ac50-2938-4e8d-9701-ce24963c38a8

富所さんの登壇。低速化する方法を学ぶことで、どう高速化するかについて考える。

Laravelは遅くなければならない

富所 亮

何もしなくてもドキュメントどおりに作れば200msで応答できる。

低速化する方法も意外としぶとく堪えつつ、eloquentでwith使わずループの中で呼び出したりすると大きく減る。(というかこれ自分やってるやつじゃん………)

インフラ側とコード側でそれぞれ検証されていて、インフラ側だと

効果なし↓

  • Preload無効化
  • JIT無効化

どちらも効果ありそうなのに無かった。意外な結果に……

効果あり↓

  • OPCache無効化
  • Xdebug有効化

コード側だと

  • Eager Loading(withで取り出せるやつ)無効化→効果絶大
  • Limit句廃止→効果絶大
  • Atttribute Casting悪用→効果絶大

特に最後のが強くて、というのもパッと見て気づきにくい部分なので……

Laravelはちゃんと書けば早いことを知れた。
キャッシュ頑張れば20msも夢じゃないみたい。

そしてLaravelはDebug周りが充実しているので気づきやすい。
というか最悪curlで監視できるよねと言われて確かに……ってなった。

機能劣化はデータ量で顕著に変わってくるので、最初問題なくても後から影響出てくる可能性も全然あるので注意が必要……

2年かけました!大規模サービスをJava製CMSからPHP+Laravelの構成にリプレイスし、運用している話

https://fortee.jp/phpcon-2022/proposal/ab138440-5240-43be-99ed-3680bad17085

クラウドリフトに際して、言語とFWまで変えた話。
AWSの機能を活用するとソースコード自体も削減できたりしてて、環境変わるとソフトウェアの部分も変わるんだなと知れた。

2日目 9/25

急成長3社サービスの開発ストーリー〜継続成長を支える技術と仕組みのお話〜

https://fortee.jp/phpcon-2022/proposal/f30e8c7a-6958-4b62-96ea-31ec4c551480

Makuake, BASE, pixivの3社のトークセッション。

MakuakeFuelPHP
BASECakePHP
pixiv独自FW(PSR)

構成。それぞれ秘伝のタレを使いながら大きなサービスを運営している体制を感じた。

またモノリポジトリにするかどうかみたいなのもあって、たとえばピクシブだと同じDBを使うものは同じリポジトリにしている形。

独自FWを使うことのメリット・デメリットなど聞けたり。

FuelPHPを使っていくの大変だけど、FuelPHPを回収して使うほうがリプレースよりコストが掛からず、あえて現状のままにしているということもある模様。
なかなか難しいなと思った。

3社共通の組織戦略は

  • 事業1サービスを切り口にチーム組成
  • チーム横断型の技術チームを有する
  • フリーランスにも社員同様の権限付与

とのこと。

あといいはなしとしては「コミュニケーションを良くしよとするチームが生産性UPしてる」って話。

オンプレミスからパブリッククラウドへのサービスマイグレーション

https://fortee.jp/phpcon-2022/proposal/cec20ee8-1e8f-4ab7-846a-e1a4ee3f0e1d

天下の楽天グループ株式会社さん。
前半はRakuten Dreamのオンプレミスからパブリッククラウドへの移行。

楽天のサービスでもLaravel Socialiteで認証使ってると知った。

郵便番号検索処理の独自実装はちょっと恐ろしい……

Laravel Debuggerでの開発体験の良さとかとても共感した。

社内ツールが使えないというのは大企業事例なのかなと思った。

後半は楽天競馬の負荷対策の話。
負荷対策を本番と同じ環境用意して検証できるの、さすが大企業って感じした。

一方で競馬の不可としては高負荷が一定続くパターンといきなり高負荷になるパターンがあるらしく、同じリクエスト数でもこの2つで負荷のかかり方違うらしい。

そういう部分まで加味した負荷テストが必要らしい。

少人数チーム開発でのレガシープロダクトとの向き合い方 

https://fortee.jp/phpcon-2022/proposal/987ddd18-3d4d-464f-8e87-a12d98926b1f

2人で開発している中で、既存タスクもやりながらどうリファクタリングしていくかみたいな話。

私の趣味プロダクトと似た風味を僭越ながら感じてしまった。(ファットコントローラー、コメントアウトされたメソッド……)
弊プロダクトかどで日記でもMVCからADRへの移行をしているところなので……

最初にResponderだけ導入したらしく、効果の高いリファクタリングに集中することも大事とのことだった。

この事例ではデプロイ頻度が前年比の倍になっていて、リファクタリングの効果を感じた。

さっぱりPHP 〜 標準関数と文法を極める

https://fortee.jp/phpcon-2022/proposal/826b197e-7aaa-44a4-ba31-eeab38d91e86

tadsanことうさみけんたさんの登壇。

プログラミングは複雑さとの戦い

うさみ けんた

標準関数奥深い。

PHPには拡張モジュールがあるのだが、その中に通常使う標準関数も入っている。

なので拡張モジュールのコア拡張がこれにあたる。

拡張モジュール

  • コア拡張
  • バンドル拡張
  • 外部拡張
  • PECL拡張
  • 他(phpize)

シェル芸でjsonを加工して関数を数えるというなかなかすごいことをされていた。
その結果コア拡張は774個あるらしい。Pythonとかと比べると桁違いに多い。

最近登場したstr_end_withなんかを使うと便利だよって話だったり(古いバージョンでもSymfony Polyfillで使える)、array_multisortよりもusort(宇宙船演算子活用)の方が適切な場面が多い話だったり。
というかarray_multisortは下準備など大変すぎる……

あとPHP、aptとかで入れるとmbstringが別なの辛い。
それに気づかず速さを出し切れていない可能性が自分のサービスでもりそうな気がした……

ネット接続トラブルがありながら、Emacsで全てを解決していた……Emacsは銀の弾丸……

SPAセキュリティ超入門 

https://fortee.jp/phpcon-2022/proposal/934a985e-fc87-4cab-8e13-99ea5b1b5ce1

徳丸本で有名な徳丸先生の登壇。
安全なWebアプリケーションの作り方だと素のPHPだったのだが、今回はバックエンドにLaravel、フロントエンドにReactという構成。

Single Page ApplicationでのXSS攻撃など聞けた。知識としては知っててもうっかりやりかねないなと思った。そして知らなければそれが脆弱性になることも気付けない。

フロントエンドによるバリデーションはユーザー体験変えれてもセキュリティは良くならないので、やっぱりバックエンド側での対策が必要。

特に明らかに分かる認証よりも迂闊にやりかねない認可制御不備怖いなと思った。
これは例えばlocalstorageにidとroleをもたせる場合、ユーザー側でlocalstorageのrole書き換えちゃえば管理者権限になれちゃったり、というかもっと単純に特定のユーザーしか見れないページをURLパラメータいじるだけで他のユーザーでも見れちゃうとか……

認証だけじゃなくて、認可も、というか認可こそしっかりチェックしなきゃなって思った。(個人的には初期の個人開発サービスでやらかした経験ある上、脆弱性診断で実際の企業プロダクトでも割と見つかる事例らしい)

LaravelもReactもデフォルトの対策が堅牢で、下手なことしなければSQLインジェクションもXSS攻撃も大丈夫なんだけど、LaravelだとwhereRaw使うとSQLインジェクションなったり、ReactだとdangerouslySetInnerHTMLでXSSできたり(<script>ではできないが、<img 形式で埋め込むと実行できちゃう)。

特に昨今のSPA普及時代ではXSS攻撃が増えているらしい。

SPAだとインナースクリプトを無効にするContent-Security-Policyを使うと良いらしい。
ただこれは既存プロダクトとかインナースクリプト入りまくりのWordPressとかだと厳しいので、SPA実装時は最初の段階で入れるのが良いとのこと。(X-XSS-Protectionはもう既に全てのブラウザが読まなくなったので、現在はContent-Security-Policyを使うべし)

導入から 10 年、PHP の trait は滅びるべきなのか ーーその適切な使いどころと弱点、将来について

https://fortee.jp/phpcon-2022/proposal/b85ca73f-6383-4485-b2ae-4ec3e0913e72

PHP8.2にtraitの定数を導入された方らしい。しかも締め切り駆動で。
この導入の過程でアンチtraitが大量に居たことがこの登壇のモチベーションとのこと。

5つの基準、規則、原則などオブジェクト指向の書籍に書いてある項目をもとにtraitがどうなのかについてお話されていた。

traitを使う場面としては偶然同じ機能を持つクラスが出てきたときや、自動生成されるクラスにちょっと手動で追加する時に使うと良いとのこと。一般的にはDIを使うのが良さそう。

治っていくmbstring ㋿時代の文字化け

https://fortee.jp/phpcon-2022/proposal/96ddbb63-9f69-4e87-b055-569456c8677d

タイトルに「㋿」入っているの粋だと思った。

文字コードの歴史から遡って、PHP8.1で話題になったmb_convert_encodingの振る舞いの変更経緯について語られていた。
Shift_jisの仕様としては正しいけど、後方互換を壊してて一般的にはそうじゃないみたいな場合に、1人で説得するのが難しいらしく、協力者を募って対処されたらしい……

そもそもshift_jisは最初から違いが生まれていることが事の発端らしく、なかなかカオスな世界だった。

さらにmbstring周りはRFCとは違うプロセスで決まっているらしく、追いにくい問題もあるらしい。

大LT大会

玩具サブスクリプションサービス「トイサブ」とおもちゃのハードウェアBoMを見ていく

https://fortee.jp/phpcon-2022/proposal/9071e8ba-47a6-4bce-9e4f-2281710f64f8

Bill Of Materilal(BOM)についての話。PHPは関係ない

おもちゃの携帯電話に金型を減らす工夫があることを知れた。

Toranaさんは前回のPHPカンファレンス沖縄でもおもちゃ分解系の話をされてて、印象に残っている。

自作したプログラムを Packagist に登録して世界中の PHPer にインストールしてもらおう

https://fortee.jp/phpcon-2022/proposal/2939e399-83dc-421d-bbba-c1a77ebddf8b

packagistでの公開方法について端的にまとめられたLT。

意外と簡単に自作ライブラリを世に放つことができるんですよ……!
個人的にはユーザー名/パッケージ名になっている仕様も良いと思っています。(npmは直でパッケージ名なので)

phpに新しい機能が追加された時にエディタ開発者がやること

https://fortee.jp/phpcon-2022/proposal/262e33e8-a6a3-4036-a7f6-da83ee71c490

たけてぃさんの登壇。Emacs好き具合がわかった。

シンタックスハイライトやLSP、スニペット展開などエディター側のお気持ちを知れた。

LaravelでLIKE句のSQLインジェクション対策をする

https://fortee.jp/phpcon-2022/proposal/e03efe9a-bedc-4ae8-8c60-a159eb8a1db4

20歳の登壇。同い年ですよ……
Like句のインジェクション対策として、macroを用意する方法やクエリスコープを使う方法について紹介されていた。

PHPerが再利用可能な情報提供でオフショア先とコード品質向上に取り組む

https://fortee.jp/phpcon-2022/proposal/2b5ece7b-b09e-474a-8c0e-cce441698953

オフショアという概念を知らなかったのだが、どうやらコードを海外に発注することを指すらしい。

ラクスではベトナムでコードが書かれているとのことで、いかにしてオフショアでコードの品質を保つかというものであった。言語の壁や現地で手に入るドキュメントも考慮する必要があり普段の開発とは違った難しさがあると感じた。

会社にスポンサー提案して、実際に申込するまでのアレコレ

https://fortee.jp/phpcon-2022/proposal/32c245f1-7af6-43f3-a2b2-cf2bb6c00201

企業スポンサーってどうやって行われてるんだろう……って裏側を知れた。

動機が

  • PHPコミュニティへの還元
  • 社内エンジニアの参加促進

でいいはなしだなと思った。

稟議を通したり、採用チームと協力してグッズや資料作ったりと想像以上に多くの人が関わってスポンサーが成り立っていると知ることができた。

背景色を基に見やすい文字色を自動で選択させるために WCAG ガイドラインを使う

https://fortee.jp/phpcon-2022/proposal/12b7cbf9-5826-440d-8732-70eae5848d0c

デザインは感覚じゃない!
ということで、見やすい文字についての話。

WCAGという企画があり、文字と背景が7:1のコントラスト比があると見やすくなる模様。

また、計算式に当てはめるとコントラストの計算で0~0.1あたりは白文字が良くて、0.1~0.3あたりは白でも黒でも見にくくて、0.3~1では黒が見やすいとのことだった。

どのくらい速くなるの?Laravel MixとViteを性能比較してみました!

https://fortee.jp/phpcon-2022/proposal/0e7a9b9e-3e55-48a1-b100-cbffe7cce52a

最近のLaravelではビルドがLaravel mixからviteへ移行したらしい……

Laravel mixとviteは初期状態だと大差ないビルド時間なのに対して、コード量が増えるとviteが圧倒的に早くなることを知れた。

一方できちんと用意したwebpackと比べると

webpack, vite, Laravel mixの順に早くて、まさかのwebpackが早いオチ。

これはviteが出力ファイルを小さくする処理を走らせるからとのこと。
ただHot Module Replacementにおいてはviteが一番早いとのこと。

VSCodeしか使ったことない新卒2年目がPhpStormくんと友達になるためにやったこと

https://fortee.jp/phpcon-2022/proposal/67268d53-66ec-42cb-8878-e6c9af66d8fb

スライドがかわいい感じだった。
VSCodeからPhpStormへの移行で、毎日30分だけPhPstormを使って開発するルールを導入することで異なるエディターに慣れていった過程が紹介されていた。

自分もVSCodeからVimmerへの道を歩もうとしているので30分ルールを導入したい。

Reflection を使いこなして、オブジェクトを型安全にマッピングしよう!

https://fortee.jp/phpcon-2022/proposal/51f66d0e-5bae-4902-bb63-89700407204a

Reflectioの存在を初めて知ったのだが、Reflectionを使うとコードそのものの構造を取得できるらしい。

例えばjsonデータをPHPのクラスに変換するみたいなことができるらしく、自作のなんちゃってライブラリで人海戦術でやっていた生成の部分で導入したいなって思った。

FQDN(ドメイン名)のバリデーションが意外と面倒だった

https://fortee.jp/phpcon-2022/proposal/fbbbf348-e535-4537-896e-ad771e46759b

最後のLTだったのだが、あまりにも素晴らしいLTだった。テンポが良すぎる。

内容としてはドメイン名の入力を受け付けるときにいい感じにバリデーションする方法。

ドメイン名としてあるべき姿を探るためにRFCを読み、php-srcを読むという敬虔なPHPerなのだが、その過程をLTに沿った形でぱっと流しながら見せる手法に感動した。

最後にオチとして”ひさてるさんが何年も前にこの話してた”はPHPerへのウケが良すぎる……

スポンサーブース

スポンサーブースといえど、遊び心があっておもしろい。

巫女さんが居ておみくじやっていたり……遊び心にあふれている。

ノベルティグッズもたくさんいただいた。

イチオシは株式会社メルカリの銭湯とかで使えるタオル。

ちょうど銭湯用のタオルがワンマン運用だったので助かります……

宿泊

カンファレンス前日は学士会館に泊まった。

https://neo.usuyuki.net/gakushikaikan.html

カンファレンス1日目から2日目に掛けてはネットカフェに泊まった。

https://blog.usuyuki.net/stay_at_cyber_cafe

雑記

同い年や年下の方がスタッフやっておられた。危機感……

あとPHPerKaigiやPHPカンファレンス沖縄とはまた違った雰囲気があった。

私はPHPを使った謎技術とかの登壇がめちゃくちゃ好きなのだが、1日目に同伴していた先輩(社会人)は設計とかフィーチャートグルの方に興味を示されていた。
良し悪しとかでなくて、社会人になると興味関心も変わっちゃうのかなって不安になった。

正直、現状カンファレンスの参加モチベーションが「個人開発のPHP製アプリに活かせる知見を得たい」になっている。
社会人になったら参加のモチベーション保てるのかなって不安になりつつある。

やっぱりカンファレンスというのは0→1と50→60を作る場なのかなって思う。
知らない概念を知れるのが楽しくて、知ってるものの応用の仕方や新しい方法を知れるのも学びがある。
あと登壇拝見していて、ユーモアって大事だなと思った。

カンファレンスの現地参加は初めてだったがTwitterでよく見るPHPerさんに会えて嬉しかった。
ただ、距離感難しい。付き合いたての恋人みたいな距離感になりがち……

あと、Cygamesさんのウマ娘を支えるPHPが採択されていなかったのは惜しい……めちゃくちゃ聞きたかった。

備考

このブログは当日寝る前に仕上げることを目標にしたので、”時間被って見れなかったけど見たい登壇”の閲覧はまだ保留。

下記が気になっている。

これから見る予定

—1日目—

フラットなPHPからオブジェクト指向で自動テストのあるPHPへ、そしてフレームワークへ 

https://fortee.jp/phpcon-2022/proposal/ef41a5ba-4efd-4a9f-b6a8-ae456df00541

正規化理論ことはじめ -数学的背景から理解する正規化の初手-

https://fortee.jp/phpcon-2022/proposal/50dc0023-aebc-4aa0-911d-bb32f44538f4

いちユーザーが PHP に新機能を追加するまで – Random Extension 5.x 

https://fortee.jp/phpcon-2022/proposal/c39b64af-506c-4b05-996c-bdb6df21ddc6

PHPで学ぶシステム設計 依存関係のコントロール編 

https://fortee.jp/phpcon-2022/proposal/2a07ae7f-0b02-42d5-a5f3-53d397a7dcfc

OpenAPIで楽に始めるスキーマ駆動開発実践論 

https://fortee.jp/phpcon-2022/proposal/b38372ca-40f7-4030-8d9d-dcc1fafde80f

—2日目—

PHPの今とこれから2022

https://fortee.jp/phpcon-2022/proposal/e67d6f03-ecc5-4fc8-a794-db8097b645af

php_mecabをFFIで再実装してみよう 

https://fortee.jp/phpcon-2022/proposal/e544648f-bccf-4af2-82d4-d183f163be36