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
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
900
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
470
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
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
330
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
310
Coil3を内部実装から読み解く~キャッシュ戦略とAVIF画像の描画〜/nikkei-tech-talk50
nikkei_engineer_recruiting
0
140
特殊変数大全
dak2
0
160
Antigravity SDK for the Java Developer
glaforge
0
230
地方移住と都心キャリアの両立は「金・時間・人」のリソースをフル活用すれば実現できる!〜Snowflake女子会 vol.8
snowwmn0824
0
130
[Kiro Meetup #7] Kiro Crew Dive Deep
konippi
0
410
AI駆動開発で仕様はどこまで書くべきか? ― 人とAIの責務境界から考える開発プロセスの実践
takahiromatsui
1
210
個別開発で終わらせない。 現場の課題をプロダクトの強さに変える StockmarkのFDE
ktkrhr
0
340
Azure Copilot Resiliency Agentをいろいろ試してみる
tomokusaba
0
130
20260915deck.gl-raster を使ってみた
rena1208
0
120
AIエージェントを安全で速い現場監督にする:Jev・Obsidian・メタハーネス
x5gtrn
PRO
0
140
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
830
Rails Girls Zürich Keynote
gr2m
96
14k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
490
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
A better future with KSS
kneath
240
18k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
750
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
340
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
540
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Unsuck your backbone
ammeep
672
58k
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