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
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.7k
Design and implementation of "Markdown to Google Slides" / phpconfuk 2025
k1low
1
1.1k
analysis パッケージの仕組みの上でMulti linter with configを実現する / Go Conference 2025
k1low
1
890
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.4k
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
ユーザー価値を届け続けるためにウォンテッドリーが大切にしている文化
kotaminato
0
190
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
3
2.5k
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
cscengineer
PRO
0
140
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
690
Vibe Coding で作ったプロダクトをどう安全に動かすか / How to Safely Run Products Built with Vibe Coding
glidenote
0
450
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
140
新機種発売前に見直そう!端末移行で再ログインが要るアプリ・要らないアプリは何が違うのか 〜シームレスに再開できる設計と実装〜
zozotech
PRO
0
220
Railsのように考える: See through the Master
snoozer05
PRO
5
1.2k
`t*(42&t>>10)`だけで音楽が鳴る、Swiftで実装するBytebeat / iOSDC Japan 2026
yutailang0119
0
120
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
0
180
CLIライブラリ開発を支える技術
htnabe
0
140
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
9
4.9k
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
7k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
How to Ace a Technical Interview
jacobian
281
24k
Utilizing Notion as your number one productivity tool
mfonobong
4
590
Site-Speed That Sticks
csswizardry
13
1.5k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8k
Automating Front-end Workflow
addyosmani
1369
210k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Prompt Engineering for Job Search
mfonobong
0
450
Product Roadmaps are Hard
iamctodd
55
13k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
230
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
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