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.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
910
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
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.2k
生成AIで高い生産性を求められて、 悩み、乗り越えた話
mot_techtalk
2
150
契約書画像からの情報抽出に特化した視覚接地モデルを育てる話
sansantech
PRO
1
160
OpenSharing について熱く語る〜AI アセットの共有について〜
kameitomohiro
0
250
AIは爆速なのに、私が詰まっていた話 ― 音声入力と鳴くマスコットでボトルネックを削る
yama3133
0
590
パッチ更新でterraform initが落ちた日
grimoh
1
120
自分で立ててみるLLMサービス
y_sera15
0
160
ファミコンでPHPを動かす / PHP on the Famicom side b
tomzoh
0
140
しろおびから始める!ログ活用の第一歩
shumei_ito
0
870
Cognition AI Japan - ウェビナー2_テストQA_運用監視
cogakira
0
130
夫婦で子育てするための育児標準化
codmoninc
PRO
0
130
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
330
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Side Projects
sachag
456
43k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
The Language of Interfaces
destraynor
162
27k
The Invisible Side of Design
smashingmag
301
52k
How to Ace a Technical Interview
jacobian
280
24k
Building an army of robots
kneath
307
47k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
YesSQL, Process and Tooling at Scale
rocio
174
15k
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