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
43
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
100
phina.jsで弾幕シューティングを作る / Creating a bullet-hell shooter with phina.js
hyuyukun
0
320
ピアノ経験ゼロからピアノを練習して弾いてみた / 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
160
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
380
世界観を考察するのが好き?Sound Horizonはいいぞ / Introduction to Sound Horizon
hyuyukun
0
1.1k
Other Decks in Technology
See All in Technology
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
510
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
140
LLMに渡さなかった仕事
nanaism
0
1.3k
What the customer really needed
kawaguti
PRO
3
220
顧客に向き合う開発組織へ。リアーキテクチャとフィーチャーチーム化で挑む組織改革
safie
0
2.3k
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
2
1.5k
ユーザー価値を届け続けるためにウォンテッドリーが大切にしている文化
kotaminato
0
190
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
0
190
C#未経験の僕がAIに読めるコードを書かせるまで
maguroalternative
0
220
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
210
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
5
650
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
370
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
KATA
mclloyd
PRO
35
15k
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
460
Game over? The fight for quality and originality in the time of robots
wayneb77
1
290
The browser strikes back
jonoalderson
0
1.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
GraphQLとの向き合い方2022年版
quramy
50
15k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
400
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
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