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
[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎ...
Search
Z.O.E.
March 20, 2026
Programming
500
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見
https://fortee.jp/phperkaigi-2026/proposal/891691c2-bf28-44a1-a5ea-36844bf63888
Z.O.E.
March 20, 2026
More Decks by Z.O.E.
See All by Z.O.E.
[PHPカンファレンス2024]【ISUCONでも使える!?】お手軽にパフォーマンス改善入門 〜MySQL Performance Schema編〜
ikezoemakoto
1
1.1k
[PHPカンファレンス沖縄2024]「無理なくできるだけ安全に」テストもないレガシーコードをリファクタリングするテクニック
ikezoemakoto
4
780
[Developers Summit 2024 Summer]良いプロダクト作りのための組織育成 ~1on1完全攻略編~
ikezoemakoto
8
4.4k
【ぺちこん小田原2024懇親会LT】新卒教育できる組織を育成するためにしてきたこと(公開用)
ikezoemakoto
4
290
[Developers Summit 2024]良いプロダクト作りのための組織育成(理論&実践編) 健全なコードは健全な組織、健全なチームから
ikezoemakoto
18
12k
[PHPカンファレンス北海道2024 全然野菜]PHPとLaravelで使える ジェネレータを使った大量データ処理のパフォーマンス改善
ikezoemakoto
0
190
[PHPカンファレンス2023]NFCネームプレートを自作して楽しく交流しよう!
ikezoemakoto
0
910
[PHPカンファレンス沖縄2023]【実践編】良いプロダクト作りのための組織育成 健全なコードは健全な組織、健全なチームから
ikezoemakoto
3
1.7k
良いプロダクト作りのための組織育成 健全なコードは、 健全な組織・健全なチームから
ikezoemakoto
9
7.3k
Other Decks in Programming
See All in Programming
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
190
スマート反転とウェブアクセシビリティ
camiha
0
210
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
160
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
340
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
290
FreeBSDでZabbixを動かす
kenkino
0
320
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
5
12k
アクセシビリティから考える情報設計
high_g_engineer
0
400
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
280
Java 27新機能 / Java 27 new features
kishida
2
170
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
440
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
520
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
550
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
The untapped power of vector embeddings
frankvandijk
2
1.9k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
420
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Skip the Path - Find Your Career Trail
mkilby
1
240
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
540
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
420
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
Transcript
X(旧twitter): @for__3 #phperkaigi #b 社内で 内製して半年運営 して得た 内製と 運営の 知⾒
2026/03/20 PHPerKaigi 2026 @zoe 1 PHPerKaigi2025の企画 CodeGolfが最⾼すぎて
X(旧twitter): @for__3 #phperkaigi #b PHPerKaigi 2026 楽しんでますかー!? 2
X(旧twitter): @for__3 #phperkaigi #b PHPerKaigi 2026 コードバトル 楽しんでますかー!? 3
X(旧twitter): @for__3 #phperkaigi #b オンライン予選も⽩熱! 4
X(旧twitter): @for__3 #phperkaigi #b 去年のコードバトルも⽩熱!! 5
X(旧twitter): @for__3 #phperkaigi #b 私も⼤変⽩熱してました 6
X(旧twitter): @for__3 #phperkaigi #b コードゴルフの⾯⽩いところ 7
X(旧twitter): @for__3 #phperkaigi #b • コードが仕様にあってるかどうかすぐ確認できる コードゴルフの⾯⽩いところ 8
X(旧twitter): @for__3 #phperkaigi #b • コードが仕様にあってるかどうかすぐ確認できる • コードの良さ(短さ)が定量化されている コードゴルフの⾯⽩いところ 9
X(旧twitter): @for__3 #phperkaigi #b • コードが仕様にあってるかどうかすぐ確認できる • コードの良さ(短さ)が定量化されている • コードを⾃分で考えて改善できる
コードゴルフの⾯⽩いところ 10
X(旧twitter): @for__3 #phperkaigi #b • コードが仕様にあってるかどうかすぐ確認できる • コードの良さ(短さ)が定量化されている • コードを⾃分で考えて改善できる
• ⼀つのやり⽅に縛られず、さまざまなアプローチができる コードゴルフの⾯⽩いところ 11
X(旧twitter): @for__3 #phperkaigi #b • コードが仕様にあってるかどうかすぐ確認できる • コードの良さ(短さ)が定量化されている • コードを⾃分で考えて改善できる
• ⼀つのやり⽅に縛られず、さまざまなアプローチができる • まだAIを使っても最適コードを出すのは難しい ◦ 競技性がある コードゴルフの⾯⽩いところ 12
X(旧twitter): @for__3 #phperkaigi #b コードゴルフの⾯⽩いところ • コードが仕様にあってるかどうかすぐ確認できる • コードの良さ(短さ)が定量化されている •
コードを⾃分で考えて改善できる • ⼀つのやり⽅に縛られず、さまざまなアプローチができる • まだAIを使っても最適コードを出すのは難しい ◦ 競技性がある • 複数のことを同時に実現する⽅法を思い つくとめっちゃ気持ちいい 13
X(旧twitter): @for__3 #phperkaigi #b この⽩熱を持って帰ってもっとシェアしたい • コードが仕様にあってるかどうかすぐ確認できる • コードの良さ(短さ)が定量化されている •
コードを⾃分で考えて改善できる • ⼀つのやり⽅に縛られず、さまざまなアプローチができる • まだAIを使っても最適コードを出すのは難しい ◦ 競技性がある • 複数のことを同時に実現する⽅法を思い つくとめっちゃ気持ちいい 14
X(旧twitter): @for__3 #phperkaigi #b 私(GitHub Copilot)が3⽇で作りました 15 • GitHub Copilot
• PHP8.4 • Laravel12 • Docker on Docker https://github.com/IkezoeMakoto/code-champs
X(旧twitter): @for__3 #phperkaigi #b その後半年ほど継続運⽤ 16
X(旧twitter): @for__3 #phperkaigi #b 社内で 内製して半年運営 して得た 内製と 運営の 知⾒
2026/03/20 PHPerKaigi 2026 @zoe 17 PHPerKaigi2025の企画 CodeGolfが最⾼すぎて
X(旧twitter): @for__3 #phperkaigi #b ⽬次 • 導⼊ • CodeChampsの仕組み ◦
構成、実⾏環境、セキュリティ、DooD、採点ロジック、複数 ⾔語対応 • イベント運営 ◦ 運営で⼯夫した点、実際に出した問題、うまく⾏かなかった点 • CodeGolfテクニック ◦ 時間があれば 18
X(旧twitter): @for__3 #phperkaigi #b 19 株式会社ウィルゲート ゼネラルマネージャー∕VPoE やってること 組織‧技術戦略/教育/採⽤/PM/SRE/インフラ 興味あること
- コードゴルフ/⾃動化/開発⽣産性/PHP/スノボ 執筆 - 【第3回】Dockerで実現! 効率的で⾼速な開発環境 ……makeコマンド⼀発でできる! - 【最終回】パフォーマンスチューニングをしよう ……PHP 8でXdebugとWebgrindを使ってプロファイ リング 池添 誠(いけぞえ まこと)
X(旧twitter): @for__3 #phperkaigi #b • 導⼊ • CodeChampsの仕組み ◦ 構成、実⾏環境、セキュリティ、DooD、採点ロジック、複数
⾔語対応 • イベント運営 ◦ 運営で⼯夫した点、実際に出した問題、うまく⾏かなかった点 • まとめ、CodeGolfテクニック ⽬次 20
X(旧twitter): @for__3 #phperkaigi #b 内製したCodeChamps 21
X(旧twitter): @for__3 #phperkaigi #b CodeChamps触ってみよう 22 アカウントをお持ちでない⽅は こちら ↓ アカウント登録
↓ ログイン ↓ お題画⾯
X(旧twitter): @for__3 #phperkaigi #b お題⼀覧 23
X(旧twitter): @for__3 #phperkaigi #b お題詳細 24
X(旧twitter): @for__3 #phperkaigi #b お題編集 25
X(旧twitter): @for__3 #phperkaigi #b slack通知も 26
X(旧twitter): @for__3 #phperkaigi #b 内製したCodeChamps の仕組み 27
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 28 TOP画⾯ (お題⼀覧)
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 29 TOP画⾯ (お題⼀覧) [管理者]お題登録 ‧編集‧削除
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 30 TOP画⾯ (お題⼀覧) お題詳細 画⾯
[管理者]お題登録 ‧編集‧削除
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 31 TOP画⾯ (お題⼀覧) お題詳細 画⾯
[管理者]お題登録 ‧編集‧削除 コード提出
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 32 TOP画⾯ (お題⼀覧) お題詳細 画⾯
[管理者]お題登録 ‧編集‧削除 コード提出 提出コード確認⽤ 隔離コンテナで 実⾏確認
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 33 TOP画⾯ (お題⼀覧) お題詳細 画⾯
[管理者]お題登録 ‧編集‧削除 コード提出 提出コード確認⽤ 隔離コンテナで 実⾏確認 FAIL
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 34 TOP画⾯ (お題⼀覧) お題詳細 画⾯
[管理者]お題登録 ‧編集‧削除 コード提出 提出コード確認⽤ 隔離コンテナで 実⾏確認 スコア算出‧ ランキング登録 PASS FAIL
X(旧twitter): @for__3 #phperkaigi #b 8割はCopilotで楽に実装(約3⼈⽇) ⼀般的なWebにあるような機能についてはほぼ⼿直しなしで 実装可能 35
X(旧twitter): @for__3 #phperkaigi #b 8割はCopilotで楽に実装(約3⼈⽇) ⼀般的なWebにあるような機能についてはほぼ⼿直しなしで 実装可能 • ユーザ登録‧ログイン 36
X(旧twitter): @for__3 #phperkaigi #b 8割はCopilotで楽に実装(約3⼈⽇) ⼀般的なWebにあるような機能についてはほぼ⼿直しなしで 実装可能 • ユーザ登録‧ログイン •
お題の登録‧編集‧削除 37
X(旧twitter): @for__3 #phperkaigi #b 8割はCopilotで楽に実装(約3⼈⽇) ⼀般的なWebにあるような機能についてはほぼ⼿直しなしで 実装可能 • ユーザ登録‧ログイン •
お題の登録‧編集‧削除 • お題の期間制御‧コードの提出‧ランキング 38
X(旧twitter): @for__3 #phperkaigi #b 8割はCopilotで楽に実装(約3⼈⽇) ⼀般的なWebにあるような機能についてはほぼ⼿直しなしで 実装可能 • ユーザ登録‧ログイン •
お題の登録‧編集‧削除 • お題の期間制御‧コードの提出‧ランキング • ベストスコアのslack通知 39
X(旧twitter): @for__3 #phperkaigi #b 8割はCopilotで楽に実装(約3⼈⽇) ⼀般的なWebにあるような機能についてはほぼ⼿直しなしで 実装可能 • ユーザ登録‧ログイン •
お題の登録‧編集‧削除 • お題の期間制御‧コードの提出‧ランキング • ベストスコアのslack通知 • 複数⾔語対応のための拡張 40
X(旧twitter): @for__3 #phperkaigi #b Copilotで対応が難しかった部分 ⼀般的なWebサービスにないであろう機能 41
X(旧twitter): @for__3 #phperkaigi #b Copilotで対応が難しかった部分 ⼀般的なWebサービスにないであろう機能 • 提出コードをセキュアに実⾏するための実⾏基盤(DooD) 42
X(旧twitter): @for__3 #phperkaigi #b Copilotで対応が難しかった部分 ⼀般的なWebサービスにないであろう機能 • 提出コードをセキュアに実⾏するための実⾏基盤(DooD) • 提出コードを実⾏し、テストケースと⼀致しているかを判
定する処理 43
X(旧twitter): @for__3 #phperkaigi #b Copilotで対応が難しかった部分 ⼀般的なWebサービスにないであろう機能 • 提出コードをセキュアに実⾏するための実⾏基盤(DooD) • 提出コードを実⾏し、テストケースと⼀致しているかを判
定する処理 • テストケース合格したものをスコアリングする機能 44
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 45 Docker(ホスト)
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 46 Docker(ホスト) APP (PHP-FPM) APP
(Nginx) APP (MySQL) アプリケーション⽤のコンテナ群
X(旧twitter): @for__3 #phperkaigi #b APP(PHP-FPM)にDocker(ホスト)のソケットを共有 お題と提出コードの実⾏環境の仕組み 47 Docker(ホスト) APP (PHP-FPM)
APP (Nginx) APP (MySQL) ソケット共有
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 48 Docker(ホスト) APP (PHP-FPM) APP
(Nginx) APP (MySQL) アプリケーションコンテナと別で管理している Submission Executerコンテナ Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) ソケット共有
X(旧twitter): @for__3 #phperkaigi #b お題と提出コードの実⾏環境の仕組み 49 Docker(ホスト) APP (PHP-FPM) APP
(Nginx) APP (MySQL) APP(PHP-FPM)からDocker(ホスト)のソケットを経由して Submission executerコンテナをホスト上で起動 Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) ソケット共有
X(旧twitter): @for__3 #phperkaigi #b APP(PHP-FPM)からは指定の⾔語のコンテナ上に テストケース、提出コードをマウントしてrun-tests.shを実⾏するだけ お題と提出コードの実⾏環境の仕組み 50 Docker(ホスト) APP
(PHP-FPM) APP (Nginx) APP (MySQL) Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) run-tests.sh run-tests.sh run-tests.sh run-tests.sh テスト ケース 提出 コード マウントして実⾏ ソケット共有
X(旧twitter): @for__3 #phperkaigi #b 実際にDooDを使ってる部分 51
X(旧twitter): @for__3 #phperkaigi #b セキュリティ アプリケーション本体と提出コード実⾏を別コンテナに分離 52 Docker(ホスト) APP (PHP-FPM)
APP (Nginx) APP (MySQL) Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) Submission executer (PHP8.4) run-tests.sh run-tests.sh run-tests.sh run-tests.sh テスト ケース 提出 コード ソケット共有
X(旧twitter): @for__3 #phperkaigi #b セキュリティ 提出コード実⾏⽤コンテナに セキュリティ⽤オプションを設定 53 x-sandbox-defaults: &sandbox-defaults
volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ 実⾏ごとの⼀時ファイルを分離 54 x-sandbox-defaults: &sandbox-defaults volumes:
- code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ ネットワーク完全遮断 • 外部通信による情報漏洩防⽌ • 外部サービスへの攻撃防⽌
• 不正なダウンロード‧C2通信の 遮断 55 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ nobodyユーザーで実⾏ • root権限の剥奪 • コンテナ内での権限昇格リスク
低減 56 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ root filesystem を読み取り専⽤化 • バイナリ改ざん‧永続化防⽌
• 書き込みは tmpfs や volume に 限定 57 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ メモリ上の⼀時ファイル領域を作 成 • noexec ◦
ファイルを実⾏不可 • nosuid ◦ 権限昇格不可 • size=16m ◦ サイズ制限 58 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ Linux capability をすべて削除 • rootでなくてもできる特権操作
を封じる ◦ ネットワーク設定変更、マウント など • コンテナ脱出リスクの低減 59 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ 実⾏中に権限昇格を禁⽌ • setuidバイナリなどによる権限 取得を防⽌ •
exploitの成⽴条件を潰す 60 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ プロセス数の上限設定 • fork bomb対策 •
リソース枯渇防⽌ 61 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ OSレベルのリソース制限 • nproc ◦ ユーザーが作れるプロセス数
• nofile ◦ 開けるファイル数 62 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b セキュリティ Tiniを使⽤ • ゾンビプロセス処理 • SIGTERM/SIGKILLの正しい伝播
• コンテナ終了の安定化 63 x-sandbox-defaults: &sandbox-defaults volumes: - code-champs_submission-tests:/tmp working_dir: /app network_mode: none user: "65534:65534" read_only: true tmpfs: - /run:rw,noexec,nosuid,size=16m - /var/tmp:rw,noexec,nosuid,size=16m cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 ulimits: nproc: 128 nofile: soft: 1024 hard: 1024 init: true
X(旧twitter): @for__3 #phperkaigi #b 採点ロジック phpタグ、及び不可視⽂字を除外した⽂字数をカウント 64 $submission->score = strlen(
preg_replace( [ '/<\?php|\?>/', // PHPタグを削除 '/\s+/' // 空白を削除 ], '', $validated['code'] ) ); function updateScore() { const code = document.getElementById('code').value; const cleanedCode = code.replace(/<\?php|\?>|\s+/g, ''); document.getElementById('score') .textContent = cleanedCode.length; }
X(旧twitter): @for__3 #phperkaigi #b 実⾏環境はsubmission-executer/compose.yamlで管理 • submission-executer/ ◦ compose.yaml ◦
php8.4/ ▪ run-tests.sh ▪ Dockerfile ◦ php7.4/ ▪ run-tests.sh ▪ Dockerfile ◦ node22/ ▪ run-tests.sh ▪ Dockerfile ◦ bash5.2/ ▪ run-tests.sh ▪ Dockerfile 複数⾔語対応 〜省略〜 services: php8.4: build: ./php8.4 php7.4: build: ./php7.4 node22: build: ./node22 bash5.2: build: ./bash5.2 volumes: code-champs_submission-tests: external: true 65
X(旧twitter): @for__3 #phperkaigi #b 複数⾔語対応 〜省略〜 services: php8.4: build: ./php8.4
php7.4: build: ./php7.4 node22: build: ./node22 bash5.2: build: ./bash5.2 volumes: code-champs_submission-tests: external: true 66 実⾏環境はsubmission-executer/compose.yamlで管理 • submission-executer/ ◦ compose.yaml ◦ php8.4/ ▪ run-tests.sh ▪ Dockerfile ◦ php7.4/ ▪ run-tests.sh ▪ Dockerfile ◦ node22/ ▪ run-tests.sh ▪ Dockerfile ◦ bash5.2/ ▪ run-tests.sh ▪ Dockerfile
X(旧twitter): @for__3 #phperkaigi #b アプリからは提出⾔語のコンテナ上でrun-tesets.shを実⾏して、⼊⼒ としてテストケースと提出コードを渡すだけ 簡単に複数⾔語対応できる仕組み 67 Docker(ホスト) APP
(PHP-FPM) APP (Nginx) APP (MySQL) Submission executer (PHP7.4) Submission executer (PHP8.4) Submission executer (Node22) Submission executer (Bash5.2) run-tests.sh run-tests.sh run-tests.sh run-tests.sh テスト ケース 提出 コード マウントして実⾏ ソケット共有
X(旧twitter): @for__3 #phperkaigi #b アプリからは提出⾔語のコンテナ上でrun-tesets.shを実⾏して、⼊⼒ としてテストケースと提出コードを渡すだけ 簡単に複数⾔語対応できる仕組み 68 Docker(ホスト) APP
(PHP-FPM) APP (Nginx) APP (MySQL) Submission executer (PHP7.4) Submission executer (PHP8.4) Submission executer (Node22) Submission executer (Bash5.2) run-tests.sh run-tests.sh run-tests.sh run-tests.sh テスト ケース 提出 コード マウントして実⾏ これがインターフェース! ソケット共有
X(旧twitter): @for__3 #phperkaigi #b お題側でも提出⾔語指定 69 お題 テスト ケース サンプル
コード ⾔語 提出 コード お題に紐づくサンプルコードは ⾔語テーブルに紐づいて登録される サンプルコードも⾔語ごと登録が必要
X(旧twitter): @for__3 #phperkaigi #b ⽬次 • 導⼊ • CodeChampsの仕組み ◦
構成、実⾏環境、セキュリティ、DooD、採点ロジック、複数 ⾔語対応 • イベント運営 ◦ 運営で⼯夫した点、実際に出した問題、うまく⾏かなかった点 • まとめ、CodeGolfテクニック 70
X(旧twitter): @for__3 #phperkaigi #b イベント運営 71
X(旧twitter): @for__3 #phperkaigi #b 運営⽅針 • 基本⽉1でお題を掲載 ◦ 業務時間などで多忙な時期に偏りがあることがある 72
X(旧twitter): @for__3 #phperkaigi #b 運営⽅針 73 • 基本⽉1でお題を掲載 ◦ 業務時間などで多忙な時期に偏りがあることがある
• 最初期は“簡単そうな”お題を作成して掲載 ◦ ⾃分も参加したいので、お題はAIと協⼒して作成
X(旧twitter): @for__3 #phperkaigi #b 運営⽅針 74 • 基本⽉1でお題を掲載 ◦ 業務時間などで多忙な時期に偏りがあることがある
• 最初期は“簡単そうな”お題を作成して掲載 ◦ ⾃分も参加したいので、お題はAIと協⼒して作成
X(旧twitter): @for__3 #phperkaigi #b 運営⽅針 75 • 基本⽉1でお題を掲載 ◦ 業務時間などで多忙な時期に偏りがあることがある
• 最初期は“簡単そうな”お題を作成して掲載 ◦ ⾃分も参加したいので、お題はAIと協⼒して作成
X(旧twitter): @for__3 #phperkaigi #b 運営⽅針 76 • 基本⽉1でお題を掲載 ◦ 業務時間などで多忙な時期に偏りがあることがある
• 最初期は“簡単そうな”お題を作成して掲載 ◦ ⾃分も参加したいので、お題はAIと協⼒して作成
X(旧twitter): @for__3 #phperkaigi #b 運営⽅針 77 • 基本⽉1でお題を掲載 ◦ 業務時間などで多忙な時期に偏りがあることがある
• 最初期は“簡単そうな”お題を作成して掲載 ◦ ⾃分も参加したいので、お題はAIと協⼒して作成
X(旧twitter): @for__3 #phperkaigi #b 運営⽅針 • 基本⽉1でお題を掲載 ◦ 業務時間などで多忙な時期に偏りがあることがある •
最初期は“簡単そうな”お題を作成して掲載 ◦ ⾃分も参加したいので、お題はAIと協⼒して作成 • 期間中、Code Champsランチを企画 ◦ 活性化と難易度調整のため意⾒交換を実施 ◦ 前⽉優勝者はランチ無料特典! 78
X(旧twitter): @for__3 #phperkaigi #b ⼯夫した点 79
X(旧twitter): @for__3 #phperkaigi #b • 定期的にCode Champsランチを実施 ◦ → 業務多忙で何もしないと徐々に参加者減少傾向
◦ お題をみんなで解く会、先⽉の優勝者の解説 ⼯夫した点 80
X(旧twitter): @for__3 #phperkaigi #b • 定期的にCode Champsランチを実施 ◦ → 業務多忙で何もしないと徐々に参加者減少傾向
◦ お題をみんなで解く会、先⽉の優勝者の解説 • お題の掲載を2つに変更 ◦ → ランキング上位者の固定化への対策 ◦ Begginer:少し簡単、過去1位とった⼈は卒業 ◦ Master:解きごたえのある難しめ、提出⾃由 ⼯夫した点 81
X(旧twitter): @for__3 #phperkaigi #b ⼯夫した点 82 • paizaさんのOnline PHP Editorの活⽤
◦ CodeChamps上ではDebugが仕様上できない
X(旧twitter): @for__3 #phperkaigi #b ⼯夫した点 83 • paizaさんのOnline PHP Editorの活⽤
◦ CodeChamps上ではDebugが仕様上できない error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
X(旧twitter): @for__3 #phperkaigi #b 実際に出した問題 時間があれば問題の解説 84
X(旧twitter): @for__3 #phperkaigi #b うまく⾏かなかった点 • 参加者の継続 ◦ 業務やプライベートの忙しさの波にどうしても左右される 85
X(旧twitter): @for__3 #phperkaigi #b うまく⾏かなかった点 86 • 参加者の継続 • 難易度調整
◦ AIを使っての出題&⾃⾝も参加したいため、どの程度まで削れ そうか、ロジックがどの程度難解かが不確実 ◦ とはいえ、シンプル版→複雑化させる⽅法で作ることである程 度コントロール可
X(旧twitter): @for__3 #phperkaigi #b うまく⾏かなかった点 • 参加者の継続 • 難易度調整 ◦
AIを使っての出題&⾃⾝も参加したいため、どの程度まで削れ そうか、ロジックがどの程度難解かが不確実 ◦ とはいえ、シンプル版→複雑化させる⽅法で作ることである程 度コントロール可 • 複数⾔語での仕様差異を使った出題 ◦ PHPerが多い&PHPがそこそこ短くかけることでPHPが多い ◦ バージョン差異も狙って出題が難しい 87
X(旧twitter): @for__3 #phperkaigi #b ⽬次 88 • 導⼊ • CodeChampsの仕組み
◦ 構成、実⾏環境、セキュリティ、DooD、採点ロジック、複数 ⾔語対応 • イベント運営 ◦ 運営で⼯夫した点、実際に出した問題、うまく⾏かなかった点 • まとめ、CodeGolfテクニック
X(旧twitter): @for__3 #phperkaigi #b 89 みんなもコードゴルフやって⽩熱しよう! あわよくば、社内コードゴルフで⽩熱を持ち帰ろう! // おまけ:よく使うコードゴルフテクニック 51
→ 37 $n=fgets(STDIN); for ($i=0; $i < $n; $i++) echo $n - $i . "\n"; ↓ for($i=fgets(STDIN); $i; print $i-- . “ ”)