3/21 - 3/23 に開催されたPHPerKaigi 2025に参加しました。今回当日聞いたセッションや、コードバトル含む各種企画の感想を簡単に書きます。
参加までの経緯
あすみ におすすめされたのと、私自身 長谷川さん の主催するカンファレンス (PHPerKaigi or iOSDC) に興味があったのでちょうど良い機会と思って今回初めて参加しました。特に開催日数が複数日に渡る (前夜祭+2日) というのがお祭り感が高そうで期待していました。
実は元々 3/21 (金) は仕事をして土日だけ参加を検討していましたが、プレイベントの「PHPerコードバトル予選」にて思いがけず勝ち抜いたので、せっかくだから前夜祭から参加しようと決めました。
PHPerKaigi 2025 PHPerコードバトル予選に参加しました #phperkaigi | stenyan.dev
印象に残ったセッションやLT
Day 0 はずっとPHPerコードバトルに参戦中でしたのでセッションをリアルタイムでは聴けませんでしたが、Day 1とDay 2はいくつか聴講することができました。
BCMathを高速化した一部始終をC言語でガチ目に解説する
巨大な桁数の計算を行うための拡張モジュールBCMathをどのようにして高速化したかという話でした。普段業務でこのレベルでコンピューターに近いレイヤーで計算を高速化しないといけないという状況になったことはなかったので興味深かったです。
- 不要な計算を省く
- 並列で処理する
- メモリ確保の回数を減らす
- ヒープよりもスタック領域の利用を優先する
みたいなことを言ってるところはなんとなく理解できましたが、じゃあ実際割り算とかの高速化においてこうしましたみたいなところは全然理解が追いつかなくて面白かったです (?)
しかしこの部分はものすごく混みいってるらしく、がっつりとコメントに説明を書いてくれていることはとてもありがたいなと思いました 👀
私の愛したLaravel 〜レールを超えたその先へ〜
発表は主にLaravelの話でしたが、全体の方向性としては一言で言えば「郷に入っては郷に従え」的なことだと感じました。 Laravelのフレームワークを使いつつ他の見聞きしたプラクティスを中途半端に取り入れようとすると破綻する可能性があるので、デフォルトの状態で足りなければ「Laravelの仕組みで」「Laravelを拡張して」使おうみたいなことだと理解しました。
たしかに、フルスタックなフレームワークとしての思想にがっつり乗っかれば最高速で開発できそうだし、がっつり乗っかるつもりがもとよりないのなら、フルスタックではないものを選ぶのがいいのかなという気持ちになりました。何はともあれ利用するライブラリの意図や思想をちゃんと理解することが大事そうという気持ちになれてよかったです。
プロダクトコードとOSSに学ぶ例外処理の選択肢 — キャッチするのか、投げっぱなしにするのか
例外処理について元々自分は特別強い感情はなくて、どちらかというとあまり好きではないかもくらいの気持ちでした。特にtry-catchブロックを使うような書き方については可読性はあまりよくない気がするし、多用したくない気持ちが若干ありました。
この発表でもそこからスタートした上で、「技術的例外」と「ビジネス例外」という分類や、特性の違ういくつかのPHP製のライブラリの中での例外処理の使い方の違いを紹介されていました。「例外」というトピックや様々なPHP製ライブラリの中でどのようにしてこの例外の仕組みを活用しているかについて深く考えたことはなかったのでとても興味深かったです。
何より発表そのものがこなれてきていて聴衆を引き込むことに長けているな〜と感じました。
関係ないですがPHPで書かれたコードの見た目がパッとみPerlっぽいので何となく普通に読める感じがして面白いですね。
PHPで作るPHP~セルフホストできる言語処理系を作ろう~
https://blog.nsfisis.dev/slides/2025-03-23/phperkaigi-2025/
PHPのコードの字句解析や構文解析をある程度自力で書いて処理系を作るお話でした。
こういった話自体は以前より目にしたりしてきたので概要は知っているつもりではありましたが、こうしてとても丁寧に解説されている発表は見たことなかったのでとてもよかったです。何より「PHPで書くこと」のメリットとして「PHPに組み込みで用意されている関数を使える」というところが、一定のハードルを下げて実装することができるという点では目新しさがあり参考になりました。
とはいえ最終的にこれを完成させるには「根気」が大事というオチまでついていてとてもよかったです。
List とは何か?
PHPの配列は実態としては連想配列であることは何となく最近察していたのですが、「キーが0から始まる連続した整数を持った配列」のことを「リスト」と呼ぶという定義を示してくれたのがシンプルに「なるほどね」となってよかったです。
また、 array_is_list
という関数を足すというRFCが提案されたことも他言語ではこういうこと見たことなかったので興味深かったです。
AUTO_INCREMENTのIDカラムがオーバーフローしたらどうなるの?実例から学ぶDB設計の注意点
AUTO_INCREMENT
を利用したカラムがオーバーフローする、ということに遭遇したことなかったのでシンプルに面白かったです。
個人的にはUUIDやULIDを使っているのでこんな心配はないですが、リアルな事例を聞くとやはり AUTO_INCREMENT
を何も考えずに使うのは避けたい気持ちになってよかったです。
印象に残った企画
PHPerKaigiならではな企画も沢山ありとても充実していました。これらの企画についても簡単に感想を書きます。
パンフレット記事
PHPerKaigi 2025 ではなんと95ページのパンフレットが用意されていました。中身としては各種企画の紹介とタイムテーブルやセッションの概要、スポンサーの紹介が半分くらいでした。 で残りの半分があらかじめプロポーザル募集されていたパンフレット記事寄稿によるもので、ちょっとした技術同人誌のような内容になっていて面白かったです。
PHPerKaigiのプロポーザル募集時に登壇のほかにパンフレット記事を執筆するという選択肢があるのがシンプルに面白いし、こうして一冊の本としてまとめられるのは素敵だと思いました。 ちなみにあすみによる「2024年PHP系カンファレンス総まとめ!各地域の魅力を語ります」という特集は私もレビューに関わったりしました。手書きのイラストが可愛いので是非見てほしいです。
PHPerコードバトル
以前予選に参加して通過したPHPerコードバトルですが、その後開催された「オンライン予選」の問題も解いてみたのと、前夜祭中に開催された本選にも参加しました。結果はなんと2位になりました!がしかし、優勝者とは大きな開きを感じられて精進が足りないなと実感しました。
オンライン予選の問題は「じゃんけん」の問題に結構時間をかけて臨んだのですが、16人中7位という結果でした。この問題はわりと「コードゴルフっぽい」回答をすることができた実感はありましたが制限時間が実質無制限の場合はさすがに突き詰めることができなかったなと感じました。
このじゃんけんの問題は簡単に説明すると、「プレイヤー1,プレイヤー2」のようなCSV形式の入力を受け取った後に「グー,パー」のようなこれまたCSV形式の手の内容を受け取り、「プレイヤー1さん ✊ vs プレイヤー2さん ✋ =>プレイヤー2の勝ち」を出力するということをやる必要がありました。ポイントとしては以下の2点があったように思います。
- じゃんけんの勝敗ロジックの簡略化 (modを利用するとシンプルに書ける)
- 「グー」のような入力をどうにかして「✊」という絵文字に変換して表示できるようにする
最終的な私の回答は以下のようになりました。
<?php
$z = ["✋", "✌", "✊"];
$f = fn($t) => max(0, mb_ord($t) % 9 - 6);
[$p, $q] = fgetcsv(STDIN);
while ([$r, $s] = fgetcsv(STDIN))
echo $p . "さん {$z[$a =$f($r)]} vs {$q}さん {$z[$b =$f($s)]} => " . ["あいこ
", $p . "の勝ち
", $q . "の勝ち
"][($a - $b + 3) % 3]?>
元々は [ "グー" => "✊", "チョキ" => "✌", "パー" => "✋"]
という連想配列を作って使うようにしてみていましたが、どうしても "チョキ"
のような文字列をいちいち書いているのが文字数的に勿体無く感じられてそこを削ることを考えました。Unicodeのコードポイントを取得しつつ、そこから無理やり配列の添字 (0~2) に変換するという謎のコードを生成することに成功しましたが、上位陣にはこれでも届きませんでした。
他のメンバーのコードも公開されていたので見ていたら結構アプローチが様々で興味深かったです。
この調子であっても決勝に勝ち進めたのはやはり「15分で解く」という制約があったためだと感じました。私は以下のようなステップを踏んでポイントを稼ぐというのを繰り返すことでなんとか勝ち進めました。
- 変数名を全て1文字にする
- 改行の出力を実際の改行と置き換える
- 関数定義をやめてインラインに書く
(int)
やintval
のようなものは省略するecho
時の文字列結合などで不要なものは排除- 不要な初期化は省略する
- 繰り返し使われている長い関数名は変数に代入して使い回す
- ifやfor文の
{}
を省略できるようにする
上記のようなことを最初に黙々と対応したのちに、さあじゃあ何ができる?ということをやっていたことが功を奏しました。
コードゴルフにこれまでまともに参加したことがなかったですが、今回この企画のおかげで楽しく参加できてよかったです。ありがとうございました。
PHPerチャレンジ
「PHPerチャレンジ」という企画が例年あるようで、今回も開催されました。これは「PHPerトークン」と呼ばれるハッシュから始まる文字列をあらゆるソース (PHPerKaigiやスポンサーのWebサイトや記事、ノベルティ、会場など) から見つけ出してforteeの専用の画面に入力して点数を競うという企画です。
今回PHPerKaigiに初参加だったので、この企画も初めて参加しましたが最終日迎える頃にはあらゆる場所でハッシュタグを探す目になっていて面白かったです。イベントが終わった頃に一覧が公開されましたがどうやら合計96個のトークンが存在していてそのうち76個を見つけることができたようでした。
PHPerチャレンジとりあえず26,650点で終了した #phperkaigi pic.twitter.com/ZIxoLbnUK5
— すてにゃん (@stefafafan) March 23, 2025
トークン一覧が公開されていたのでみたところ、76/96個ゲットしたらしい.. #phperkaigihttps://t.co/8a1fQVePuD
— すてにゃん (@stefafafan) March 24, 2025
トークンがそれぞれ100~500点の点数が割り当てられていて、1000点ごとに抽選の権利を得られるという仕組みでした。今回スポンサースタンプラリーも回っていたので、スタンプラリー分の12回と、PHPerチャレンジ分の26回で合計38回抽選を行うことができました。結果としてはそのうち2回が当たりで思いの外当選率は低かったですが、PHPerチャレンジをやっていなかったらもしかしたら一つも当たらず終わっていたかもしれないのでよかったです。
PHPerトークンの中で興味深かったものとしては、パンフレットの中の寄稿記事中にふいに出てくるハッシュタグ始まりの文字列 (例えば #1
とか #[ApiResource]
とか) も対象だったことや、名札の 「#」から始まる文字列
のうち #」から始まる文字列
も対象だったことです。後者は記入しそびれたので地味に悔しかったです。
このPHPerチャレンジを本気でやることでどうしてもスポンサー企業のサイトやブースやノベルティを真剣に確認することになるので、参加者として楽しいのと別に、参加してるスポンサーや運営としてもメリットが大きいのかなと思いました。今回少し残念に感じたのはコードバトルとかとは違ってそんなに参加者同士のスコアを競うみたいなのはなかったので、「自分は結構真剣にがんばってるけどみんなはどうなんだろう」という感じになってしまったところはありました。とはいえコミュニケーションのきっかけにはなったのでよかったです。
楽しかった
総じて色々とコンテンツ盛りだくさんで楽しかったです。特に個人としてはコードゴルフやPHPerチャレンジのような、「セッションを聴く以外の楽しみ方」を味わえたのがよかったです。