Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Continuous Documentation - CI/CDパイプラインを活用した文書化技...
Search
Ken’ichiro Oyama
September 28, 2021
Technology
1
720
Continuous Documentation - CI/CDパイプラインを活用した文書化技術 - / Pepabo Tech Conference #16
https://pepabo.connpass.com/event/225504/
Ken’ichiro Oyama
September 28, 2021
Tweet
Share
More Decks by Ken’ichiro Oyama
See All by Ken’ichiro Oyama
analysis パッケージの仕組みの上でMulti linter with configを実現する / Go Conference 2025
k1low
1
370
Flight recorder at the application layer (NOT the FlightRecoder newly added at Go 1.25) / Fukuoka.go #22
k1low
0
100
ソフトウェア開発におけるインターフェイスという考え方 / PHPerKaigi 2025
k1low
10
5.7k
Parsing HCL/CUE / Fukuoka.go #21
k1low
0
9.3k
実践 net/http Middleware パターン / Kizuku.go Vol.1
k1low
2
360
Cleanup handling in Go / Go Conference 2024
k1low
7
3.9k
CI/CDがあたりまえの今の時代にAPIテスティングツールに求められていること / CI/CD Test Night #7
k1low
18
12k
Command-line interface tool design / PHPerKaigi 2024
k1low
8
3.5k
gostyle IS NOT Go Style / Fukuoka.go#19 Reboot
k1low
1
310
Other Decks in Technology
See All in Technology
GPUをつかってベクトル検索を扱う手法のお話し~NVIDIA cuVSとCAGRA~
fshuhe
0
290
20251027_findyさん_音声エージェントLT
almondo_event
2
510
Zero Trust DNS でより安全なインターネット アクセス
murachiakira
0
130
知覚とデザイン
rinchoku
1
680
新米エンジニアをTech Leadに任命する ー 成長を支える挑戦的な人と組織のマネジメント
naopr
1
310
ゼロコード計装導入後のカスタム計装でさらに可観測性を高めよう
sansantech
PRO
1
590
.NET 10のBlazorの期待の新機能
htkym
0
160
入院医療費算定業務をAIで支援する:包括医療費支払い制度とDPCコーディング (公開版)
hagino3000
0
130
AI機能プロジェクト炎上の 3つのしくじりと学び
nakawai
0
180
実践マルチモーダル検索!
shibuiwilliam
2
460
GCASアップデート(202508-202510)
techniczna
0
140
ViteとTypeScriptのProject Referencesで 大規模モノレポのUIカタログのリリースサイクルを高速化する
shuta13
3
240
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
How STYLIGHT went responsive
nonsquared
100
5.9k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6k
BBQ
matthewcrist
89
9.9k
Raft: Consensus for Rubyists
vanstee
140
7.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Why Our Code Smells
bkeepers
PRO
340
57k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.7k
Transcript
Continuous Documentation - CI/CDύΠϓϥΠϯΛ׆༻ͨ͠จॻԽٕज़ - খࢁ݈Ұ / GMO PEPABO inc.
2021.09.27 Pepabo Tech Conference #16 1
2 ࣗݾհ ٕज़෦ɹٕज़ج൫νʔϜ 2018 த్ೖࣾ খࢁ ݈Ұ Ken’ichiro Oyama গ࣮͠༻తͰখ͞ͳOSSΛॻ͘ͷ͕झຯɻ
ʢ࠷ۙྗΛೖΕ͍ͯΔOSS https://github.com/k1LoW/octocov ͱ͍͏ओʹ GitHub ActionsͰಈ͔͢ίʔυϝτϦΫεϨϙʔτج൫ʣ • GitHub : k1LoW • Twitter : @k1LoW
3 ΞδΣϯμ 1. υΩϡϝϯτͱ 2. γεςϜͱυΩϡϝϯτͷဃ 3. γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν 4. ܧଓతυΩϡϝϯςʔγϣϯ
5. ·ͱΊ
“υΩϡϝϯτ”ͱ 4
5 υΩϡϝϯτͱ ։ൃ։࢝·ͰͷΦʔόʔϔου
υΩϡϝϯτͱ 6 ։ൃऀ͕ɺࣝθϩͷঢ়ଶ͔ΒγεςϜΛཧղ͠։ൃΛ։࢝͢Δ·Ͱͷ࣌ؒίετΛɺ ຊൃදͰʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯͱݺͿʢʮΦϯϘʔσΟϯάͷίετʯͱ ͍ͬͨํ͕Ұൠత͔ʣ • ։ൃऀ͕γεςϜΛཧղ͍ͨ͠ͱ͖ • ։ൃऀ͕৽ͨʹγεςϜ։ൃʹࢀՃͨ͠ͱ͖ •
͘͠։ൃऀ͕ࣗͷ୲Ҏ֎ͷߏཁૉػೳΛཧղ͍ͨ͠ͱ͖ • γεςϜͰར༻͍ͯ͠Δٕज़ελοΫʹेͳݟ͕͋ͬͨͱͯ͠ɺ࣮։ൃ։ ࢝·Ͱʹखؒͱ͕͔͔࣌ؒΔ ։ൃ։࢝·ͰͷΦʔόʔϔου
υΩϡϝϯτͱ 7 ৽ن։ൃͷ߹ɺ࣮ࡍʹ։ൃΛ։࢝͢Δ·Ͱʹࠨ ਤʹ͋ΔΑ͏ͳෳͷϨΠϠʔʹ͍ͭͯݕ౼Λ͢ Δ • ΕΒΕ͕͕ͪͩɺ్த͔Β։ൃʹJOIN͢ Δ߹ɺ৽ن։ൃ࣌ͱಉ͡ͷϨΠϠʔ ͷཧղ͕ඞཁʹͳΔ •
ҧ͏ͷʮ͢Ͱʹ͋ΔͷΛཧղ͢Δඞཁ ͕͋Δʯͱ͍͏͜ͱ͚ͩ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃڥ͔ ʢຊ൪ڥɾ։ൃڥʣ ͲͷΑ͏ͳίʔυ͔ ։ൃ αʔϏεཧղϨΠϠʔ ΞʔΩςΫνϟཧղϨΠϠʔ σʔλετΞཧղϨΠϠʔ ։ൃڥཧղϨΠϠʔ ίʔυཧղϨΠϠʔ ։ൃ։࢝·ͰͷΦʔόʔϔου
8 υΩϡϝϯτͱ ։ൃऀ͕γεςϜΛཧղ͢Δ
υΩϡϝϯτͱ 9 • ৽͍͠։ൃऀγεςϜΛݟͯཧղΛ͢Δඞཁ͕͋Δ • ։ൃ։࢝·ͰͷΦʔόʔϔου͕େ͖͍ঢ়ଶ γεςϜҎ֎ʹԿͳ͍ঢ়ଶ
υΩϡϝϯτͱ 10 • γεςϜͷཧղΛॿ͚ΔͨΊυΩϡϝϯτΛॻ͘ • ৽͍͠։ൃऀυΩϡϝϯτΛ௨ͯ͡γεςϜͷཧղΛਐΊΔ͜ͱ͕Ͱ͖Δ υΩϡϝϯτͰཧղΛॿ͚Δ
υΩϡϝϯτͱ 11 • υΩϡϝϯτΛӡ༻͢Δత → ։ൃ։࢝·ͰͷΦʔόʔϔουΛݮ͢ΔͨΊ • ݮ͢ΔͨΊʹγεςϜͷཧղΛॿ͚Δ͜ͱ͕Ͱ͖ͳ͍ͱ͍͚ͳ͍ • υΩϡϝϯτ͍ͭଘࡏ͢Δ͖͔
→ ཧղͯ͠Β͍͍ͨγεςϜ͕ଘࡏ͍ͯ͠Δͱ͖ • ܧଓతʹؒҧ͍ͷͳ͍ेͳυΩϡϝϯτ͕ଘࡏ͠ଓ͚Δඞཁ͕͋Δ • ※৽ن։ൃલͷʢઃܭͳͲͷʣυΩϡϝϯτຊൃදͷείʔϓ͔Β֎͢ ຊൃදʹ͓͚Δ”υΩϡϝϯτ" ʮܧଓతʹʯʮγεςϜͷཧղΛॿ͚ΔʯυΩϡϝϯτ͕ඞཁ
γεςϜͱυΩϡϝϯτͷဃ 12
γεςϜͱυΩϡϝϯτͷဃ 13 • γεςϜͱυΩϡϝϯτͱͷؒʹ༰ͷဃ͕ൃੜ͍ͯ͠Δ߹͕͋Δ • ʮॻ͍ͯ͋Δ͜ͱ͕ؒҧ͍ͬͯΔʯঢ়ଶʢ߹ʹΑͬͯʮॻ͍ͯ͋Δ͜ͱ͕ Γͳ͍ʯʣ • ߃ৗతʹ༰ʹ͕ࠩग़͍ͯΔঢ়ଶ •
ߋ৽λΠϛϯά͕ͣΕΔ͜ͱͰγεςϜͱυΩϡϝϯτͷ༰ʹ͕ࠩग़͍ͯΔঢ়ଶ γεςϜͱυΩϡϝϯτͷဃ
γεςϜͱυΩϡϝϯτͷဃ 14 • γεςϜͱͷဃ͕͋ΔυΩϡϝϯτͰγεςϜΛཧղ͢ΔͱɺؒҧͬͨཧղͰ։ൃ ʹೖͬͯ͠·͏ • ࣮ؔ࿈͕૿͍͑ͯͯؾܰʹΓͤͳ͘ͳ͍ͬͯͨΠϯελϯε • ࣮ߟྀ͠ͳ͍ͱ͍͚ͳ͍͜ͱ͕มΘ͍ܾͬͯͨࡁػೳ •
࣮૿͍͑ͯͨόον • ։ൃऀ͕ͦͷဃʹؾͮ͘ͷ͕͚Ε͍΄Ͳ։ൃʹ͓͚ΔϚΠφε͕େ͖͘ͳΔ • γεςϜཧղͷΓͳ͓͠🔥 • ίʔυͷॻ͖͠🔥 🔥 • ؒҧͬͨཧղͷ··ϦϦʔεɺޙʹো🔥 🔥 🔥 🔥 🔥 🔥 γεςϜͱυΩϡϝϯτͷဃ͕͋Δͱ
γεςϜͱυΩϡϝϯτͷဃ 15 γεςϜͱυΩϡϝϯτͷဃΛখ͘͢͞ΔͨΊʹɺ·ͣɺγεςϜͱυΩϡϝϯτͷ ဃΛஅͰ͖ΔΈ͕ඞཁ • γεςϜͱυΩϡϝϯτͷରԠؔΛද͢Ұछͷ͕ؔඞཁ • ʮͨͩυΩϡϝϯτΛॻ͘ʯγεςϜ͕ߋ৽͞Εͨͱ͖ʹɺυΩϡϝϯτͷͲ͜Λ ߋ৽͢Εྑ͍ͷ͔͕Θ͔Γʹ͍͘ˠͭ·Γ͕ؔͳ͍ঢ়ଶ ͦͯ͠ɺဃ͕͋ΔظؒΛͰ͖Δ͚ͩখ͘͢͞ΔͨΊʹ
• ܧଓతʹ • Ͱ͖Δ͚ͩγεςϜͷߋ৽ʹ͍ۙλΠϛϯάͰ υΩϡϝϯτΛγεςϜʹ߹Θͤͯߋ৽͠ଓ͚Δ͜ͱ͕ඞཁ γεςϜͱυΩϡϝϯτͷဃΛখ͘͢͞Δʹ
γεςϜͱυΩϡϝϯτͷဃ 16 γεςϜͱυΩϡϝϯτͷဃʹ͍ͭͯɺू߹Λ༻͍ͯϞσϧԽ͢ΔࢼΈ γεςϜͱυΩϡϝϯτͷဃͷϞσϧԽ https://speakerdeck.com/k1low/web-system-architecture-number-8
γεςϜͱυΩϡϝϯτͷ ဃΛͳ͘͢Ξϓϩʔν 17
18 γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν γεςϜ͔ΒߏԽσʔλΛநग़ͯ͠ υΩϡϝϯτੜΛ͢Δ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν 19 • JavadocɺgodocɺPHPDoc etc • γεςϜ͔ΒυΩϡϝϯτΛੜ͢Δ ͜ͱͰɺγεςϜͱυΩϡϝϯτͷဃ Λͳͦ͘͏ͱ͍ͯ͠Δ γεςϜ͔ΒߏԽσʔλΛநग़͢Δ
υΩϡϝϯτ ߏԽσʔλ γεςϜ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν 20 • ຊൃදʹ͓͚ΔʮΞϊςʔγϣϯʯͱɺʮγεςϜʹର͢Δ։ൃऀͷཧղɾΠϝʔ δΛߏԽσʔλʹϝλใͱͯ͠Ճ͢Δʯͱ͍͏ҙຯ • PHPDocͳͲͰɺίϝϯτΛιʔείʔυʹ • ιʔείʔυͷʮߏʹԊͬͨܗͰʯ •
͔ͭʮܾΊΒΕͨϑΥʔϚοτʹैͬͯʯ Ճ͢Δ͜ͱͰɺॳΊͯ࠷ऴతͳυΩϡϝϯτʹө͞ΕΔ→Ξϊςʔγϣϯ ্هҎ֎ͷίϝϯτυΩϡϝϯτ͔Βແࢹ͞ΕΔ→ΞϊςʔγϣϯͰͳ͍ Ξϊςʔγϣϯ
21 γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν ߏԽσʔλ͔Β γεςϜͱυΩϡϝϯτͷ྆ํΛੜ͢Δ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν 22 • OpenAPI • ੜݩσʔλΛ1ͭʹ͢Δ͜ͱͰγε ςϜͱυΩϡϝϯτͷဃΛͳͦ͘͏ ͱ͍ͯ͠Δ ߏԽσʔλ͔ΒγεςϜͱυΩϡϝϯτͷ྆ํΛੜ͢Δ υΩϡϝϯτ
ߏԽσʔλ γεςϜ
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν 23 • 2ͭͷྫͷڞ௨ͱͯ͠ɺγεςϜͱυΩϡϝϯτͷؒʹߏԽσʔλΛհͨؔ͠࿈ Λ͍࣋ͬͯΔ͜ͱ͕Θ͔Δɻ • γεςϜͱυΩϡϝϯτͷରԠؔΛද͢Ұछͷؔʹͳ͍ͬͯΔ 2ͭͷΞϓϩʔνͷڞ௨
γεςϜͱυΩϡϝϯτͷဃΛͳ͘͢Ξϓϩʔν 24 • γεςϜͱυΩϡϝϯτͷဃΛͳͨ͘͢ΊʹɺγεςϜͷมԽͱ࿈ಈ͍ͯ͠ΔߏԽ σʔλΛυΩϡϝϯτੜʹ׆༻͢Δ • ʮγεςϜ͔ΒߏԽσʔλΛநग़͢ΔʯʮߏԽσʔλ͔ΒγεςϜΛ࡞ΔʯͲͪ ΒͰྑ͍ • ιʔείʔυɺIaCͷίʔυͱ͍ͬͨίʔυ͚ͩͰͳ͘ɺࢄτϨʔγϯάService
DiscoveryɺService Mapͱ͍ͬͨΈͰಘΒΕͨάϥϑγεςϜͷมԽͱ࿈ಈͨ͠ߏ Խσʔλͱݴ͑Δ • ߏԽσʔλ͔ΒυΩϡϝϯτͷܗΛੜ͠ɺΞϊςʔγϣϯʹγεςϜͷཧղʹඞཁ ͳઆ໌Λ݀ຒΊ͍ͯ͘͠Πϝʔδ • ॏཁͳͷΞϊςʔγϣϯͷ݀ຒΊ·Ͱͯ͠ॳΊͯγεςϜͷཧղΛॿ͚ΔυΩϡϝ ϯτʹͳΔͱ͍͏͜ͱ ߏԽσʔλΛ׆༻ͨ͠υΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ 25
ܧଓతυΩϡϝϯςʔγϣϯ 26 • γεςϜͱυΩϡϝϯτͷؒʹߏԽσʔλΛհͨؔ͠࿈Λ࣋ͨͤΔ͜ͱͰ྆ऀͷ ဃΛͳ͘͢ख๏ʢʹπʔϧʣΛಘΔ͜ͱ͕Ͱ͖ͨ • ͦͷπʔϧΛ࣮ߦ͢Δͷ͕ɺৗʹ։ൃऀʹਓͰ͋Δͱʮ࣮ߦΕʯ͕ൃੜͯ͠͠· ͏ • ΞϓϦέʔγϣϯͱಉ༷ʹɺCI/CDͷΈΛ׆༻͢Δɻ
• ηΩϡϦςΟʹ͓͚ΔDevSecOpsηΩϡϦςΟγϑτϨϑτɺDeveloper- First Securityͱಉ͡ ୭͕υΩϡϝϯςʔγϣϯπʔϧΛ࣮ߦ͢Δͷ͔ υΩϡϝϯτܧଓతʹσϦόϦ͢Δ
27 ܧଓతυΩϡϝϯςʔγϣϯ GMOϖύϘʹ͓͚Δ ܧଓతυΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ 28 σʔλϕʔεεΩʔϚͷ υΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ 29
ܧଓతυΩϡϝϯςʔγϣϯ 30 • CIϑϨϯυϦͳσʔλϕʔευΩϡϝϯτੜ πʔϧ • https://github.com/k1LoW/tbls • PostgreSQL, MySQLͳͲͷRDBMS͚ͩͰ
ͳ͘ɺBigQueryAmazon DynamoDB, Cloud Spannerͱ͍ͬͨσʔλιʔεʹ ରԠ • υΩϡϝϯτΛॆ࣮ͤ͞Δػೳͱͯ͠ϝλ σʔλΛΞϊςʔγϣϯ͢Δ͜ͱ͕Մೳ • ςʔϒϧɺΧϥϜͳͲͷίϝϯτ༩͚ͩ Ͱͳ͘λάɺϦϨʔγϣϯͳͲ tbls
ܧଓతυΩϡϝϯςʔγϣϯ 31 • ैདྷσʔλϕʔεͱυΩϡϝϯτ ผͰཧ • CI্Ͱςετ༻σʔλϕʔε͔Β ςʔϒϧఆٛΛߏԽσʔλͱͯ͠ந ग़ɻͦΕʹՃͰςʔϒϧίϝϯτ ΧϥϜίϝϯτΛΞϊςʔγϣϯ͠ɺ
υΩϡϝϯτΛੜ tbls
ܧଓతυΩϡϝϯςʔγϣϯ 32 ΠϯϑϥΞʔΩςΫνϟͷ υΩϡϝϯςʔγϣϯ
ܧଓతυΩϡϝϯςʔγϣϯ 33 ndiag
ܧଓతυΩϡϝϯςʔγϣϯ 34 • https://github.com/k1LoW/ndiag • ओʹΠϯϑϥͷϋΠϨϕϧΞʔΩςΫ νϟͷυΩϡϝϯτΛੜ͢ΔతͰ։ ൃ • YAML͔ΒʮߏਤΛੜ͢ΔʯͰ
ʮυΩϡϝϯτΛੜ͢ΔʯͰͳ͘ ʮෳͷΓޱͰߏਤΛؚΉΩϡϝϯ τͷܗΛ࡞Δʯͱ͍͏ಛΛ࣋ͭ • ֤ߏཁૉάϧʔϓʹΞϊςʔγϣϯ Λॻ͘͜ͱͰυΩϡϝϯτͱཱͯ͠͞ ͤΔ ndiag
ܧଓతυΩϡϝϯςʔγϣϯ 35 • γεςϜͱυΩϡϝϯτͷؔ࿈෦ ʮߏԽσʔλΛநग़͢ΔʯͰͳ ͘ɺൺֱػೳ·Ͱ • ୯७ʹɺରͱ͍ͯ͠ΔγεςϜ ͕ඇৗʹෳࡶͰ͔ͭଟذʹΘͨ ΔͨΊ
• વndiagͷೖྗYAMLͳͷͰɺγε ςϜ͔ΒใΛߏԽσʔλΛநग़͢ ΔεΫϦϓτ͕࡞ΕΕɺͦΕΛ ndiagͷೖྗʹ͢Δ͜ͱ͕Մೳ ndiag
·ͱΊ 36
·ͱΊ 37 • ։ൃ։࢝·ͰͷΦʔόʔϔουͷݮͷͨΊʹʮܧଓతʹʯʮγεςϜͷཧղΛ ॿ͚ΔʯυΩϡϝϯτ͕ඞཁ • ʮܧଓతʹɺؒҧ͍ͷͳ͍ेͳυΩϡϝϯτΛଘࡏ͠ଓ͚ͤ͞Δʯͱʮγες Ϝ͕มԽͯ͠γεςϜͱυΩϡϝϯτͷဃΛେ͖͘͠ͳ͍ʯͱ͍͏͜ͱ • γεςϜͷมԽͱ࿈ಈͨ͠ߏԽσʔλΛͬͯυΩϡϝϯτͷܗΛੜ͢Δ͜
ͱͰɺγεςϜͷมԽ͕υΩϡϝϯτʹө͞ΕΔΈΛߏஙͰ͖Δ • ্هͷΈΛιϑτΣΞʹΑΓࣗಈԽɺ͞ΒʹCI/CDͷΈʹࡌͤΔ͜ͱͰɺ γεςϜͱυΩϡϝϯτͷဃΛݶΓͳ͘ܧଓతʹখ͘͞อͭ͜ͱ͕ՄೳʹͳΔ ·ͱΊ
·ͱΊ 38 • γεςϜͷมԽͱ࿈ಈͨ͠ߏԽσʔλΛͬͯυΩϡϝϯτͷܗγεςϜͷมԽʹ ै͢ΔΑ͏ʹͳͬͨɻ • ݱঢ়ɺͦΕΒʹ༩͢ΔΞϊςʔγϣϯʢ։ൃऀ͕ॻ͘આ໌จষʣΛͲ͏ܧଓతʹॻ͍ͯ Β͏͔͕՝ • ΞϓϦέʔγϣϯͷιʔείʔυͱಉ͡Α͏ͳΞϓϩʔνͱͯ͠ɺΧόϨοδͷܭଌ
ΧόϨοδύʔηϯςʔδʹΑͬͯCIΛFailͤ͞ΔΈͳͲ͕ߟ͑ΒΕΔ • tblsndiagυΩϡϝϯτͷΧόϨοδܭଌͰ͖ΔΑ͏ʹͳ͍ͬͯΔ • ΑΓϞνϕʔγϣϯΛͬͯॻ͍ͯΒ͏ΈɺΑΓॻ͖͘͢ͳΔΈߟ͑ͯ ͍͖͍ͨ • ࠶ܝ: ηΩϡϦςΟʹ͓͚ΔDevSecOpsηΩϡϦςΟγϑτϨϑτɺ Developer-First Securityͱಉ͡ ࠓޙͷ՝
39 Thank You! Thank You!