Slide 1

Slide 1 text

fortee の改修から振り返る PHPerKaigi 2026 2026/4/2 スパイダープラス Tech Talk (PHPerKaigi 2026 非公式アフターイベント) @muno_92 1

Slide 2

Slide 2 text

自己紹介 スパイダープラス株式会社 Web エンジニア 趣味: カンファレンススタッフ PHPerKaigi 2026 ( コア) PHP カンファレンス小田原2026 ( コア) fortee ( 後述) の開発 2023 年7 月〜 2

Slide 3

Slide 3 text

fortee ( フォルテ) とは カンファレンス運営・参加が便利になるシステム PHPerKaigi 参加者なら一度は使ったはず 2017 年〜 PHPerKaigi 実行委員長 長谷川さんが開発 最近は長谷川さん + 有志で開発 CakePHP 製 https://fortee.jp 3

Slide 4

Slide 4 text

fortee の開発を通して PHPerKaigi 2026 を振り返ります 4

Slide 5

Slide 5 text

お品書き 駆け込み開発編 一括チェックイン Apple ウォレット・Google ウォレットの改修 当日も開発してました編 名札裏のQR が404 に・・・! スピーカーチェックイン状況の一覧表示 5

Slide 6

Slide 6 text

お品書き 駆け込み開発編 一括チェックイン Apple ウォレット・Google ウォレットの改修 当日も開発してました編 名札裏のQR が404 に・・・! スピーカーチェックイン状況の一覧表示 6

Slide 7

Slide 7 text

チェックイン機能 受付するとチェックイン日 時が記録される 時間毎の集計画面が便利 当日:残りの受付数が分 かる 後日:どの時間の受付が 多かったか確認できる 7

Slide 8

Slide 8 text

fortee が落ちているとチェックインできない 後からスタッフが手動チェックインしていた チェックイン日時がずれてしまう 「チェックイン日時 = 手動チェックインを押した時間」になる 単純に手作業でつらい 8

Slide 9

Slide 9 text

PHPerKaigi の場合 受付機のラズパイにチェックイン記録が保存される それを取り込めるようにすれば良い そのままだとPHPerKaigi 専用機能すぎる →汎用的なCSV インポートとして実装した 9

Slide 10

Slide 10 text

当日も活躍 fortee が落ちた時間帯が少しだけあった 若干数ではあったが取り込めた 10

Slide 11

Slide 11 text

お品書き 駆け込み開発編 Apple ウォレット・Google ウォレットの改修 一括チェックイン 当日も開発してました編 名札裏のQR が404 に・・・! スピーカーチェックイン状況の一覧表示 11

Slide 12

Slide 12 text

パスにT シャツサイズを追加したい 今年はT シャツが現地受け渡しだったので 12

Slide 13

Slide 13 text

どう追加する? 「T シャツサイズを追加」だ とPHPerKaigi 2026 専用機 能になってしまう 任意のチケットの入力項目 を1 つパスに表示できるよう にした これでいける! 13

Slide 14

Slide 14 text

どう追加する? 「T シャツサイズを追加」だ とPHPerKaigi 2026 専用機 能になってしまう 任意のチケットの入力項目 を1 つパスに表示できるよう にした これでいける! →駄目だった 14

Slide 15

Slide 15 text

なんと、T シャツサイズは複数種類あった 15

Slide 16

Slide 16 text

どういうこと? fortee のチケット項目は在庫機能も備えている T シャツの種類によって在庫数は違うので項目が分かれている 仕様の確認漏れ・・・ 16

Slide 17

Slide 17 text

仕切り直し 複数項目を紐付けられるようにした 優先順位が高い順に最初にヒットした項目を使う 17

Slide 18

Slide 18 text

表示された ちゃんと動くようになったのはday0 の朝。超駆け込み 18

Slide 19

Slide 19 text

お品書き 当日も開発してました編 名札裏のQR が404 に・・・! 駆け込み開発編 一括チェックイン Apple ウォレット・Google ウォレットの改修 スピーカーチェックイン状況の一覧表示 19

Slide 20

Slide 20 text

