Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPカンファレンス振り返りと プロポーザルについて話します / PHP Tech Talk ...
Search
Hiroya-W / yuyukun
August 27, 2026
Technology
12
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPカンファレンス振り返りと プロポーザルについて話します / PHP Tech Talk Night ~ after phpcon 2026
PHP Tech Talk Night ~ after phpcon 2026, 2026/08/27
Hiroya-W / yuyukun
August 27, 2026
More Decks by Hiroya-W / yuyukun
See All by Hiroya-W / yuyukun
PSRにのっかってバックエンドサーバを書く / Write a backend server using PSR
hyuyukun
0
99
phina.jsで弾幕シューティングを作る / Creating a bullet-hell shooter with phina.js
hyuyukun
0
310
ピアノ経験ゼロからピアノを練習して弾いてみた / I practiced and played the piano from zero piano experience.
hyuyukun
1
160
Blenderに入門しました / I started to use Blender
hyuyukun
0
170
気軽にパソコンを吹き飛ばせるようにするために / To initialize your computer easily
hyuyukun
0
110
僕っぽいことを喋るBotをマストドンで育てています / I'm growing a bot on mastodon that talks like me.
hyuyukun
0
150
4年と半年かけてようやくフロントエンドを書けるようになった / It took me 4 years and 6 months to be able to write the frontend
hyuyukun
0
360
Neofetchライクな自己紹介ツールyuyufetchを作った / Created yuyufetch, a Neofetch-like self-introduction tool
hyuyukun
1
370
世界観を考察するのが好き?Sound Horizonはいいぞ / Introduction to Sound Horizon
hyuyukun
0
1.1k
Other Decks in Technology
See All in Technology
みてねにおけるAI-DLC導入活動とAIドリブン開発の現在地/JAWS-UG AI-DLC #2
isaoshimizu
2
320
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
2
1.4k
Cloudflare製品を活用した AIガバナンス実践入門 / AI governance with Cloudflare Service
delta_tech
1
180
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
12
87k
Hub & Spoke 環境のネットワークルーティングを分解してみる
tsuyataku
1
500
[RSJ26] Hierarchy-Aware Multimodal Retrieval-Augmented Generation for Embodied Question Answering
keio_smilab
PRO
1
140
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
0
1.6k
データエンジニアの困りごとをDevinと一緒に解消する
10xinc
2
190
KAEN Company Deck
kaen
PRO
0
220
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
470
Claude Codeの体系的な理解と知識のフック
oikon48
10
6.5k
魔法少女がClaude Codeを監視する / ccportal-deck
noriyukitakei
3
110
Featured
See All Featured
Visualization
eitanlees
152
17k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
830
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
How to Talk to Developers About Accessibility
jct
2
530
Prompt Engineering for Job Search
mfonobong
0
430
Ethics towards AI in product and experience design
skipperchong
2
360
Done Done
chrislema
186
16k
Unsuck your backbone
ammeep
672
58k
Transcript
PHPカンファレンス振り返りと プロポーザルについて話します PHP Tech Talk Night ~ after phpcon 2026
2026/08/27 yuyukun / ピクシブ株式会社 1
ピクシブ株式会社 Pixiv Division / Pixiv Section バックエンドエンジニア / 24卒 PHP
/ Google Cloud / Neovim yuyukun ヤニすう / ヤニねこ / きみ死ぬ / リゼロ 2
アジェンダ • 僕のPHPカンファレンスの振り返り ◦ プロポーザルの紹介と考え方 ◦ ブースにて実施していたライブコーディングの紹介 ◦ 感想 •
残り時間がある限り、今回採択されなかったプロポーザルの話 3
PHPカンファレンスの振り返り 4
僕のPHPカンファレンスの振り返り • 入社してからカンファレンスは 初参加 • カンファレンスにプロポーザルを 初めて投稿した • 当日セッションを聞いた •
企業ブースにて ライブコーディングをした 5
プロポーザル x2(20分x1, 5分x1) 6
プロポーザル その1(20分) 7
プロポーザル その1(20分) / 内容 • pixiv小説には、小説を執筆する にあたって独自の記法によって 章やルビなどを表現することが できる •
バックエンドはこれを正規表現 でパースしていたので、 これを文法定義とそこから 生成されるパーサーで処理 8
プロポーザル その1(20分) / 内容 • フロントエンド向けの パーサーは既に存在する • see: pixiv/pixiv-novel-parser
• TypeScript <> PHP間で共通化 してパーサーを管理するように • 移行してみてよかったこと、 大変だったこと 9
プロポーザル その2 10
プロポーザル その2(5分) / 内容 • PSR-14: EventDispatcher • これを実装した symfony/event-dispatcher
を 読んでみよう、という話 • コード自体は300行程度と シンプル。キューではなく 多次元配列での管理 11
僕のプロポーザル内容の考え方 • 普段の業務から ◦ 関わっているプロダクトの最近リリースした機能のPHPや技術 まわりの内容 ◦ 自分はプロダクトの話も好きなので、これがあるとどういった機能 が実現できて嬉しいのか、とか、実際にここで使われてます、 みたいな話ができるので自分も話してて楽しい
12
僕のプロポーザル内容の考え方 • なんとなく使っているライブラリやコードを丁寧に追う話 ◦ 使う分には、それがどういった機能を提供しているのかを知って いれば良い ◦ 一方で、中の実装を知っていると、よりコードの挙動を 想像できてトラブルシューティング時に活用できるかも ◦
設計例として自分の知識にもなる 13
本命 14
今回は採択されなかったのでここでお 話させてください 🙏 15
当日のpixivブースのライブコーディング • といいつつ、AIになおさせていたが...。 • メインの成果物 • pixiv小説記法パーサーが出力したASTのデモ • 小説本文のリアルタイムプレビュー(pixivにも欲しい...) 16
小説本文のリアルタイムプレビュー 17
プレビューの実装 (index.php) • JavaScriptからは入力イベントで /api/render.php にPOST 18
プレビューの実装 (api/render.php) • JavaScriptからは入力イベントで /api/render.php にPOST • PHPからは入力テキストから HTMLの文字列を構成して返す 19
プレビューの実装 (Renderer/HtmlRenderer.php) • JavaScriptからは入力イベントで /api/render.php にPOST • PHPからは入力テキストから HTMLの文字列を構成して返す •
PHPカンファレンスなのでHTML の組み立てをPHPで 20
プレビューの実装 (api/render.php) • JavaScriptからは入力イベントで /api/render.php にPOST • PHPからは入力テキストから HTMLの文字列を構成して返す •
PHPカンファレンスなのでHTML の組み立てをPHPで 21
pixiv小説記法パーサーが出力した ASTのデモ 22
PHPカンファレンス 2026 現地参加してみて • 1日、あっという間でした...! • ブースでお話しする時間も多く楽しいものだったんですが、その合間に セッションを聞いたり、他の企業ブースでお話を聞いたりしようとすると 時間が足りない •
PHP 8.6のこと、AIまわりの活用方法、JITとOPCacheの計測の お話が個人的に印象に残っています ◦ AI活用...個人的にも気になるトピックなので次はAIの話をしたい 23
残りの時間はプロポーザルの話 24
プロポーザル その1(20分) 25
pixiv小説で小説本文情報を扱う場所 • HTML Metaタグ • リンク共有時のOGP画像 ◦ タグを除去したテキスト 部分のみの抽出 26
pixiv小説で小説本文情報を扱う場所 • 画像メーカー • pixivFACTORYでつくる ◦ PHPで画像のレンダリング、 PDF生成をする必要がある ◦ ノード→文章構造として整理→
組版(レイアウト調整) 27
タグ除去処理の従来の実装 • それぞれのタグを順番に処理 • タグとテキスト部分のマッチに は正規表現を利用 28
タグ除去処理の従来の実装 • チャプターとルビの入れ子 テキストを処理するケース • パーツに分解すれば何を やっているのかまだ読める /\[chapter: \]\n{0,1}/' :
chapterタグ + 改行にマッチ • (?: )* ◦ ?: はグループ化であり、マッチした部分を取り出さな い、ということを明記している。 ◦ [^\[\]]+ ▪ `タグ以外のテキストで構成される部分 ◦ \[\[rb:[^\]]+\]\] ▪ ルビタグで構成される部分 29
タグ除去処理の従来の実装 • チャプターとルビの入れ子 テキストを処理するケース • パーツに分解すれば何を やっているのかまだ読める • 苦しいポイント ◦
チャプター→ルビ、では 上手く処理できない 30
< よさそう ...? 31
破滅的バックトラック • ユーザが [chapter:あいうえおかきくけこ... と書き、最後の ] を書き 忘れたケース 1. 2.
3. 4. あいうえおかきくけこ... 全体で1つの塊として試す ➔ 失敗 あいうえおかきくけ と こ の2つに分けて試す ➔ 失敗 あいうえおかきく と けこ の2つに分けて試す ➔ 失敗 あいうえおかきく と け と こ の3つに分けて試す ➔ 失敗 • 文字数が増えるごとに組み合わせが指数関数的(O(N^2))に増大 してしまう 32
解決策としてはアトミックグループを利用すること • 正規表現で一度マッチしたパターンをバックトラックの対象 から除外することで、不要な組み合わせの総当たり施行を防ぐ 33
< 気がつかなかった ...! 34
バックエンドのパーサー移行開始 35
バックエンドのパーサー移行 • フロントエンド側 ◦ peg.js パーサージェネレータを利用 ◦ 文法定義とパーサーのJavaScriptコードを生成 ◦ →
PHPも同じ文法定義からパーサーを生成できていたい • pegjs/pegjs は最終コミットが7年前 ◦ → 後継の peggy.js が開発され、メンテナンスされている ◦ → JSの代わりにPHPのコードを生成する MarcelBolten/phpeggy を発見!!! 36
peggy.js の文法定義 (一部) 37
peggy.js の文法定義 (PHPによるutilityの定義) 38
peggy.js の文法定義 (一部) 39
TypeScriptとPHPで構文の共通化 • phpeggyのおもしろいところ。コメントでPHP向けを定義する。 40
TypeScriptとPHPで構文の共通化 41
バックエンドのパーサー移行 • JavaScriptのコードをPHPに置き変えて小説本文をパース できることを確認できるPoCが半日程度 ◦ スクリプトを書いて既存の小説作品2700万件に適用したが エラーもなし • パフォーマンスまわり 42
パフォーマンス (参考程度に • 文庫本は大体8〜10万文字 • pixiv小説で投稿できる最大文字数30万文字で、今回の要件では十分 • peggy自体に解析時にキャッシュを効かせるオプションがある 文字数 初期
キャッシュ+最適化 50K 1,051ms 95ms 100K 3,814ms 502ms 300K 30,801ms 989ms 43
パーサーの運用 • 構文ファイルは1つ ◦ JavaScript向け/PHP向けにパーサーを生成するスクリプトを 用意 • それぞれnpmパッケージ/Composerパッケージとして配布、 リポジトリへ取り込み 44
移行してみてどうだったか • バックエンドの既存のタグ処理の仕様ズレがたくさん出てきた ◦ フロントエンド側でもテストを記述してもらい、その差分と正しい 挙動は何か、を定義してまわった ◦ 特にタグの入れ子まわりが.......... • ASTのまま扱うことで良かった反面、実装が大変になった
ところもある 45
例: 改行ごとに文章を分割する • 1文ごと処理したい 46
例: 改行ごとに文章を分割する • 1文ごと処理したい 47
まとめ • 僕のPHPカンファレンスの振り返り ◦ プロポーザルの紹介と考え方 ▪ 普段の業務から好きな話をプロポーザルにする ◦ ブースにて実施していたライブコーディングの紹介 ◦
感想 • プロポーザルの話 ◦ peggy.js を採用してPHPとTypeScriptの文法定義を共通化 して運用してます 48
Fin. 49