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
520
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
790
[Developers Summit 2024 Summer]良いプロダクト作りのための組織育成 ~1on1完全攻略編~
ikezoemakoto
8
4.4k
【ぺちこん小田原2024懇親会LT】新卒教育できる組織を育成するためにしてきたこと(公開用)
ikezoemakoto
4
300
[Developers Summit 2024]良いプロダクト作りのための組織育成(理論&実践編) 健全なコードは健全な組織、健全なチームから
ikezoemakoto
18
12k
[PHPカンファレンス北海道2024 全然野菜]PHPとLaravelで使える ジェネレータを使った大量データ処理のパフォーマンス改善
ikezoemakoto
0
190
[PHPカンファレンス2023]NFCネームプレートを自作して楽しく交流しよう!
ikezoemakoto
0
920
[PHPカンファレンス沖縄2023]【実践編】良いプロダクト作りのための組織育成 健全なコードは健全な組織、健全なチームから
ikezoemakoto
3
1.7k
良いプロダクト作りのための組織育成 健全なコードは、 健全な組織・健全なチームから
ikezoemakoto
9
7.3k
Other Decks in Programming
See All in Programming
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
250
ActionController meets Protocol Buffers
sorah
0
220
気持ちぃ〜角丸 Squircle
ryu1013
0
290
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1k
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
JRuby: Past, Present, and Future
headius
0
230
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
1
310
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
480
Kubernetes祭り #2 OP/ED
bells17
0
110
Kotlinの15年とServer-Side Kotlin
n_takehata
1
140
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
3.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
Code Reviewing Like a Champion
maltzj
529
40k
Abbi's Birthday
coloredviolet
4
10k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Designing Experiences People Love
moore
143
24k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
sira's awesome portfolio website redesign presentation
elsirapls
0
450
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-- . “ ”)