Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHPカンファレンス振り返りと プロポーザルについて話します / PHP Tech Talk ...
Search
Hiroya-W / yuyukun
August 27, 2026
Technology
52
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
110
phina.jsで弾幕シューティングを作る / Creating a bullet-hell shooter with phina.js
hyuyukun
0
330
ピアノ経験ゼロからピアノを練習して弾いてみた / I practiced and played the piano from zero piano experience.
hyuyukun
1
170
Blenderに入門しました / I started to use Blender
hyuyukun
0
170
気軽にパソコンを吹き飛ばせるようにするために / To initialize your computer easily
hyuyukun
0
120
僕っぽいことを喋るBotをマストドンで育てています / I'm growing a bot on mastodon that talks like me.
hyuyukun
0
170
4年と半年かけてようやくフロントエンドを書けるようになった / It took me 4 years and 6 months to be able to write the frontend
hyuyukun
0
370
Neofetchライクな自己紹介ツールyuyufetchを作った / Created yuyufetch, a Neofetch-like self-introduction tool
hyuyukun
1
390
世界観を考察するのが好き?Sound Horizonはいいぞ / Introduction to Sound Horizon
hyuyukun
0
1.1k
Other Decks in Technology
See All in Technology
基本から分かる!AWSセキュリティ運用の考え方と任せ方
cmusudakeisuke
1
340
Flutter Widget Previewerで始めるUIプレビューとVRTの自動化
sakusaku3939
0
190
クラウドエージェントの先駆け Devin。今も最先端を走る、他との違い
kinopeee
1
540
今から始めるAWS環境の暗号移行 - ポスト量子時代に備える
sato4mi
0
150
ALBのLCU予約とトラフィックの波によるプロダクト理解 / Understanding ALB LCU and Traffic Spikes
mito201
1
130
re:Inventで、人生は変わったのか? / growth-builders-hub-1-reinvent-2026
mhrtech
2
190
AIコーディングエージェント開発_全体像
happysamurai294
0
150
あなたのDartコードは丸見えかもしれない ~reFlutterで暴くFlutterアプリの中身と多層防御~
zozotech
PRO
0
740
"計画的無茶振り"を通してAIネイティブ世代の新人を育てる
subroh0508
1
140
Flutter Webを「SDK」として配る — 50以上のゲームを支える埋め込みアーキテクチャ
masayukisuda
0
170
"AWSはちょっと苦手"でも大丈夫。AWS Blocks で手軽に作る Flutter のバックエンド #FlutterKaigi
tacck
PRO
0
120
AI秘書と毎日働くのはもう当たり前。開発以外の業務に足りない機能をどう埋める?
minorun365
PRO
4
2.2k
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
A designer walks into a library…
pauljervisheath
211
25k
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
The Language of Interfaces
destraynor
162
27k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
520
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
KATA
mclloyd
PRO
35
16k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
390
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
650
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
560
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