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
知らないWebアプリケーションの開発に途中からJOINしたとき、どこから切り込むか? / PH...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ken’ichiro Oyama
February 10, 2020
Technology
14k
36
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
知らないWebアプリケーションの開発に途中からJOINしたとき、どこから切り込むか? / PHPerKaigi 2020
https://fortee.jp/phperkaigi-2020/proposal/c8d6b9b1-29e4-48bd-b8bd-9f43f74d6265
Ken’ichiro Oyama
February 10, 2020
More Decks by Ken’ichiro Oyama
See All by Ken’ichiro Oyama
Introducing RFC9111 / YAPC::Fukuoka 2025
k1low
2
5.8k
Design and implementation of "Markdown to Google Slides" / phpconfuk 2025
k1low
1
1.1k
analysis パッケージの仕組みの上でMulti linter with configを実現する / Go Conference 2025
k1low
1
920
Flight recorder at the application layer (NOT the FlightRecoder newly added at Go 1.25) / Fukuoka.go #22
k1low
0
200
ソフトウェア開発におけるインターフェイスという考え方 / PHPerKaigi 2025
k1low
12
6.5k
Parsing HCL/CUE / Fukuoka.go #21
k1low
0
11k
実践 net/http Middleware パターン / Kizuku.go Vol.1
k1low
2
480
Cleanup handling in Go / Go Conference 2024
k1low
7
4.2k
CI/CDがあたりまえの今の時代にAPIテスティングツールに求められていること / CI/CD Test Night #7
k1low
18
12k
Other Decks in Technology
See All in Technology
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
900
QA4AI 2026-Oct 生成AI時代の品質保証
tokuty
1
870
Webの常識が通じないHTMLメールのダークモード
teamlab
PRO
0
130
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
780
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
190
Gemini Intelligence 入門 ― AppFunctions と Gemini Nano
takuroabe
0
270
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
220
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
930
SAENM ~Jupyterで残すPoCの試行錯誤、未来の自分と仲間を助ける記録!~
terapyon
0
110
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.4k
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
270
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Un-Boring Meetings
codingconduct
0
460
Producing Creativity
orderedlist
PRO
348
41k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
Automating Front-end Workflow
addyosmani
1369
210k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
750
Building Applications with DynamoDB
mza
96
7.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Music & Morning Musume
bryan
48
7.4k
Are puppies a ranking factor?
jonoalderson
2
4.1k
Transcript
খࢁ݈Ұ(.01FQBCP *OD 1)1,BJHJ Βͳ͍8FCΞϓϦέʔγϣϯͷ։ൃʹ ్த͔Β+0*/ͨ͠ͱ͖ɺ Ͳ͔͜ΒΓࠐΉ͔ʁ
IUUQTHJUIVCDPNL-P8 ϓϦϯγύϧΤϯδχΞ খࢁ݈Ұ!L-P8 ϗεςΟϯάࣄۀ෦ϗεςΟϯάάϧʔϓϚωʔδυΫϥυνʔϜ
None
None
w్த+0*/ʹ͍ͭͯվΊͯߟ͑Δ w్த+0*/ͷϊϋڞ༗ͷ͖͔͚ͬΛ࡞Δ wࢲ͕ɺΈͳ͞Μͷɺ్த+0*/ͷϊϋΛΓ͍ͨ ͜ͷൃදͷΰʔϧ
Έͳ͞Μ ։ൃʹ్த+0*/ͨ͠ܦݧ ͋Γ·͔͢ʁ
w ࣮͋·Γ్த+0*/ͷܦݧ͕ͳ͍ w θϩ͔Βߏங͢Δܦݧͷ΄͏͕ѹతʹଟ͍ w ϓϩδΣΫτʹ్த͔Β+0*/͢Δܦݧ͕ຊʹগͳ͍ w 044׆ಈʹϞϩʹͰ͍ͯͯɺ(JU)VCͷϓϩϑΟʔϧ ͷάϥϑΛΈͯҟৗͳภΓʢѹతʹࣗͷ044ͷίϛοτ͕ଟ͍ʣ w
ͳͷͰɺࠓճͷ్த+0*/Λ͢Δͱ͖ɺҙਂࣗ͘ͷঢ়گ Λ֬ೝ͠ͳ͕ΒਐΊ͍ͯ͘͜ͱʹͨ͠ ࢲͱ͍͏ͱ
w 1)1 .Z42- w ͍ΘΏΔ8FC%#ͷΞϓϦέʔγϣϯ w ຊ൪ڥɾεςʔδϯάڥɾڞ༗։ൃڥ w ։ൃڥ7BHSBOUͰ༻ҙ w
Πϯϑϥߏ$IFGͰߏஙɾཧ w αʔϏεͱͯ͠ͷྺ࢙͘ɺଞαʔϏεͱͷ࿈ܞ͋Γ +0*/ͨ͠αʔϏεͷ֓ཁ
͜͜·ͰͰ։ൃʹ औΓ͔͔Εͦ͏Ͱ͔͢ʁ
w 1)1.Z42-ɺ$IFGͳͲ৮ͬͨ͜ͱ͋Δ w 1)1νϣοτσΩϧ w ݴͬͯΈΕαʔϏεΛߏ͍ͯ͠Δٕज़ελοΫʹͭ ͍ͯͷཧղʹ͍ͭͯ΄΅ͳͦ͞͏ w ιʔείʔυ(JUʢ()&ʣͰཧ͞Ε͍ͯΔ w
͍͚ͦ͏ w ͦΕͳͷʹͳͥʁ ͳͥ։ൃʹऔΓ͔͔Εͳ͍ͷ͔ʁ
θϩ͔Β։ൃ͢Δͱ͖Λߟ͑ͯΈΔ ͲͷΑ͏ͳαʔϏε͔
θϩ͔Β։ൃ͢Δͱ͖Λߟ͑ͯΈΔ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔
θϩ͔Β։ൃ͢Δͱ͖Λߟ͑ͯΈΔ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ
θϩ͔Β։ൃ͢Δͱ͖Λߟ͑ͯΈΔ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ
θϩ͔Β։ൃ͢Δͱ͖Λߟ͑ͯΈΔ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ ͲͷΑ͏ͳίʔυ͔
w͔Β·ͰੵΈ্͛ͯɺ ͡Ίͯ։ൃ͕Ͱ͖͍ͯΔ ঢ়ଶʹͳΔ θϩ͔Β։ൃ͢Δͱ͖Λߟ͑ͯΈΔ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ
ͲͷΑ͏ͳίʔυ͔ ։ൃ
wٕज़ελοΫ͕Θ͔ͬͯຊ ൪ڥ։ൃڥ͕͋ͬ ͨͱͯ͠ɺɺɺ͕ Γͳ͍ w͜ͷੵΈ্్͛த͔Β +0*/͢Δͱͯ͠ඞཁ Կ͕Γͳ͍͔ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔
ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ ͲͷΑ͏ͳίʔυ͔ ։ൃ
ʮͲ͔͜ΒΓࠐΉ͔ʁʯ ͷճɺৗʹ ʮͲͷΑ͏ͳαʔϏε͔ΛΔ͜ͱ͔Βʯ
w ։ൃΛ͢Δ্Ͱͷؾ͖ͮΛଟ͘͢ΔͨΊɻ w Կ͔ͷػೳΛͭ࡞Δͱ͖ɺͦͷػೳ͚ͩͰαʔϏε͕ Γཱ͍ͬͯΔΘ͚Ͱͳ͍ɻଞͷػೳͱͷ͍ؔͯ͠Δɻ w ͜ͷؔੑͷࠜװʹ͋Δͷ͕ʮͲͷΑ͏ͳαʔϏεͳͷ ͔ʯ ʮͲͷΑ͏ͳαʔϏε͔ʯ͕ͳͥඞཁ͔
w ͍͍ͩͨ3%#.4͕ͩ3%#.4ʹݶΒͳ͍ w αʔϏεͷػೳ্࣮ͷ੍ͷใ͕ͬͱ৭ೱ͘Ͱ ͍ͯΔͷίʔυͰͳͯ͘σʔλϕʔεͷςʔϒϧઃܭ w 8FCΞϓϦέʔγϣϯɺۃͯ͠͠·͑σʔλͷग़͠ ೖΕͳͷͰɺӬଓσʔλ͕͋ΔՕॴͷઃܭ੍ΛѲ͢ Δ͜ͱͰɺαʔϏεͷࠜݩͷ෦͔ΒཧղͰ͖Δ w
8FCΞϓϦέʔγϣϯͷ࣮ʹӨڹΛड͚ͳ͍ܗͰཧղͰ ͖Δใ ʮͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ʯ͕ͳͥඞཁ͔
σʔλϕʔεͷण໋ ΞϓϦέʔγϣϯΑΓ͍ ીࠜେ
w ͍͍ͩͨ3%#.4͕ͩ3%#.4ʹݶΒͳ͍ w αʔϏεͷػೳ্࣮ͷ੍ͷใ͕ͬͱ৭ೱ͘Ͱ ͍ͯΔͷίʔυͰͳͯ͘σʔλϕʔεͷςʔϒϧઃܭ w 8FCΞϓϦέʔγϣϯɺۃͯ͠͠·͑σʔλͷग़͠ ೖΕͳͷͰɺӬଓσʔλ͕͋ΔՕॴͷઃܭ੍ΛѲ͢ Δ͜ͱͰɺαʔϏεͷࠜݩͷ෦͔ΒཧղͰ͖Δ w
8FCΞϓϦέʔγϣϯͷ࣮ʹӨڹΛड͚ͳ͍ܗͰཧղͰ ͖Δใ ʮͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ʯ͕ͳͥඞཁ͔
wιʔείʔυΛಡΉͨΊͷΤϯτϦʔϙΠϯτ͕Γ͍ͨ w 8FCΞϓϦέʔγϣϯΛͲ͔͜ΒಡΈਐΊΕྑ͍͔ͱ ͍͏۩ମతͳࢦ w ϝδϟʔͳϑϨʔϜϫʔΫΛར༻͍ͯ͠Δ߹҉తʹ ͍͑ͯΔ͜ͱ͕ଟ͍ w ͦ͏Ͱͳ͍߹ɺʮ)551ϦΫΤετΛͲ͏ϧʔςΟ ϯά͍ͯ͠Δ͔ʯ͔ΒΔඞཁ͕͋Δ
w ʮ։ൃʯʹ࠷͍ۙϨΠϠʔͳͷͰܦݧͷߴ͍Τϯδχ ΞྗٕͰղܾ͢ΔͷͰඞཁͳ͍͜ͱ ʮͲͷΑ͏ͳίʔυ͔ʯ͕ͳͥඞཁ͔
ٕज़ελοΫͷ͕ࣝ͋ͬͨͱͯ͠ ։ൃ։࢝·Ͱʹ खؒͱ͕͔͔࣌ؒΔ
l։ൃ։࢝·ͰͷΦʔόʔϔουz
w ։ൃʹऔΓֻ͔Δ·Ͱʹ͔͔Δ࣌ؒΛɺ͜ͷηογϣϯͰ ʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯͱݺͿ w ։ൃνʔϜ͕ˋະདྷӬ߷ݻఆϝϯόʔͰ͋Δඞཁ͕ͳ ͍ݶΓʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯͦͷ։ൃʹ͓ ͍ͯ՝ͱͳΓ͏Δ w ࣮ࢲ͕Βͳ͍͚ͩͰԿ໊͔લ͕͍ͭͯͦ͏ͳͷͰ୭͔ڭ͍͑ͯͩ͘͞ w
ͬ͘͠ͱ໊͍͍લΛͥͻ ։ൃ։࢝·ͰͷΦʔόʔϔου
ʮ్த+0*/ͷϊϋʯͱ ʮ։ൃ։࢝·ͰͷΦʔόʔϔουΛ ͲͷΑ͏ʹখ͘͢͞Δ͔ʯ ͱ͍͏͜ͱ
։ൃ։࢝·ͰͷΦʔόʔϔου ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ ͲͷΑ͏ͳίʔυ͔ ։ൃ αʔϏεཧղϨΠϠʔ
ΞʔΩςΫνϟཧղϨΠϠʔ σʔλετΞཧղϨΠϠʔ ڥϨΠϠʔ ίʔυϨΠϠʔ
w αʔϏε։ൃʹ͓͚Δଐਓੑ͕ബ͘ͳΔ w αʔϏε୯ҐͰͳ͘ɺͦͷͱ͖ͦͷͱ͖ͷϓϩδΣΫτ ୯ҐͰͷ։ൃ͕͘͢͠ͳΔ wεϖγϟϧνʔϜͷ͕݁͘͢͠ͳΔ w ։ൃϝϯόʔͷҠಈͱಉ࣌ʹαʔϏεΛԣஅٕͨ͠ज़ݟ ͷަྲྀ͕׆ൃʹͳΔ w
ͦͷαʔϏεͷಥൃతͳٕज़՝ʹରͯ͠ɺ͙͢ʹผνʔ ϜؚΊͯͨશΤϯδχΞͰऔΓΉ͜ͱ͕Ͱ͖Δ ΦʔόʔϔουΛখ͘͢͞ΔϝϦοτ
w ։ൃ։࢝·ͰͷΦʔόʔϔουݮͷύλʔϯʹɺେ͖ ͭ͘ʹྨ͞ΕΔ w+0*/͢Δϝϯόʔ͕ͯ͠ݮ͢Δύλʔϯ w ύλʔϯΛ͓͚ͬͯࣄલ४උͳ͠Ͱ࣮ߦՄೳ w ͨͩ͠εέʔϧ͠ͳ͍ wαʔϏεͱͯ͠ࣄલʹݮ͓ͯ͘͠ύλʔϯ w
εέʔϧ͢Δ w ͨͩ͠αʔϏεͷมԽʹӨڹ͢ΔͳΒৗʹΞοϓσʔ τ͕ඞཁ Φʔόʔϔουݮύλʔϯ
ྫ͑ࢲ͕࣮ફͨ͠ Φʔόʔϔουݮ
είʔϓΛߜΔ
wॎʹείʔϓΛߜͬͯѲ ͢Δ͜ͱͰΦʔόʔϔου Λݮ wੵΈ্͛Δඞཁ͕͋Δͷ ͰϐϥϛουܕʹͳΔ ʢλϫʔܕʹͳΓʹ͘ ͍ʣ είʔϓΛߜΔ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔
ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ ͲͷΑ͏ͳίʔυ͔ ։ൃ
w αʔϏε֓ཁʢαʔϏεཧղϨΠϠʔʣΛείʔϓΛߜͬ ͯѲ͢Δ w ʮͲͷΑ͏ͳϢʔβ͕͜ͷαʔϏεΛར༻͍ͯ͠ΔͷͰ ͔͢ʁʯ w ϢʔβͷಛੑʹΑ࣮ͬͯͷํ͕มΘΔ w ʮͲͷΑ͏ͳαʔϏεͱ࿈ܞΛ͍ͯ͠ΔͷͰ͔͢ʁʯ
w ࿈ܞͯͨ͠ΒϩάΠϯ࿈ܞͯͦ͠͏ είʔϓΛߜΔ
w σʔλϕʔεͷઃܭʢσʔλετΞཧղϨΠϠʔʣΛείʔϓΛ ߜͬͯѲ͢Δ w ʮϢʔβʔςʔϒϧͬͯͲΕͰ͔͢ʁʯ w ʮϑϨʔϜϫʔΫʢ03.ʣͬͯԿΛ͍ͬͯ·͔͢ʁʯ w 03.ʹΑͬͯίʔυ͔Β࣮ࡍͷϦϨʔγϣϯΛѲͰ͖ Δ
w είʔϓΛߜͬͯιʔείʔυΛಡΈղ͘ʢίʔυϨΠϠʔʣ w ʮϩάΠϯϖʔδͬͯ͜ͷ63-͚ͩͰ͔͢ʁʯ w ʮ)551ϦΫΤετͷΤϯτϦʔϙΠϯτΛڭ͍͑ͯͩ͘͞ʯ είʔϓΛߜΔ
ઐ༻4MBDLνϟϯωϧΛ࡞Δ
w ։ൃ͕يಓʹͷΔ·Ͱͷઐ༻4MBDLνϟϯωϧΛ࡞ͬͯɺ ͦ͜Ͱ͋ΒΏΔ࣭ٙɺͭͿ͖Λॻ͘ wʮࢲ͕௨Δ։ൃ։࢝·ͰͷಓͷΓ͖ͬͱ࣍ͷਓ௨Δʯ w ઐ༻ʹ͢Δ͜ͱͰλΠϜϥΠϯΛʮ։ൃ։࢝·Ͱͷʯ ʹߜΕΔ w 4MBDLͰ࣭Λ͍ͯ͠Δ͚ͩͰɺ։ൃ։࢝·Ͱͷͭ·ͮ ͖ϙΠϯτ͕ू͞Εͯίεύ͕͍͍
w ʮ࣭͗ͯ͢͠5-͕ྲྀΕͯ͠·͏ʯΈ͍ͨͳ৺ඞཁͳ ͍ɻͳͥͳΒઐ༻͔ͩΒ w ༗༻ͳͷυΩϡϝϯτԽɺيಓʹͷͬͨΒBSDIJWF ઐ༻4MBDLνϟϯωϧΛ࡞Δ
ดͨ͡։ൃڥΛखʹ͍ΕΔ
w ༻ҙ͞Ε͍ͯͨͷ7BHSBOUڥ ڞ௨σʔλϕʔε ϝʔ ϧαʔό w σβΠφʔར༻͢ΔͨΊɺ։ൃڥߏஙίετΛখ͞ ͨ݁͘͠Ռͩͱ༧ w ͏গ͠ґଘੑͳ͘ڥΛ࡞ΕΔΑ͏ʹͳΔͱΑΓίετ
͕খ͘͞ͳΓͦ͏ʢڥϨΠϠʔͷվળʣ w %PDLFSͰ։ൃʹඞཁͳڥ͚ͩʹ͢Δ w ϝʔϧૹ৴ػೳϝʔϧαʔόͳ͠ͰڥΛ༻ҙ͓ͯ͘͠ ͱศརͦ͏ ดͨ͡։ൃڥΛखʹ͍ΕΔ
%PDLFS 1)1 TFOENBJM # docker-compose.yml version: '3' services: www: image:
php:latest volumes: - ./maildir:/path/to/maildir - ./sendmail.ini:/etc/php/conf.d/sendmail.ini - ./mail.sh:/usr/local/bin/mail.sh # sendmail.ini sendmail_path = /usr/local/bin/mail.sh # mail.sh cat - >> /path/to/maildir/sendmail_out ࢀߟIUUQTRJJUBDPNTBXBOPCPMZJUFNTCBCFFCEDBF
؍ଌͰ͖֤ͨϨΠϠʔͷΦʔόʔϔουݮ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ ͲͷΑ͏ͳίʔυ͔ ։ൃ Πϯϑϥߏਤ
1)1%PD *%& ։ൃڥͷ%PDLFSԽ αʔϏεϔϧϓ σϓϩΠͷ$IBUCPUԽ ςετίʔυ ϚΠάϨʔγϣϯϑΝΠϧ 1VMM3FRVFTU ϑϨʔϜϫʔΫ
w ։ൃ։࢝·ͰͷΦʔόʔϔουݮ࣮༷ʑͳϨΠϠʔ Ͱ࣮ࢪ͍ͯ͠Δ͜ͱ͕Θ͔Δ w ͬͱ৫ͱͯ͠ҙࣝͯ͠ઓུతʹ࣮ࢪ͢Δ͜ͱ͕Ͱ͖Ε ɺΑΓߴ͍ޮՌΛಘΔ͜ͱ͕Ͱ͖ΔͷͰͳ͍͔ʁ w l։ൃ։࢝·ͰͷΦʔόʔϔουzݮύλʔϯΛͬͱந Խͯ͠ମܥԽͯ͠Ͱ͖ΔͷͰͳ͍͔ʁ w
ͬͱใ͕ཉ͍͠ l։ൃ։࢝·ͰͷΦʔόʔϔουzݮ
l։ൃ։࢝·ͰͷΦʔόʔϔουz Λٕज़ʢΤϯδχΞϦϯάʣͰ ݮ͢Δ
w ਓྗͰͳ͘ɺٕज़ʹΑͬͯ։ൃ։࢝·ͰͷΦʔόʔϔο υΛݮͰ͖ΔΈΛఏڙ͢Δ w ٕज़ʹΑͬͯఏڙͰ͖Δͱ͍͏͜ͱʮ൚༻ੑ͕ߴ͍ʯ ʮ࠶ݱੑ͕͋Δʯͱ͍͏͜ͱ w ٕज़ͷੵΈॏͶʹΑͬͯʮ൚༻తʹʯʮ࠶ݱͯ͠ʯΦʔόʔ ϔουΛݶΓͳ͘খ͘͞Ͱ͖ΔΑ͏ʹͳΔͱɺ৫ͱͯ͠ ܧଓͯ͠ϝϦοτΛಘΔ͜ͱ͕Ͱ͖Δɻ
wͦͯ͠ɺΦʔόʔϔου͕খ͍͜͞ͱΛલఏͱͨ͠৫Λ ࡞Δ͜ͱ͕Ͱ͖Δɻ l։ൃ։࢝·ͰͷΦʔόʔϔουzΛٕज़Ͱݮ͢Δ
ٕज़ʹΑΔ l։ൃ։࢝·ͰͷΦʔόʔϔουz ݮͷྫ
શαʔόͷϢʔβϩʔϧ ͷίʔυԽ
w 45/4BMMPXTZPVUPFBTJMZNBOBHF -JOVYVTFSTXJUITJNQMF50.-CBTFE DPOpHVSBUJPO w *UDPOTJTUTPGTFSWFSBOEDMJFOU JNQMFNFOUBUJPO XIJDISFRVJSFTPOMZB GFXTUFQTUPJOTUBMM w
.PSFPWFS ZPVDBOVTFJUXJUIFYJTUJOH VTFSNBOBHFNFOUTZTUFNTTVDIBT -%"1 w IUUQTTUOTKQ
w ϖύϘͷ ͨͿΜ શαʔόʹల։͞Ε͍ͯΔ͜ͱͰɺ50.- ϑΝΠϧΛमਖ਼ͨ͠1VMM3FRVFTU͕Ϛʔδ͞ΕΔ͚ͩͰ αʔό܈ͷ44)ΞΫηεݖΛಘΔ͜ͱ͕Ͱ͖Δ wݖݶ͕(JUͰཧ͞Ε͍ͯΔͷڧྗ w ͋·Γʹࣗવʹ͋Γ͗ͯ͢ϖύϘύʔτφʔΕ͕ͪ w
Կ͋Δ͔Θ͔Βͳ͍αʔόΛӡ༻͢Δ͏͑Ͱɺ45/4ʹ ΑΔڥϨΠϠʔͰͷΦʔόʔϔουݮ૬େ͖͍ 45/4
σʔλϕʔευΩϡϝϯτͷ ܧଓతΠϯςάϨʔγϣϯ ͱपลใͱͷϦϯΫ
w UCMTJTB$*'SJFOEMZUPPMGPSEPDVNFOU BEBUBCBTF XSJUUFOJO(P w %PDVNFOUBEBUBCBTFBVUPNBUJDBMMZ JO('.GPSNBU0VUQVUEBUBCBTF TDIFNBJONBOZGPSNBUT w 4JOHMFCJOBSZ$*'SJFOEMZ
w 4VQQPSUNBOZEBUBCBTFT w 1PTUHSF42-.Z42-42-JUF42-4FSWFS #JH2VFSZ"NB[PO3FETIJGU$MPVE4QBOOFS w 8PSLBTMJOUFSGPSEBUBCBTF w IUUQTHJUIVCDPNL-P8UCMT
w σʔλϕʔευΩϡϝϯτΛੜͰ͖Δ͚ͩͰͳ͍ w $*ʹΈࠐΉ͜ͱͰυΩϡϝϯτͷߋ৽ΕΛػցతʹ͙͜ͱ ͕Ͱ͖ΔͷͰɺৗʹ࠷৽ͷঢ়ଶΛอͯΔ w ࣮σʔλϕʔεʹ"-5&3͢Δ͜ͱͳ͘ίϝϯτϦϨʔγϣϯΛ ՃฤूՄೳ w υΩϡϝϯτΛ.BSLEPXOͰग़ྗͰ͖ΔͷͰɺιʔείʔυͱಉ
͡ϦϙδτϦʹίϛοτ͢Δ͜ͱͰɺςʔϒϧͷΧϥϜͱιʔε ίʔυΛϒϥβ্ͰಡΜͰࣈͷ͝ͱ͘ϦϯΫ͢Δ͜ͱ͕Ͱ͖Δ w σʔλετΞཧղϨΠϠʔΛܧଓతʹαϙʔτ UCMT
$ brew install k1LoW/tap/tbls $ cat .tbls.yml dsn: mysql://dbuser:dbpass@$dbhost:3306/dbname docPath:
docs/schema $ tbls doc
طଘͷσʔλϕʔεΛରʹ͍͖ͳΓtbls docΛ࣮ߦͯ͠υΩϡϝϯτΛੜ ίϛοτ ϒϥϯνΛͬͯςʔϒϧͷ֓ཁΛ͍ͬͯΔϝϯόʔ͔ΒώΞϦϯάΛ͠ͳ ͕ΒUCMTZNMΛຒΊ͍ͯ͘ w ରςʔϒϧɾରΧϥϜͷ֓ཁ
w ςʔϒϧͷϦϨʔγϣϯ w ॏཁͳͱ͜ΖA<MJOL> 63- AΛ͔ͭͬͯυΩϡϝϯτͱιʔείʔυΛ ϦϯΫ 1VMM3FRVFTUϕʔεͰ֬ೝͯ͠Β͏ɺ࠷ޙʹtbls docΛ࣮ߦͯ͠υΩϡϝ ϯτΛ࠶ੜ ίϛοτ ҎԼ܁Γฦ͠ ܧଓతυΩϡϝϯτΞοϓσʔτ
w .JDSPTFSWJDFTڥαʔϏεԣஅͰͷ։ൃʹରԠͰ͖ΔΑ͏ʹɺ σʔλϕʔεΛ·͍ͨͩςʔϒϧϦϨʔγϣϯΛදݱͰ͖ΔΑ͏ʹ ͢Δ w /BNFTQBDF w 7FSTJPOJOH w 3%#.4͔ΒαϙʔτൣғΛ͞Βʹ͛Δ
w ֤छ03.ͱͷΠϯςάϨʔγϣϯ w %BUBCBTFEPDVNFOUBTB4FSWJDF UCMT/&95ʢߏʣ
l։ൃ։࢝·ͰͷΦʔόʔϔουz
w ్த+0*/Ͱ։ൃ։࢝·Ͱʹඞཁͳ͜ͱɺθϩ͔Β։ൃ͢Δͱ͖ͱ ಉ͡ w ҧ͏ͷ͢ͰʹαʔϏε͕ଘࡏͯ͠։ൃ͕ਐߦ͍ͯ͠Δ͔Ͳ͏͔ ͚ͩɻ࠷ॳʹΓࠐΉॴಉ͡ɻ w ్த+0*/ͷϊϋʹ։ൃ։࢝·ͰͷΦʔόʔϔουΛখ͘͢͞Δ ํ๏ w
ΦʔόʔϔουΛݮ͢Δͱ͍͏͜ͱɺ৫ͷ͋ΓํʹΠϯύΫ τΛ༩͑ΒΕΔ͘Β͍ॏཁͳ՝ͳͷͰੵۃతʹߟ͍͖͍͑ͯͨ w ͥͻօ͞ΜͷݟΛڞ༗͍ͯͩ͘͠͞ʂ ·ͱΊ
5IBOLZPV ࠷৽ͷ࠾༻ใΛνΣοΫˠ !QC@SFDSVJU