当日、SNS をウォッチしていると・・・ 20

Slide 21

Slide 21 text

何が起きていたのか fortee には短縮URL 機能がある 設定した短縮URL のQR コードも自動生成される 21

Slide 22

Slide 22 text

短縮URL のQR 生成機能がバグっていた 短縮パス側に/ を使うと%2F にURL エンコードされてしまった バグ自体は修正されたが、名札は修正前のQR コードで入稿・印刷 されていた 22

Slide 23

Slide 23 text

%2F を含む短縮URL からもアクセスさせたい 23

Slide 24

Slide 24 text

改めてエラーの再現確認 何か違和感が・・・? 24

Slide 25

Slide 25 text

犬じゃない 犬: fortee のエラーページ( に表示されるフリー画像) ( ランダム2 種) 25

Slide 26

Slide 26 text

PHP までリクエストが届いていない Apache のエラーページが出ている = 「ユーザー → Apache → PHP 」のApache の時点で404 が返って いる 26

Slide 27

Slide 27 text

AllowEncodedSlashes パスの区切り文字としてエンコードされた文字列を許可するか 設定値 Off ( デフォルト): 404 を返す On: Apache 側でデコードする NoDecode: デコードせず素通り (2.3.12 以降で使用可) https://httpd.apache.org/docs/2.4/en/mod/core.html#allowencodedsl ashes 27

Slide 28

Slide 28 text

AllowEncodedSlashes とCakePHP 許可する場合、CakePHP 側でデコードしてくれるので On/NoDecode どちらでも良い https://github.com/cakephp/cakephp/blob/3fa3959495ceb63ba 2c517684f7db1d9e9759f4f/src/Routing/Route/Route.php#L47 2 https://github.com/cakephp/cakephp/blob/3fa3959495ceb63ba 2c517684f7db1d9e9759f4f/src/Routing/Route/Route.php#L59 8 28

Slide 29

Slide 29 text

AllowEncodedSlashes とセキュリティ 安全度 Off > NoDecode > On https://httpd.apache.org/docs/2.4/en/mod/core.html#allowencode dslashes 今回はNoDecode を設定 念のため、短縮URL 以外では%2F を弾くように.htaccess を設定した If encoded slashes are needed in path info, use of NoDecode is strongly recommended as a security measure. Allowing slashes to be decoded could potentially allow unsafe paths. “ “ 29

Slide 30

Slide 30 text

無事、QR コードから遷移できるように 30

Slide 31

Slide 31 text

お品書き 当日も開発してました編 スピーカーチェックイン状況の一覧表示 駆け込み開発編 一括チェックイン Apple ウォレット・Google ウォレットの改修 名札裏のQR が404 に・・・! 31

Slide 32

Slide 32 text

カンファレンススタッフあるある スピーカーの人が受付を済ませていないとソワソワする 「この後の発表のxx さん、来た・・・?」 day1 受付担当の人「発表者が受付を通過済みかどうかを、タイムテー ブル形式で表示させたい」 32

Slide 33

Slide 33 text

作った 色々試して、実装完了したのは若干時間が空いたday2 33

Slide 34

Slide 34 text

意図 スタッフ専用の採択トーク一覧に実装した タイムテーブルは既に情報量が多い & カンファレンス会期中に一 般向けページをいじって壊したくない 全チケットのチェックイン状況を表示 スピーカーチケットを識別可能な情報は無いので そもそも、複数日開催のPHPerKaigi において「チェックイン済 = 会場にいる」ではないので情報の粗さは許容した 34

Slide 35

Slide 35 text

まとめ fortee は便利 カンファレンス運営をマジで支えている スタッフの「これ欲しい」で日々進化しています PHPerKaigi 2026 の裏側でこんな事がありました 35

Slide 36

Slide 36 text

ご清聴ありがとうございました 36

Slide 37

Slide 37 text

補足) バグに遭遇したら? Slack 「PHP ユーザーズ ( 日本語) 」のfortee チャンネルまでご報告く ださい 参加用のURL は下記ブログにあります 日本語で PHP の話をする Slack のグループを作ったよ【参加者募 集】 37