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
ある日オレオレフレームワークを作りたくなったぞ/Want to Create Oreore F...
Search
果物リン
March 24, 2023
Technology
180
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ある日オレオレフレームワークを作りたくなったぞ/Want to Create Oreore Framework
ある日オレオレフレームワークを作りたくなった話
PHPerKaigi2023
果物リン
March 24, 2023
More Decks by 果物リン
See All by 果物リン
AIに与える人間らしさを(略)したら600ページの同人誌になった/I kept thinking about making AI more human, more, more, more... wait, when did this become a 600-page doujinshi?
fruitriin
0
110
記憶を高速で思い出す全文検索パフォーマンス・チューニング テクニック/How to make your AI recall, quickly
fruitriin
0
74
入社半年で作った"社内でも使える"ツール集/Everything I Built on the Side in Half a Year
fruitriin
0
93
embodied記憶の依代 聖杯問答/ Vessel of Memory: The Grail Dialogue #embodied_llm
fruitriin
2
170
ClaudeCodeと遠くへいくためのパーミッションルール/Stop Checking, Start Trusting: Claude Code Permission Rules
fruitriin
0
64
Claude Codeと物忘れ / Invitation talk about context - Why Claude Code forget?
fruitriin
0
87
Claude Codeと2つの巻き戻し戦略 / Two Rewind Strategies with Claude Code
fruitriin
0
240
Electron+Vue+Swift=真のデスクトップアプリ / How to create "Really" desktop app using Electron
fruitriin
0
130
fishとfzfはじめて 豊かになりました / fish and fzf is good
fruitriin
1
980
Other Decks in Technology
See All in Technology
AGENTS.mdとSkillsで始めるAIエージェント活用
sonoda_mj
3
220
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
2
540
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
240
【NRUG vol.18】なぜ多くのオブザーバビリティ導入は失敗するのか
nrug_member
0
140
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
270
AIっぽい文章を採点して人間らしく直すアプリを作ってみた
yama3133
2
200
連合学習と機密コンピューティング
lycorptech_jp
PRO
0
120
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2k
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
2k
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
620
RSA暗号を手計算したくなること、ありますよね?? (20260615_orestudy6_rsa)
thousanda
0
440
Featured
See All Featured
BBQ
matthewcrist
89
10k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
How to train your dragon (web standard)
notwaldorf
97
6.7k
エンジニアに許された特別な時間の終わり
watany
107
250k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
Code Review Best Practice
trishagee
74
20k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
Producing Creativity
orderedlist
PRO
348
40k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Transcript
ある日 オレオレフレームワーク を作りたくなったぞ! ՌϦϯ@
[email protected]
ϑΝϯϑΝʔϨ גࣜձࣾ PHPerKaigi 2023 લࡇ 40
2023/3/23
One day....
Laravelʹର͢Δ ෩ͨΓ͕ڧ͍ͳ͋
ෆຬ͕͋ΔͳΒ ࣗͷཧΛ ͭ͘Ε͍͍ͷʹ
࡞Ε……͍͍ͷʹ……ʁ
ΦϨΦϨ͍ͯͧ͘͠ʂ
ྩͩͧʁ
自己紹介 果物リン@FruitRiin • ϑΝϯϑΝʔϨגࣜձࣾ • ݩPHPer, ݱϑϩϯτΤϯυΤϯδχΞ • Vue.js͕͖ •
PHP5ͿΓ • PHPͷΏΔ;Θʹߗ͘ॻ͚Δݴޠײେ͖ • ϑϨʔϜϫʔΫΛ࡞ͬͯΈͨ͘ͳͬͯ͠·ͬͨ
ファンファーレ株式会社 • ࢈ۀഇغۀքΛλʔήοτʹͨ͠SasS • ंʢγϑτදʣΉͷ͕৬ਓٕ • ͦΕɺITͰͳΜͱ͔ͳΒΜ͔ʁ • ཧ࠷దԽʢNot ػցֶशʣͰͳΜͱ͔͠·͠ΐ͏ʂ
数理最適化とは? • ੍ͱతͱ݅Λ͍ΕΔͱΓͷ݅ʹมͱͯ͠࠷దͳղ Λݟ͚ͭΔֶతख๏ • ιϧόͱ͍͏ΞϧΰϦζϜʹ ੍ͱతΛཧϞσϧʹͨ͠ͷΛ ݅มͱͱʹಥͬࠐΉͷ͕ं಄
• ϒϥοΫϘοΫεʹ͍݅ΕͯγΣΠΫͯ͠ग़ͨ͑Ͱͳ͍
の、フロントエンド担当やってます • ʢCM͜͜·Ͱʣ
お品書き(目次) • ༻ޠઆ໌ͳͲ • ͳͥΦϨΦϨϑϨʔϜϫʔΫੜ·Εͨͷ͔ʁ • ϥΠϒϥϦͷ࡞Γํపఈղઆ • ࠓ෩ͷϥΠϒϥϦͷ͍ํ
お品書き(目次) • ςετɺCIʢGitHubActionsʣ • Packagistͷެ։ • ·ͱΊ • Appendix
༻ޠઆ໌ͳͲ
用語説明 • ϑϨʔϜϫʔΫ • ΞϓϦέʔγϣϯιϑτΣΞΛ։ൃ͢ΔͨΊͷڞ௨తͳػೳ ϥΠϒϥϦɺઃܭύλʔϯɺϧʔϧͳͲΛ·ͱΊͨͷ • ΦϨΦϨ • ʮ͚ࣗͨͪͩͷɺಠࣗͷʯ
• ΦϨΦϨϑϨʔϜϫʔΫ • ࣗࣾ։ൃͷϑϨʔϜϫʔΫ
ҙ :CAUTION:
注意:現代のオレオレフレームワーク • ҰൠతʹϓϩμΫγϣϯʹೖ͢Δ͖Ͱ͋Γ·ͤΜ • อक͞Εͳ͍Մೳੑ͕ߴ͍ • ίϛϡχςΟͳͲͳ͍ • υΩϡϝϯτ͕උ͞ΕͯΔ͔࡞ऀͷؤுΓʹΑΔ •
ेதീͳ͍ • ηΩϡϦςΟͷΛͲ͏͢Δ • Ҿ͖ܧ͗Ͱ·Δ͝ͱϩετςΫϊϩδʔʹͳΔ
ࣺͯΑ͏ʂ
Breaking time
ͳͥΦϨΦϨϑϨʔϜϫʔΫ ੜ·Εͨͷ͔
オレオレフレームワーク考古学 • ຊͱWebΦϨΦϨϑϨʔϜϫʔΫͷؔΘΓ ϞόΠϧWebͷීٴͱڞʹ͋Δ(2000ॳ಄ʣ • i-Mode ͱ͔ ez-web ͱ͔
• ιγϟήͷొ • ૣ͘ɺ৭ʑͳΞϓϦέʔγϣϯΛ࡞Γ͍ͨ • ϑϨʔϜϫʔΫΛ࡞Ζ͏
有名どころなフレームワークの当時は? • CodeIgniterʢ2006ʣ • CakePHPʢ2005ʣ • Symfonyʢ2005ʣ • Zend Frameworkʢ2006ʣ
• Yii Frameworkʢ2008ʣ • Laravelʢ2011ʣ • ࣌·ͩଘࡏ͍ͯ͠ͳ͔͔ͬͨɺ ͜ͳΕ͍ͯͳ͔ͬͨ • ബ͍ϑϨʔϜϫʔΫΛϕʔεʹ ͚ࣗࣾʹΧελϚΠζͳͲ • ్த͔ΒҠߦඇৗʹࠔ
→ͨΓલͷΑ͏ʹ ΦϨΦϨ͍ͯͨ͠ʂ
Ruby on Rails の流行 • Ruby on Rails 2004ʹొ
• ຊͰ2000ޙʹٸʹීٴ • ͳΜͱ͍ͬͯ։ൃ͕؆୯Ͱૣ͍ • ͕ɺRubyͳͷͰαʔόʔΛݐͯΔͷ͕ͪΐͬͱΉ͔͍ͣ͠ • ࣌ίϯςφͱ͔ͳ͍͠Ͷʂ
Laravelの登場 • Laravelͷొ2011 • Ruby on RailsʹӨڹΛڧ͘ड͚ͨϑϨʔϜϫʔΫ • 2010ޙʹɺຊͰLaravelͷීٴ͕ਐΜͩ •
ͱ͍͏͔ೣḏࢠLaravelʹͳͬͨ
ͦͯ͠ྩͷݱʹࢸΔ... ˎͱ͍͏ௐࠪ݁Ռ
Ͱ࡞Γ͍ͨʂ
ΦϨΦϨ͍ͯͧ͘͠ʂ
ϥΠϒϥϦͷ࡞Γํ పఈղઆ
Composer init • PHPϓϩδΣΫτͷܗΛ࡞ͬͯ͘ΕΔ
[Lib]¥Hello Worldしにいく • srcσΟϨΫτϦʹHelloWorld.php • name vender/packagename • autoload
େจࣈখจࣈΛ۠ผ͠ͳ͍ • ύοέʔδ໊ͱҰகਪ
[Lib]HelloWorld.php • namespaceΛautoloadʹ͋ΘͤΔ • Ϋϥε໊ͱϑΝΠϧ໊Λ͋ΘͤΔ • େจࣈখจࣈΛ۠ผ͢Δ
どこからもコールされない • ϥΠϒϥϦͳͷͰͦΕͦ͏ • namespaceͱϑΝΠϧ໊ɺΫϥε໊͕͋ͬͯΕOK
[Lib]git push! • ϦϙδτϦʹpush͢Δ • ͱΓ͋͑ͣ Packagistͷొ͠ͳ͍
[App]呼んでみよう • ΞϓϦέʔγϣϯͷσΟϨΫτϦΛ࡞Δ • composer.jsonΛ࡞Δ • minimum-stability Λdevʹ • requireʹࣗͷύοέʔδΛ
[App]dev-main? • ௨ৗύοέʔδͷόʔδϣϯΛࢦఆ͢Δ • githubͷ߹ϒϥϯνΛࢦఆͰ͖Δ • dev- ϓϨϑΟοΫε͕ඞཁ • dev-main
όʔδϣϯ mainϒϥϯνͷ࠷৽Λͱͬͯ͘Δ
[App] sayHello()! • autoload Λ index.php Ͱݺͼग़͢ • use ͯ͠
new ͯ͠ • php -S localhost:7777
🎉 :tada: 🎉
面倒なときのライブラリ開発のコツ • Appଆ͔ΒvenderͷதͷlibͷίʔυΛ͍͡Δ • Ұ௨Γಈ͘͜ͱΛ֬ೝͨ͠ΒlibͷϦϙδτϦ
Ұ୴ٳܜ
ࠓ෩ͷϑϨʔϜϫʔΫͷ࡞Γํ
今風のフレームワークの作り方 • ϥΠϒϥϦ͕ଟ༷Խɺθϩ͔Βશ෦ॻ͘ඞཁͳ͍ • మ൘ͷ෦ϥΠϒϥϦ͔Βݟસ͍͍͑ • ͩ͜ΘΓ͍ͨ෦ΦʔμʔϝΠυ͍ͯ͘͠
͏ͣΒ͞Μͷ ʮؼ͖ͬͯͨʂ ฏ࠷ޙͷΦϨΦϨϑϨʔϜϫʔΫͷ ࡞Γํ ʯ Λݟͯ͘Εʂ
ライブラリによって得られるもの • ৴པͱ࣮ • ίϛϡχςΟ • ʮී௨ʯ
ϑϨʔϜϫʔΫͷίϯηϓτ
フレームワークのコンセプト • جຊJSON͔͠ฦ͞ͳ͍API ϑϨʔϜϫʔΫ • ςϯϓϨʔτΤϯδϯΛؚ·ͳ͍ • PhpStormʹΑΔܕਪͷ࠷େݶ׆༻ • ϑΝΠϧ໊ͱϝιου໊ϕʔεͷϧʔςΟϯά
ルーターを自作する • name based routing͍ͨ͠ • ͋Ε…ҙ֎ͱͳ͍ͷͰ • ͦΜͳͣ……
ϧʔλʔΛࣗ࡞͢Δ
[app]index.php を避けたい • php-fpm Λ͔ͭ͏ • dockerͳΒ͜Ε͔ͳ • apatchͰ͍͍͚Ͳ •
.htaccessΛ͔ͭ͏ • php -S htaccess ʹରԠ͍ͯ͠Δʂ • php -S localhost:7777 -t public
[lib]なんかRouterっぽいものをつくる • new ͞Εͯ run()ɹ͞ΕͨΒ ΞϓϦέʔγϣϯͷίϯτϩʔϥʔͷϝιουΛୟ͘ • $_SERVER["REQUEST_URI"]; ͱ͔͔ͭ͑ͦ͏
• new "\\hogehoge" ͱ͔͢Δͱάϩʔόϧείʔϓ = ΞϓϦέʔγϣϯͷίʔυ͕ݺΔ
None
None
None
None
[app] namespace Controllersを足す • composer.json ʹҎԼΛ͢ •
[app]HelloWorldController.php爆誕
[app]index.php • $route->run(); ͢Δͱ
໊લϕʔεͰಈ͘ʂ
໊લϕʔεͰಈ͘ʂ [app]->json() だけでおわりたい
None
͋ͱಓʹίʔυΛ ͍͚ͯ͠Ͳ͏ʹ͔
ςετΛॻ͘
PHPUnitしていく • composer require --dev phpunit/phpunit • test σΟϨΫτϦΛΔ •
PHPUnit\Framework\TestCase Λܧঝͨ͠ΫϥεΛ࡞Δ • ϝιου໊ test Ͱ࢝ΊΔ
気持ち
リファクタリング • new ͨ͠ΒݕࠪͰ͖ΔΑ͏ʹ͔ͨͬͨ͠ͷͰ
composer scriptを追加 • composer testͰ phpunit test Ͱ͖ΔΑ͏ʹͳΔ
いざ…… test 🎉 tada 🎉
GitHub Actions
ɺී௨ʹ……
packagist ͷެ։
Packagist • ΞΧϯτͭ͘Δ • ϩάΠϯ͢Δ • Submit ϘλϯΛϙνοͱ • ࣗͷGitHub
ͷϦϙδτϦͷURLΛೖΕͯSubmit
None
None
ΊͰͨ͠ɹΊͰͨ͠
ͩͱࢥ͏͡ΌΖʁ
unstable しかないと… • ϓϩδΣΫτ͕"minimum-stability": "dev", ʹͳ͍ͬͯͳ͍ͱ •
バージョンの打ち方 • composer.json ʹ version ΛՃ͢Δ • λάΛଧͬͯpush͢Δ • git
tag v0.0.1
composer require fruitriin/lucienne
None
[app]テンプレートリポジトリの作成 • ࠷খݶͷߏΛͨ͠ app ͷϦϙδτϦΛ ςϯϓϨʔτϦϙδτϦʹ͢Δ • ςϯϓϨʔτϦϙδτϦ
.gitΛίϐʔͤͣclone͢Δ
ϫϯϙνͰఏڙʂ
None
None
できたもの
None
None
夢は広がる • Request, Response ͱ͔ • DBଓΛϥοϐϯά • ORMͱ͔ •
ϩάΠϯͱ͔ • Validationͱ͔
必要は発明の母 • ͱΓ͋͑ͣࣗͷ͍Βͳ͍ͷ͍Βͳ͍ • ΞϓϦέʔγϣϯΛॻ͘ʹ͋ͨͬͯ ൚༻తͳ෦͕ϑϨʔϜϫʔΫʹͳΔ
まとめ • ΈΜͳΦϨΦϨͰ͖Δʂ • ΦϨΦϨ͍ؒͯΦϨͷ͍ؒͳ͍ • ܁Γฦ͠ݴ͏͕ྩͩͧ • ChatGPTͳΜͰͬͯͦ͏
Appendix • https://packagist.org/packages/fruitriin/lucienne • https://github.com/fruitriin/lucienne • https://github.com/fruitriin/Lucianne-application • ΦϨΦϨϑϨʔϜϫʔΫͷ࡞ΓํΛChatGPTʹฉ͍ͨϩάશ෦ •
https://docs.google.com/document/d/e/2PACX-1vQDdc92Za3Shc9UgnD- oqpD3Mvo3rY7UEV_IuO2DG30jpc-tlwwOInG-8C2NCz6oBNhO9e_m-tXzZ7N/ pub
Inspired by • https://speakerdeck.com/uzulla/phperren-sheng-du- hahuremuwakuwozuo-tuteokou
Inspired by • https://speakerdeck.com/uzulla/gui-tutekita-ping-cheng-zui- hou-falseoreorehuremuwakufalsezuo-rifang
NGγʔϯू
App用Docker環境構築でハマり • ࠷ऴతʹphp -S ͰΑ͔ͬͨ • ϥΠϒϥϦ phpunit ͔Β •
ͦΕͦΕͱͯ͠Dockerڥߟ͑Δͱศར • ͯ͠ΘΕΔͷ͔ʁͱ͔ߟ͍͚͑ͯͳ͍ɻ ຬײ͕େࣄ
最終的にできたのがこちら FROM wyveo/nginx-php-fpm:php81 COPY composer.json /usr/share/nginx COPY composer.lock /usr/share/nginx RUN
chown -R nginx:nginx /usr/share/nginx WORKDIR /usr/share/nginx USER nginx RUN composer install --no-dev --no-scripts --no-autoloader && \ composer dump-autoload --optimize USER root • version: '3.9' services: web: build: . container_name: myapp ports: - '7777:80' volumes: - ./src:/usr/share/nginx/src - ./public:/usr/share/nginx/ html/ depends_on: - db networks: - myapp-net
mainブランチをPushしたぞ。で? • "minimum-stability": "dev", "require": { "fruitriin/lucienne": "dev-main"
}, • dev- ͱ͚ͭΔͱ main ϒϥϯνΛݟʹߦ͘
package名とリポジトリ名 • GithubͷϦϙδτϦ໊ͱcomposer.jsonͷname • Ұக͍ͯ͠Δඞཁͳ͍ • composer.jsonͷ autoload • Vender/PackageName:
"src" ͱ͢Δͱ namespace VencerPackageName; ͕ඞཁ
アプリケーションの名前空間を短くしたい • composer.json ͷ autoloadʹै͏ • { "Controllers\\": "src/Controllers" }
ͳͲͳͲͳͲ
ChatGPT͕͍͢͝
All powered by ChatGPT • ࠓճͷొஃʹ͓͍ͯɺ΄΅ChatGPTͱͷΓͱΓͰ݁ • ࣭ʹର͕ͯ͑͠ฦͬͯ͘Δ • Γ͍ͨ͜ͱΛϐϯϙΠϯτͰճͯ͘͠ΕΔ
•
考古学を丸投げするスタイル
composer init の方法を教えてもらう
Hello Worldしたいです
autoloadとuse
AIʢ͏ʣΤϯδχΞ࣌…
Any Ask or Questions?