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
Parsing case study in Go / Go Conference mini 2...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ken’ichiro Oyama
December 01, 2023
Technology
1.6k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Parsing case study in Go / Go Conference mini 2023 Winter IN KYOTO
https://kyotogo.connpass.com/event/285351/
Ken’ichiro Oyama
December 01, 2023
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.2k
analysis パッケージの仕組みの上でMulti linter with configを実現する / Go Conference 2025
k1low
1
930
Flight recorder at the application layer (NOT the FlightRecoder newly added at Go 1.25) / Fukuoka.go #22
k1low
0
210
ソフトウェア開発におけるインターフェイスという考え方 / PHPerKaigi 2025
k1low
12
6.5k
Parsing HCL/CUE / Fukuoka.go #21
k1low
0
11k
実践 net/http Middleware パターン / Kizuku.go Vol.1
k1low
2
490
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
AI Search (Foundry IQ) におけるRAGデータの準備と配置
ryomaru0825
1
130
AI時代、つくる力を自分たちの手に。 ──電通×KAG、アジャイルとAI駆動開発で挑む開発の変革
yuukiyo
3
450
"計画的無茶振り"を通してAIネイティブ世代の新人を育てる
subroh0508
1
140
Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援
asmz
0
400
Claude Codeから見る、エンジニアの世界の変容とその先
oikon48
8
5.1k
re:Invent の去年のスケジュールを公開します!
miu_crescent
PRO
0
150
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
220
アクセラレーターで実現するServiceNow活用の高速化 / ServiceNow World Forum 2026
visional_engineering_and_design
0
120
Patterns in AI Driven Software Development
akosma
PRO
0
430
AIで選択肢が広がった組織設計の理想と現実
konifar
16
7.5k
E2Eってつらくないですか?E2Eの管理コストを下げる手段とその実践
akaboshinit
6
2.9k
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
530
Featured
See All Featured
It's Worth the Effort
3n
188
29k
Navigating Team Friction
lara
192
16k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
290
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.6k
WENDY [Excerpt]
tessaabrams
14
40k
Optimising Largest Contentful Paint
csswizardry
37
4k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
450
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
820
Transcript
Parsing case study in Go খࢁ݈Ұ / GMO PEPABO inc.
2023.12.2 Go Conference mini 2023 Winter IN KYOTO 1
ࣗݾհ ٕज़෦ɹٕज़ج൫νʔϜ 2018 த్ೖࣾ খࢁ ݈Ұ Ken’ichiro Oyama গ࣮͠༻తͰখ͞ͳOSSΛॻ͘ͷ͕झຯɻ •
GitHub : k1LoW • Twitter : @k1LoW 2
GMOϖύϘʹ͍ͭͯ 3 https://pepabo.com
ΞδΣϯμ • ຊηογϣϯʹ͓͚Δύʔε • έʔεελσΟʢέʔεͱ࣮ͱֶͼʣ • ͓ΘΓʹ 4
5 ຊηογϣϯʹ͓͚Δύʔε
6 ຊηογϣϯʹ͓͚Δύʔε ύʔε • ຊηογϣϯʹ͓͚ΔύʔεͱʮจࣈྻόΠτྻ͔Βҙຯͷ͋ΔߏԽσʔλΛநग़͠׆༻ ͢Δ͜ͱʯΛࢦ͢ɻҰൠతͳʮύʔεʯͷఆٛΑΓগ͍͠ղऍɻ • จࣈྻόΠτྻ … string,
[]byte, io.Reader • ߏԽσʔλ … struct, map, slice, chan • ຊηογϣϯͰσγϦΞϥΠζσίʔυؚΉʢͳͷͰɺ͋·Γʮύʔεʯͷఆٛʹͩ͜ΘΒͳ͍ͰΒ͑Δͱ خ͍͠Ͱ͢🙏 ʣɻ
7 ຊηογϣϯʹ͓͚Δύʔε ύʔε • ύʔεΛʮࣈ۟ղੳʯͱʮߏจղੳʯʹ͚ͯߟ͑Δɻ • ࣈ۟ղੳ͚ͩΛ׆༻͢ΔͷύʔεʹؚΊΔɻ • ຊηογϣϯʹ͓͚Δʮࣈ۟ղੳʯͱʮߏจղੳʯҰൠΑΓগٛ͠ͷఆٛɻ •
ࣈ۟ղੳ … จࣈྻόΠτྻΛཁૉʢτʔΫϯʣͷྻʹղ͢Δ • ߏจղੳ … τʔΫϯྻΛҙຯΛөͨ͠ߏʹม͢Δ
έʔεελσΟ 8
9 README.mdͷ Ұ෦͚ͩࠩ͠ସ͑Δ
10 README.mdͷҰ෦͚ͩࠩ͠ସ͑Δ github.com/k1LoW/repin • README.mdͳͲɺෳߦʹΘͨΔจࣈྻͷҰ෦͚ͩΛࠩ͠ସ͑ΔͨΊͷπʔϧ/ϥΠϒϥϦ • ։࢝ΩʔϫʔυͱऴྃΩʔϫʔυΛࢦఆ͢ΔͱͦͷΩʔϫʔυؒͷจࣈྻΛࠩ͠ସ͑Δ • ྫ: ։࢝Ωʔϫʔυ
```console ɺऴྃΩʔϫʔυ ``` ʹͯ͠ίϚϯυͷϔϧϓͷग़ ྗΛ࠷৽ʹࠩ͠ସ͑ • ॲཧͷಛ • ͻͱ͔ͨ·ΓͷෳߦͷจࣈྻΛೖྗͱͯͦ͠ͷ్தͷจࣈྻΛࠩ͠ସ͑Δ • ෳߦΛ·ͱΊͯॲཧ͢Δඞཁ͕͋Δ • ܾ·ͬͨߏจͱ͍ͬͨͷͳ͍
11 README.mdͷҰ෦͚ͩࠩ͠ସ͑Δ ύʔεͷ࣮ • ࣈ۟ղੳΛbufio.ScannerͰ࣮ • ಠࣗbufio.SplitFuncΛॻ͘͜ͱͰΩʔϫʔυ֎ͱΩʔϫʔυؒͰׂ • ࣈ۟ղੳ݁ՌΛ Scan()
Ͱड͚औ͍ͬͯ͘ʢ []string ʣ • ॱ൪ʹΩʔϫʔυ֎ -> Ωʔϫʔυؒ -> Ωʔϫʔυ֎ -> … • ͋ͱΩʔϫʔυؒͷจࣈྻ͚ͩࠩ͠ସ͑ͭͭΈཱͯͯग़ྗ͢Δ͚ͩ
12 README.mdͷҰ෦͚ͩࠩ͠ସ͑Δ bufio.SplitFunc • bufio.Scanner.Split() Ͱઃఆ͢Δ͜ͱͰScan()ͷڍಈΛม͑Δ͜ͱ͕Ͱ͖Δ
13 ඪ४ग़ྗʹྲྀΕ͍ͯΔϩάΛ ύΠϓͰड͚औͬͯ৭͚͢Δ
14 ඪ४ग़ྗʹྲྀΕ͍ͯΔϩάΛύΠϓͰड͚औͬͯ৭͚͢Δ github.com/k1LoW/colr • ඪ४ೖྗʹྲྀΕΔϩάʹରͯ͠ࢦఆͨ͠จࣈྻʹϚονͨ͠Β͚ͦͩ͜৭͚Λ͢Δπʔϧ • ϩά ”Error” “status:500”
ͳͲΛڧௐ͢Δ͜ͱͰϩάΛΈ͘͢͢ΔͨΊͷͷ • tail -F /var/log/nginx/access.log | colr POST GET 404 500 search • ॲཧͷಛ • ೖྗऴ͕ෆ໌ͷετϦʔϜɻॱ࣍ॲཧ͍ͯ͘͠ඞཁ͕͋Δ • ୯ʹ৭͚ͳͷͰɺϩάͷߏจΛߟྀ͢Δඞཁͳ͍ɻ1ߦͮͭॲཧͯ͠ྑ͍ɻ
15 ඪ४ग़ྗʹྲྀΕ͍ͯΔϩάΛύΠϓͰड͚औͬͯ৭͚͢Δ ύʔεͷ࣮ • ࢦఆͨ͠จࣈྻ ( args ) ʹϚονͨ͠Β͚ͦͩ͜৭͚Λ͢Δ •
ೖྗos.Stdin ( io.Reader ) • ग़ྗ chan string • ࣈ۟ղੳ͍ͭͰʹ৭͚͢Δ
16 ඪ४ग़ྗʹྲྀΕ͍ͯΔϩάΛύΠϓͰड͚औͬͯ৭͚͢Δ ύʔεͷ࣮ʢHandle(context.Context, io.Reader) <-chan stringʣ • bufio.NewReader(os.Stdin) -> ReadString(‘\n’)Ͱߦ୯Ґʹׂ
• ߦ͝ͱʹ৭͚ ( Paint() ) • ෦࣮࣭strings.ReplaceAll • ৭͚݁ՌΛ chan stringʹྲྀ͢ • ʢ࣮ʣp.Handle()͕ඪ४ग़ྗΛड͚औͬ ͯྑ͍ • ʢ࣮ʣchan []byte Ͱྑ͍
17 VIEWςʔϒϧͰ༻͞Ε͍ͯΔ ςʔϒϧͷҰཡΛऔಘ͢Δ
18 VIEWςʔϒϧͰ༻͞Ε͍ͯΔςʔϒϧͷҰཡΛऔಘ͢Δ github.com/k1LoW/tbls • σʔλϕʔεͷεΩʔϚΛͱʹυΩϡϝϯτΛੜͯ͘͠ΕΔπʔϧ • VIEWςʔϒϧΛߏ͍ͯ͠ΔςʔϒϧͷҰཡΛυΩϡϝϯτʹදࣔ͢Δػೳ͕͋Δ • Ұ෦ͷσʔλϕʔεγεςϜͷΈରԠ •
ॲཧͷಛ • VIEWςʔϒϧͷDDLʢCREATE VIEW xxxx ASʣσʔλϕʔεγεςϜ͔ΒऔಘͰ͖Δ • ςʔϒϧҰཡ͕ཉ͍͚ͩ͠
19 VIEWςʔϒϧͰ༻͞Ε͍ͯΔςʔϒϧͷҰཡΛऔಘ͢Δ ύʔεͷ࣮ • ʮSQLΛSQLͱ͔ͯͬ͠͠Γʢࣈ۟/ߏจʣղੳ͢Δඞཁͳ͍ʯ • ࣈ۟ղੳΛbufio.ScannerͰ࣮ • ΫΥʔτΛؾʹ͠ͳ͕ΒτʔΫϯʹׂ͢Δ͚ͩ
20 VIEWςʔϒϧͰ༻͞Ε͍ͯΔςʔϒϧͷҰཡΛऔಘ͢Δ ςʔϒϧ໊ͷఆ • “FROM” ͔ “JOIN” ͷ࣍ͷτʔΫϯ͕ςʔϒϧ໊ ͱ͍͏ఆͰे •
ɺ“WITH” Ͱఆٛ͞ΕͨҰ࣌తͳςʔϒ ϧ໊͚ͩআ͘ • VIEWςʔϒϧͷDDLͷಛΛཧղ͓͚ͯ͠શ ͯΛτʔΫϯผ͢Δඞཁͳ͍
21 σʔλϕʔεʹྲྀΕΔ ύέοτΛղੳͯ͠ ߏԽΫΤϦϩάΛ࡞Δ
22 σʔλϕʔεʹྲྀΕΔύέοτΛղੳͯ͠ߏԽΫΤϦϩάΛ࡞Δ github.com/k1LoW/tcpdp • σʔλϕʔεʹྲྀΕΔύέοτΛղੳͯ͠σʔλϕʔεͷߏԽΫΤϦϩάΛ࡞͢Δπʔϧ • 3ύλʔϯʹରԠ 1. ΫϥΠΞϯτͱσʔλϕʔεͷؒʹTCPϓϩΩγαʔόͱͯ͠ىಈ 2.
libpcapΛͬͯtcpdumpͱಉ͡ΈͰύέοτΛΩϟϓνϟ͢Δ 3. tcpdump͕μϯϓͨ͠pcapϑΝΠϧΛղੳ͢Δ • ॲཧͷಛ • ෳͷΫϥΠΞϯτ͔Βͷଓ͕͋Δ • 1ͭͷTCPύέοτʹΫΤϦ͕ऩ·ΔͱݶΒͳ͍ • σʔλϕʔεϓϩτίϧҙຯͷ͋Δ௨৴ΫϥΠΞϯτ-αʔόؒͰԿճ͔ԟ෮͢Δ • 3ύλʔϯͷύέοτऔಘʹରԠ͢Δඞཁ͕͋Δ͕ύʔεॲཧڞ௨Խ͍ͨ͠
23 σʔλϕʔεʹྲྀΕΔύέοτΛղੳͯ͠ߏԽΫΤϦϩάΛ࡞Δ ύʔεͷ࣮ • TCPଓ͝ͱʹࣈ۟ղੳ͕ඞཁ • ࣍ͷTCPύέοτΛͭͨΊʹύέοτσʔλͷόοϑΝϦϯά͕ඞཁ • 3ύλʔϯʹରԠ͢ΔͨΊɺೖྗѻ͍͍͢ []byte
ʹͳΔ • ύέοτ͔Βҙຯͷ͋Δ୯ҐͰͷ []byte औಘͱσʔλϕʔεϓϩτίϧʹԊͬͨղੳ͕ಉ࣌ʹਐ ΉΠϝʔδ
24 σʔλϕʔεʹྲྀΕΔύέοτΛղੳͯ͠ߏԽΫΤϦϩάΛ࡞Δ ύέοτͷόοϑΝϦϯά • ύέοτ͔Βҙຯͷ͋Δ୯ҐͰͷ []byte औಘ • ҙຯͷ͋ΔαΠζ·ͰόοϑΝϦϯάͯ͠ ·ͱΊͯdumperʢσʔλϕʔεϓϩτίϧ
ղੳثʣʹ͢ • TCPଓͷ։࢝λΠϛϯάͰ key Λੜͯ͠ɺͦ ΕͧΕͰόοϑΝϦϯά
25 σʔλϕʔεʹྲྀΕΔύέοτΛղੳͯ͠ߏԽΫΤϦϩάΛ࡞Δ ύέοτͷղੳ • ߏจղੳͻͨ͢Β []byte Λσʔλϕʔεϓ ϩτίϧʹԊͬͯղੳ͍ͯ͘͠ͷΈ
26 ͜͜·Ͱͷֶͼ
27 ͜͜·Ͱͷֶͼ ࣈ۟ղੳέʔεʹΑͬͯࡶʹͰ͖Δ • ೖྗΛઌ಄͔ΒॱʹಡΈࠐΜͰ͍͘ͷ͕ϕʔγοΫͳख๏ • τʔΫϯʹׂ͢ΔͨΊʹઌಡΈͯ͠͡ΊͯτʔΫϯछผΛఆͰ͖Δ͜ͱ͕ଟ͍ • ઌಡΈʹٻΊΒΕΔཁ͕݅ෳࡶͰ͋Ε͋Δ΄Ͳࣈ۟ղੳͷ࣮͕͘͠ͳΔʢײʣ •
ҰํͰ • έʔεʹΑͬͯεϖʔε۠ΓͰτʔΫϯʹׂͰ͖ΔͳΒॳख strings.Split ͰࡁΉ߹ ͋Δ • έʔεʹΑͬͯશͯͷจࣈྻΛτʔΫϯʹ͢Δඞཁͳ͍ʢۭനվߦΛແࢹ͢Δͷͱ ಉ͡ʣ
28 ͜͜·Ͱͷֶͼ ࣈ۟ղੳʹଟஈฒߦͷબࢶ͕͋Δ • ٻΊΔτʔΫϯྻΛಘΔ·ͰͷղੳॲཧΛଟஈʹ͢Δͱ࣮͍͢͠߹͕͋Δ • ߦʹΑͬͯτʔΫϯׂ͕͞ΕΔ͜ͱ͕อূ͞ΕΔ߹ʮ·ͣߦ͝ͱʯʮͦͯ͠ߦ୯Ґ Ͱղੳʯʹଟஈʹ͢ΔͳͲ • ฒߦͯ͠ղੳͯ͠ෳor୯ҰͷߏԽσʔλΛಘΔ߹͋Δʢྫ:
ϚϧνύʔτΞοϓϩʔυʣ • ʮଟஈʯʮฒߦʯ͕͍࣮͢͠Λ৺͕͚Δͱɺඞཁͳ࣌ʹchannelgoroutineΛ͍ɺॲཧ ޮΛ্͛Δ͜ͱͰ͖Δ
29 ͜͜·Ͱͷֶͼ bufio.ScannerʢVS bufio.Reader VS []rune VS []byteʣ • ҰʹಡΈࠐΉόΠτͷ্ݶ͕Θ͔͍ͬͯΔ߹ʢ͋͘͠Δఔখ͍͞ͱΘ͔͍ͬͯΔ
߹ʣbufio.Scannerͷ͍উख͕ྑ͍ • ؆қͳτʔΫϯׂʹ͓͍ͯbufio.SplitFuncͷ֦ு͕ޮ͘ • ಡΈࠐΉόΠτͷ্ݶ͕Θ͔͍ͬͯΔͳΒ bufio.Scanner.Buffer() Ͱ্ݶΛઃఆͰ͖Δ • ಡΈࠐΉόΠτ͕Θ͔Βͳ͍߹ʢେ͖͘ͳΔՄೳੑ͕େ͖͍߹ʣ bufio.Reader • จࣈͱͯ͠ύʔε͢Δ߹[]runeͰʢྫ: github.com/goccy/go-yaml/scannerʣ • ϓϩτίϧͷϔομͳͲαΠζ͕໌Β͔ͳͷͷ߹[]byteͰ
30 ֤छίʔυΧόϨοδϨϙʔτ͔Β ใΛऔಘ͢Δ
31 ֤छίʔυΧόϨοδϨϙʔτ͔ΒใΛऔಘ͢Δ github.com/k1LoW/octocov • ίʔυΧόϨοδΛऩूɾϨϙʔτ͢Δπʔϧ • πʔϧͷಛੑ্ɺαϙʔτ͢ΔΧόϨοδϑΥʔϚοτଟ͚Εଟ͍΄Ͳྑ͍ • v0.54.6Ͱͷαϙʔτ …
Go coverageɺLCOVɺSimpleCovɺCloverɺCoberturaɺJaCoCo • ॲཧͷಛ • େ1ͭͷϑΝΠϧ • ͱͱΧόϨοδϨϙʔτϑΝΠϧϚγϯϦʔμϒϧͳߏʹͳ͍ͬͯΔ
32 ֤छίʔυΧόϨοδϨϙʔτ͔ΒใΛऔಘ͢Δ ύʔεͷ࣮ • ͘ΒΕͨϚγϯϦʔμϒϧͳϑΥʔϚοτͳͷͰࣈ۟ղੳ͔Βߏจղੳͷ్த·Ͱύοέʔ δͷར༻ͳͲͰγϣʔτΧοτͰ͖Δ • SimpleCov … JSON
• CloverɺCoberturaɺJaCoCo … XML • Go coverage … ͢Ͱʹύοέʔδ͕ఏڙ͞Ε͍ͯΔʢgolang.org/x/tools/coverʣ • LCOV … ಠ࣮ࣗ
33 ֤छίʔυΧόϨοδϨϙʔτ͔ΒใΛऔಘ͢Δ ΧόϨοδϑΥʔϚοτͷύʔε • XMLJSONͰߏԽͰ͖ΕͦΕΛΧόϨοδ ϑΥʔϚοτͷ༷ʹ߹ΘͤͯɺΧόϨοδͷߏʹ Ϛοϐϯά͢Εྑ͍ • ʢಠ࣮ࣗͱݴ͑ʣLCOVϚγϯϦʔμϒϧʹ ͳ͍ͬͯΔͷͰࣈ۟ղੳ
bufio.Scanner ͰेରԠ Ͱ͖Δɻͦͷ͋ͱଞͷΧόϨοδϑΥʔϚοτͱಉ ͡ɻ
34 YAMLϑΝΠϧͷҰ෦Ͱ มల։Λ͢Δ
35 YAMLϑΝΠϧͷҰ෦Ͱมల։Λ͢Δ github.com/k1LoW/expand • YAMLϑΝΠϧͷҰ෦Ͱมల։Λ͢ΔػೳΛ࡞Δ͜ͱ͕Ͱ͖ΔϥΠϒϥϦ • ڥมల։ͱ͔ɺGitHub ActionsͷWorkflow YAMLͷΑ͏ͳมల։ͱ͔ •
ॲཧͷಛ • มల։ͨ͋͠ͱͷߏจղੳYAMLύʔαʔʹ͍ͤͨ • env DEBUG=true ͷจࣈྻ true Λͦͷ··YAMLύʔαʔʹͯ͠boolͱ͍ͨ͠ • JSONΛͨ͠ΒYAMLͷߏจͱͯ͠ల։͞Εͯཉ͍͠ • ͱ͍͑ɺల։ͨ͠ͷߏͰల։લͷYAMLͷߏจ͕ݩͱେ͖ͣ͘ΕΔΑ͏ͳ࣮Ͱ ͍͚͋ͬͯͳ͍ʢ text/template ͳͲʹΑΔมల։Ͱ͍͠ͱஅ ʣ
36 YAMLϑΝΠϧͷҰ෦Ͱมల։Λ͢Δ ύʔεͷ࣮ • YAMLจࣈྻͷࣈ۟ղੳΛઐ༻ͷύοέʔδʢgithub.com/goccy/go-yaml/lexerʣʹͤɺਖ਼͘͠ ղ͞ΕͨτʔΫϯ͝ͱʹมల։ॲཧΛ࣮͢Δ • τʔΫϯ͝ͱͰ͋Εݩͷߏ่͕ΕΔՄೳੑ͕খ͍͞ • มల։ޙͷτʔΫϯΛ࠶YAMLͷจࣈྻʹ͢ʢ͜͜·Ͱ͕expandͷػೳʣ
• ͦͯ͠࠶YAMLύʔαʔͰύʔεͤ͞Δ
37 YAMLϑΝΠϧͷҰ෦Ͱมల։Λ͢Δ ύʔεͷ࣮ʢReplaceYAMLʣ • lexer.Tokenize()ͰτʔΫϯྻΛಘͯஔՄೳͳτʔΫϯ͝ͱʹrepFnͰஔΛ͢Δ • ஔޙͷτʔΫϯΛݩͷYAMLจࣈྻʹΈཱͯΔ
38 ੜ͞ΕͨGoͷίʔυΛ ͞Βʹॻ͖͑Δ
39 ੜ͞ΕͨGoͷίʔυΛ͞Βʹॻ͖͑Δ github.com/k1LoW/sqlc-go-one-or-fail • sqlcʢsqlc-goʣͰੜ͞ΕͨGoͷίʔυΛ͞Βʹॻ͖͑Δπʔϧ • :one Ͱੜ͞ΕͨΫΤϦϝιουͷॲཧΛ0ߦͷ͚࣌ͩͰͳ͘1ߦΑΓଟ͘ͷߦΛऔಘͰ͖ ͨ߹Τϥʔʹ͢ΔΑ͏ʹमਖ਼͢Δʢ1ߦऔಘ͔͠ڐ༰͠ͳ͍Α͏ʹ͢Δʣ •
ॲཧͷಛ • ରGoͷίʔυ • ੜ͞ΕͨGoͷίʔυͳͷͰੜ͞Εͨίʔυʹύλʔϯ͕͋Δ
40 ੜ͞ΕͨGoͷίʔυΛ͞Βʹॻ͖͑Δ ύʔεͷ࣮ • GoͷίʔυΛGoͷίʔυͱͯ͠มߋՕॴΛಛఆ͢Δ • GoͷASTͷύοέʔδʢgo/astɺgolang.org/x/tools/go/ast/astutilʣΛ׆༻ • มߋՕॴͷAST͔ΒඞཁͳใΛൈ͖ग़্ͨ͠Ͱɺࠩ͠ସ͑ΔASTΛੜͯࠩ͠͠ସ͑ɻ
41 ੜ͞ΕͨGoͷίʔυΛ͞Βʹॻ͖͑Δ ύʔεͷ࣮ʢRewrite(ctx context.Context, p string, w io.Writer) errorʣ •
astutil.Apply() ΛͬͯASTΛࠩ͠ସ͑ ͍ͯΔ • ੜ͞ΕͨGoͷίʔυͳͷͰɺ͋Δఔ ϧʔϧԽ͞Ε͍ͯΔͨΊɺࠩ͠ସ͑ରΛ ಛఆ͢ΔͨΊͷఆ݅ͦ͜·Ͱ࡞Γࠐ Ήඞཁ͕ͳ͍
42 ͜͜·Ͱͷֶͼ
43 ຊηογϣϯʹ͓͚Δύʔε ߏจղੳ͕ඞཁͩͬͨΓৄࡉͳࣈ۟ղੳ͕ඞཁͳύʔε࣮ίετ͕ߴ͍ • ղੳ͍ͨ͠ߏจʹΑ࣮͕ͬͯେ͖͘ҟͳΔʢͦΕͦ͏ʣ • ϓϩάϥϛϯάݴޠͦΕʹྨ͢ΔͷநߏจʢASTʣʹͳΔ͜ͱ͕ଟ͍ • ͦΕʹྨ͢Δͷ …
JSONYAMLͦͷ࠷ͨΔྫ • ߏจղੳͷख๏ଟ͘ఏҊ͞Ε͍ͯΔ • ʢಛʹAST͕ඞཁͳϨϕϧͷʣύʔαΛಠࣗʹ։ൃ͢Δͷ͔ͳΓίετ͕ߴ͍ͨΊɺαʔυ ύʔςΟؚΊదͳύοέʔδʹͤΔͷ͕ྑ͍
44 ͦͷଞ: ύοέʔδΛ׆༻͍ͯ͠Δ έʔε
45 ͦͷଞ: ύοέʔδΛ׆༻͍ͯ͠Δέʔε έʔε͝ͱʹ׆༻͍ͯ͠Δศརύοέʔδ • .ssh/config Λ༻ͨ͠SSHଓʢgithub.com/k1LoW/sshcʣ • ssh_configͷύʔε …
github.com/kevinburke/ssh_config • .protoϑΝΠϧͷύʔεͱͦΕΛར༻ͨ͠gRPC௨৴ʢgithub.com/k1LoW/grpcstubʣ • .protoϑΝΠϧͷύʔε … github.com/bufbuild/protocompile • OpenAPI SpecʹΑΔHTTPϦΫΤετ/ϨεϙϯεͷόϦσʔγϣϯʢgithub.com/k1LoW/runnʣ • OpenAPIυΩϡϝϯτͷύʔε … github.com/getkin/kin-openapi • άϧʔϐϯάͰ͖ΔProcess exporter for Prometheusʢgithub.com/k1LoW/grouped_process_exporterʣ • /procʢprocfsʣ ͷύʔε … github.com/prometheus/procfs
͓ΘΓʹ 46
• ຊηογϣϯͰʮύʔεʯͷ࣮ʹ͍༷ͭͯʑͳέʔεΛհͨ͠ɻ • ࠓճΑΓଟ͘ͷέʔεΛհ͢Δ͜ͱͰԿ͔͠Βͷؾ͖͕ͮಘΒΕΕͱ͍͏ظΛࠐ Ίͯߏͨ͠ɻ • Ұݴʹʮύʔεʯͱ͍ͬͯέʔε͝ͱʹಛ͕͋Γɺ࣮ํ๏͕͋Δɻ • ҰํͰέʔεΛ၆ᛌͯ͠ΈΔͱڞ௨͍ͯ͠Δύʔλϯ͋ΔΑ͏ʹݟ͑Δɻ •
ύʔεύοέʔδΛఏڙͯ͘͠Ε͍ͯΔOSSϝϯςφͷํʹײँ͔͠ͳ͍ɻ • ֤έʔεͷ۩ମతͳ࣮Λ֬ೝ͍ͨ͠߹ɺհͨ͠έʔεશͯOSSʹͳ͍ͬͯΔͷͰɺ֤Ϧ ϙδτϦͰࢀরՄೳʢPull Requestͬͯ·͢ʂʣɻ 47 ͓ΘΓʹ ͓ΘΓʹ
Thank You! Thank You! 48