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
Perl + Go実運用の話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
mackee
December 16, 2015
Programming
1.3k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Perl + Go実運用の話
Gotanda.pm #7 vs Yokohama.pm #13
mackee
December 16, 2015
More Decks by mackee
See All by mackee
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
820
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1.3k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.4k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.5k
ワンバイナリWebサービスのススメ
mackee
10
9.2k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
850
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
2.9k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.1k
Other Decks in Programming
See All in Programming
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
120
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
700
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
340
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3k
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
130
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
340
AHC070解法紹介
eijirou
0
120
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
320
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
420
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
720
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The browser strikes back
jonoalderson
0
1.7k
Ethics towards AI in product and experience design
skipperchong
2
380
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
420
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
420
Agile that works and the tools we love
rasmusluckow
331
22k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
350
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
Raft: Consensus for Rubyists
vanstee
142
7.7k
Transcript
Perl + Go࣮ӡ༻ͷ @mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ 2015-12-16 Gotanda.pm #7
vs Yokohama.pm #13
͜ΜΜΘ
୭ʁ • Yokohama.pm෭ Ϧʔμʔ • twitter:@mackee_w • github:mackee • ໘ന๏ਓΧϠοΫ
• ιʔγϟϧήʔϜͷ ։ൃͱӡ༻PG
None
Perl + Go࣮ӡ༻ͷ @mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ 2015-12-16 Gotanda.pm #7
vs Yokohama.pm #13
෭
·ͨ զʑ
Կʹͯ͠Perl ͚ͩΛ͏͜ ͱΛࢭΊͯ https://flic.kr/p/q6cRh
GoͱPerlͷΩ ϝϥΛӡ༻͢ ΔΑ͏ʹͳͬ ͔ͨ https://twitter.com/bradfitz/status/335213285815226369
Section.0 Perl + Goͷ ߏ
UnityͷΫϥΠΞϯτ (iOS/Android)
ELBͰड͚ͯPerlͷཱͬͯΔ AppαʔόʹϦόʔεϓϩΩγ
MySQLͷRDSʹAppαʔό͕ ܨ͛ͯΔ
ී௨ͳײ͡ Ͱʁʁʁ
͜ͷߏ͕ෳ͋ͬͯ
Goͷαʔόʹ෦APIͰୟ͘
None
Section.1 Goͷ࠾༻
༩͑ΒΕͨ݅ • ఆDAUʹ͑ΒΕΔ͜ͱ • γϯάϧϚελʔͩͱͭΒͦ͏ͳײ͕͡աڈ ͷ࣮͔Βͯ͠ఆ͞ΕΔ • શੈքʹಉ͡ΞϓϦΛ৴͢Δ • ϚϧνϦʔδϣϯ/DCࢹʹ
γϟʔσΟϯάʁʁʁ • DBIx::Classͷຐज़ʹΑΓطଘͷίʔυʹ JOIN͕͍ͬͺ͍ • ͦͷ··ΔͳΒMySQL Clusterͱ͔Spider Engineͱ͔͚ͩΕͲฐࣾͰ࣮ͳ͍͠RDS ͍͍ͨ͠
ήʔϜͷσʔλͷྲྀΕΛݟΔ • શϢʔβϥϯΫͱݺΕΔख़࿅͝ͱͷ֊ ʹ͔ΕͯͦͷதͰϦʔάʹ͔ΕΔ • ࢼ߹(ͱݺΕΔఆ࣌ʹߦΘΕΔGvG)Ϧʔά ͷάϧʔϓ͝ͱʹߦΘΕΔ • γʔζϯ࠷ޙʹϦʔάͷ্ҐऀͰτʔ φϝϯτΛߦ͏
Αͬ͠ΌϦʔάͰDB͚Α͏ • ͪΐ͏ͲϦʔάΛҬผʹ͢Δ͕͋ͬͨͷ ͰͦΕʹͷ͔ͬͬͨ(=>ϚϧνϦʔδϣϯ) • ͰݟͨϫϯϫʔϧυΛ࣮ݱ͢Δ(ϑϨϯυ ΫϥϒҠ੶ͳͲ)ͨΊʹதԝαʔό͕ඞཁ • ͦͯ͠಄ͷߏ͕ग़དྷ্͕ͬͨ
͜ͷ࣌Ͱ GoΛ࠾༻͢Δ ཧ༝Λ୳͍ͯͨ͠
http://www.kayac.com/news/2014/07/golang
ͦΕ͔ΒԿϲ݄͔ܦͬͯ • झຯͰॻ͍ͨΓଞͷαʔϏεͰϛυϧΣΞ ͱͯ͠ಈ͍͍ͯΔౕΛݟͨΓ͍ͯͯ͠ಛੑత ͳͷݟ͖͑ͯͨ • ιγϟήʔΛ·Δ͖ͬΓϦϓϨʔε͢Δͷ େมͩͱࢥ͏͕ɺػೳ͕ߜΒΕͯͨΒ͍͍ײ ͡ʹͳΔؾ͕͢Δ
Ϊδϡπతͳཧ༝͚ • Perlଆͷαʔόʹ1ʹ͖ͭଟͷϓϩηεཱ͕ͭ͜ͱ ʹͳΔ • ͦͷଟͷϓϩηε͔ΒͷHTTPϦΫΤετΛ͘͞ͷͨ Ίʹಉ͡ϓϩηεͷPerlΛཱͯͯͨΒҙຯ͔Μͳ͍ ײ͡ʹͳΔͷͰ(ͪΖΜ෦APIͷ͍ํʹΑͬͯͦ ͏ͳΒͳ͍ؾ͢Δ) •
ϦιʔεΛޮతʹ͑ΔݴޠͰॻ͘ͷ͕͍͍ؾ͕͢Δʂ
Section.2 GoΛॻ͘
ࣾͷPerlͷίʔυ
ܕͰΨνΨνʹݻΊ͍ͯΔ ͷ͕΄ͱΜͲ
ܕΛຖճॻ͍͍ͯ ΔͳΒͦΕΛͬ ͯίϯύΠϧ࣌ʹ ղܾͨ͠΄͏͕Α ͘Ͷʁ
ํ • Ͱ͖Δ͚ͩ Go way Λࢦ͢ • net/httpΛͦͷ··͏ • Ͱ͖Δ͚ͩPerlΛॻ͍͍ͯͨ࣌ͱಉ͡ߟ͑Ͱॻ
͚ΔΑ͏ʹ͢Δ • Goʹͳͬͯศརʹͳͬͨ͜ͱར༻͢Δ
IDLͷ • IDL = Interface Definition Language • ྫ: JSON
Schema, Swagger, Protobuf • RPCͳͲͷΠϯλʔϑΣΠεΛઐ༻ݴޠͰఆٛ ͯͦ͠ΕΛར༻ͯ͠ίʔυΛੜͨ͠Γ͢Δ
ฐࣾͷIDLͷ • ͱͱBaalͱ͍͏ಠࣗIDL͕ࣾͰΘΕ͍ͯ ͨ • BaalͰServiceͱεΩʔϚΛఆٛ͠ɺC#(Unity)ͷ APIୟ͘ίʔυΛੜ͢Δ • PerlͰίϯτϩʔϥͷςετΛॻ͘ͱ͖ʹBaalͰ ܕεΩʔϚ͕͍͋ͬͯΔ͔ΛνΣοΫ͢Δ
go generateͷػӡ • BaalͰΫϥΠΞϯτ͕ੜͰ͖ΔͳΒαʔό (ͷίϯτϩʔϥ)ੜͰ͖Δͣ • ͬͯΈͨ -> Ͱ͖ͨ •
ϝϦοτ: ϦΫΤετΛύʔεͯ͠Goͷܕʹม ͢ΔͷͰิʹग़ͯ͘Δ࠷ߴ
࣮ࡍͷBaalͷྫ ϑϨϯυਃ namespace Data.Request { entity FriendRequestRequest { /# ਃ͢ΔϢʔβ
#/ UserId: !long; /# ਃ͞ΕΔϢʔβ #/ TargetUserId: !long; } } namespace Data.Response { entity FriendRequestResponse { /# 1: ਃத 2: ਃ͞Εத 3: ϑϨϯυొࡁΈ #/ Status: !integer; } }
࣮ࡍͷBaalͷྫ ϑϨϯυਃ namespace Service { service FriendService { /# <short>༑ͩͪਃ</short>
<url>/api/friend/request</url> <request_method>POST</request_method> #/ Request: <= !Data.Request.FriendRequestRequest => !Data.Response.FriendRequestResponse; } }
ੜ͞Εͨίʔυ
ੜ͞Εͨίʔυ
͜ͷίʔυΛ͏ͱ͜Ζ
͜ͷίʔυΛ͏ͱ͜Ζ ิʹग़ͯ͘Δʂʂʂ
Go͔ΒDBΛѻ͏ • ORMΛΘͣʹΫΤϦϏϧμʔΛ͏Α͏ʹͨ͠ • ϥΠϒϥϦ࠾༻ͷํͱͯ͠ʮ͕ࣗॻ͚ͦ͏ɺ ͕ࣗϝϯςͰ͖ͦ͏ʯͳͷͱ͍͏ͷ͕͋Γ ·ͨ͠ • Ҏલgorpͬͨ͜ͱ͕͋ͬͯͦΜͳʹ͖͡Όͳ ͔ͬͨ
Go͔ΒDBΛѻ͏ • ͱ͍͑DDLͱGoͷstructͱಉ͜͡ͱΛ2ॻ ͘ͷਏ͍ • ͷͰGoͷstructΛλά͖Ͱॻ͍ͨΒDDLʹม ͢ΔͷΛॻ͍ͨ -> ͑ͨ࠷ߴ •
Γग़ͨ͠ -> github.com/mackee/go-genddl
͜Ε͕
͜͏ͳΔ
Section.3 Perl͔ΒGo
Perl͔ΒGoʹͭͳ͙ • GoͷAPIαʔόεςʔτϨεͳRESTful JSON API • ೝূͳ͠ɺηογϣϯͳ͠ • FurlͰͭͳ͍ͰϦΫΤετΛJSONʹύʔε͢ ΔΫϥεΛPerlଆʹ༻ҙͯͦ͠ΕΛ͏
Goଆ͕མͪͯΔ࣌ʁ • Goଆ͕མͪͯશαʔόμϯආ͚͍ͨ • ํ1: ෦APIΛ༻͍ΔAPIΛݶఆ͢Δ • ํ2: མ͍ͪͯͯͳΜͱ͔Ͱ͖Δ߹ͳΜͱ͔͢ Δ
• ํ3: མ͍ͪͯͯͳΜͱ͔Ͱ͖ͳ͍߹ૉʹࢮ ΜͰΤϥʔΛग़͢
ͳΜͱ͔Ͱ͖Δ߹ͳΜͱ͔ ͢Δ • ྫ: ϩάΠϯޙʹදࣔ͞ΕΔϚΠϖʔδͷ͓ ΒͤAPI(࣮͓Βͤதԝαʔόʹ෦API Ͱ͍߹Θͤͯ৴͍ͯ͠Δʂʂʂ) • ࢮΜͰ͍Δ߹ ->
200Ҏ֎͕ؼ͖ͬͯͨ࣌ͷ ྫ֎ΛΩϟονۭͯͬ͠ΆΛฦ͢ -> શମͱ͠ ͯੜ͔͢
τϥϯβΫγϣϯ͕͑ͳ͍ • ผαʔόผDBͳͷͰવͦͷؒͰී௨ͷτϥϯβ Ϋγϣϯ͑ͳ͍ • ͳͷͰGoଆAPIΛႈ(ಉ͡ϦΫΤετΛԿୟ͍ ͯಉ݁͡ՌʹͳΔ)ʹͳΔΑ͏ʹྀ͢Δ • ྫ:
ϑϨϯυਃΛ2ୟ͍ͯʮϑϨϯυਃ͠ ͨΑʔʯͱฦ͢ɻDBͷঢ়ଶ2ͦͷ··
Section.4 Ωϝϥͷӡ ༻
σϓϩΠํ๏ • consulͷϚϧνDCͰͦΕͧΕߏ͞Ε͍ͯΔ • ͦΕͧΕͷDCʹconsul eventΛൃߦ͢Δ -> stretcher ͰS3ʹ্͛ͨtarballΛpull͖ͯͯ͠σϓϩΠ •
σϓϩΠ͢Δͷಉ͡tarballʂʂ̍̍ • daemontoolsͰཱͬͯΔαʔϏε͕ҧ͏
GoͷϏϧυํ๏ • σϓϩΠεΫϦϓτͰϏϧυ͍ͯ͠Δ • ґଘύοέʔδͦ͜Ͱͱ͍ͬͯΔ • ςετ͍ͯ͠Δͷͱ͕ࠩग़ΔՄೳੑ͕͋Δ…… ͪΐͬͱා͍ • ґଘύοέʔδࣗͷσΟϨΫτϦҎԼʹִ͍ͯ͠
Δ(vendoringͬΆ͍͚ΕͲόʔδϣϯཧ͍ͯ͠ͳ͍)
None
࣮ࡍʹӡ༻ʹೖͬͯ • GoଆىҼͷόάτϥϒϧͳ͠(!) • ຊʹؾΛ͚ͭ·ͬͯ͘ॻ͍͍ͯΔͷͰͦΕ͕ޭ Λ͍ͯ͠Δؾ͕͠ͳ͍Ͱͳ͍ • ͋ͱCPUͷෛՙ͕ΊͪΌগͳͯ͘ຊʹಈ͍ͯ ͍Δͷ͔৺ʹͳΔϨϕϧ(ൺֱରDBIx::Class ͱDateTimeΛΨϯΨϯ͍ͬͯΔPerlଆͷαʔό)
Έ • νʔϜʹGoͷίʔυʹखΛग़ͤΔਓ͕গͳ ͍ • ͦΜͳʹػձ͕ଟ͘ͳ͍ͷ͋Δ • ؾ߹ೖΕͯॻ͔ͳ͍ͱ͍͚ͳ͍͠ɺԿΑΓจ Խݍ/ߟ͑ํ͕ҧ͏ͷͰֶͼ͠ʹͳΔ
·ͱΊ • GoͰϑϨϯυͱ͔࣮͢Δͷ͕ඇৗʹ಄Λ͜Ͷ͘Γճͯ͠๐ ͖ͳ͕Β͚ͬͨΕͲษڧʹͳͬͨؾ͕͢Δ • ϚΠΫϩαʔϏεతʹαʔό͚ΔͷΞϦ͔͠Εͳ͍(Ψνϟ ͱ͔ڞ௨Ͱ͠ΐ) • ͕ɺτϥϯβΫγϣϯ͕Γ •
GoͰϑϧεϖοΫͷιγϟήʔΛॻ͘ͷࠓͷஈ֊Ͱແཧʂɹ ͚ͩΕͲϥΠϒϥϦ(ಛʹORM)ͷݟ͕ஷ·Εߦ͚Δؾ͕͢Δ