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
WebSocket Connection Proxy kuiperbeltの プラグイン機構の実装
Search
mackee
February 16, 2016
Programming
0
4.3k
WebSocket Connection Proxy kuiperbeltの プラグイン機構の実装
Shibuya.go
http://shibuyago.connpass.com/event/25852/
mackee
February 16, 2016
Tweet
Share
More Decks by mackee
See All by mackee
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
15
5.3k
ワンバイナリWebサービスのススメ
mackee
10
8.1k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
120
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
970
perl for shell, awk and sed programmers
mackee
3
2.5k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
950
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
830
マイクロサービス化を利用した Goへの移行事例
mackee
0
960
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
5.4k
Other Decks in Programming
See All in Programming
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
470
『毎日の移動』を支えるGoバックエンド内製開発
yutautsugi
2
290
One Enishi After Another
snoozer05
PRO
0
160
AkarengaLT vol.38
hashimoto_kei
1
120
pnpm に provenance のダウングレード を検出する PR を出してみた
ryo_manba
1
160
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
190
開発組織の戦略的な役割と 設計スキル向上の効果
masuda220
PRO
9
1.5k
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
2
540
iOSでSVG画像を扱う
kishikawakatsumi
0
170
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
4
15k
Claude CodeによるAI駆動開発の実践 〜そこから見えてきたこれからのプログラミング〜
iriikeita
0
330
contribution to astral-sh/uv
shunsock
0
530
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
A designer walks into a library…
pauljervisheath
209
24k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
190
55k
Rails Girls Zürich Keynote
gr2m
95
14k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
22k
The World Runs on Bad Software
bkeepers
PRO
72
11k
It's Worth the Effort
3n
187
28k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Context Engineering - Making Every Token Count
addyosmani
8
300
Facilitating Awesome Meetings
lara
57
6.6k
Transcript
WebSocket Connection Proxy kuiperbeltͷ ϓϥάΠϯػߏͷ࣮ @mackee_w a.k.a macopy
• twitter:@mackee_w • github:mackee • ໘ന๏ਓΧϠοΫ • ιʔγϟϧήʔϜͷ ։ൃͱӡ༻PG •
Perl / Go ୭ʁ
ॻ͍ͨύοέʔδ • github.com/mackee/go-sqlla • code generate͢Δײ͡ͷΫΤϦϏϧμ
ॻ͍ͨύοέʔδ • github.com/mackee/go-sqlla • code generate͢Δײ͡ͷΫΤϦϏϧμ
ॻ͍ͨύοέʔδ • github.com/mackee/go-genddl • struct͔ΒSQLͷDDLΛ࡞Δ܅
ॻ͍ͨύοέʔδ • github.com/mackee/go-genddl • struct͔ΒSQLͷDDLΛ࡞Δ܅
go generateେ͖ਓؒͰ͢
࠷ۙ(ࣄͰ)ͬͨ͜ͱ https://speakerdeck.com/mackee/perl-plus-goshi-yun-yong-falsehua
PerlͷҰຕΞϓϦ͔Β GoΓग़͠ • ෳDBΛԣஅ͢ΔΑ͏ͳใΛ࣋ͬͨAPI αʔόΛGoͰॻ͍ͯΓग़͢ • ϢʔβొɺIDൃ൪ɺιʔγϟϧάϥϑetc… • ιʔγϟϧήʔϜΛશ෦GoͰॻ͘ͷ·ͩͭ Β͍ͱ͍͏ҹ
ιʔγϟϧήʔϜͷ ػೳͷଟ͞
ιʔγϟϧήʔϜͷػೳͷଟ͞ • ϑϨϯυొ • ثతͳϠπͷඋɺ߹ɺਐԽ • Ψνϟ • ҭཁૉ(͢͝Ζ͘) •
GvG(ࢼ߹)
ιʔγϟϧήʔϜͷػೳͷଟ͞ • ϑϨϯυొ • ثతͳϠπͷඋɺ߹ɺਐԽ • Ψνϟ • ҭཁૉ(͢͝Ζ͘) •
GvG(ࢼ߹) • ɾɾɾ͜ΕΒΛϦΞϧλΠϜͰɹˡNew!
ϦΞϧλΠϜʁʁʁʁ
࠷ۙͷτϨϯυͱͯ͠ͷ ϦΞϧλΠϜ • GvGͱ͔PvPͱ͔ͷରਓઓڠྗϓϨΠ͕ग़ͯ ͖ͯɺଞਓͷεϚϗͰߦͬͨߦಈΛʮଈ࠲ʹʯ ࣗͷͱ͜Ζʹөͤ͞Δඞཁ͕͋Δ • ϦΞϧλΠϜײͱ͍͏ͷɺΓ্͕ΓΛԋ शͭͨ͠Γਓͱ͍ͬͯΔײΛग़͢ͷʹඞཁ ͳཁૉʹͳΓͭͭ͋Δ
ϦΞϧλΠϜͷ࣮ݱํ๏ • ྫ͑ಠࣗϓϩτίϧΛੜιέοτͰ͠ΌΔήʔϜαʔόΛ C++͋ͨΓͰॻ͘ • ήʔϜαʔόͱϦΞϧλΠϜ෦ʹඞཁͳήʔϜͷཁૉ෦ (εΩϧൃಈʂͱ͔)࣮ͯ͠DBʹॻ͖ࠐΜͩΓͱ͔ • Ή͠ΖDBհͣ͞ʹͳΜ͔಄͍͍ײ͡ͰԣͱΓऔΓͨ͠Γͱ ͔
• HTTP͠ΌΔαʔό͔͠ॻ͍͖͍ͯͯͳ͍ͷʹͦΜͳεΩϧ ͳ͔ͬͨɾɾɾ
ιέοτͱ͔Α͘Θ͔Μͳ͍ ͷͰ Webඪ४ʹ͔ͬΓ·͢ ↓ WebSocket
PerlͰWebSocketΛ͠Ό…… WSͰͭͳ͙
PerlͰWebSocketΛ͠Ό…… ͝ʹΐ͝ʹΐܭࢉ…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத… WSͰͭͳ͙…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத… WSͰͭͳ͙… ͪΐͬͱࠓࣄதͳΜͰ…
PerlͰWebSocketΛ͠Ό…… DBʹॻ͖ࠐΈத… ͑ͬ ͪΐͬͱࠓࣄதͳΜͰ…
ͬͺΓC++Ͱ……
ͦ͏ͩWSΛ͠Όͬͯ ͭͳ͗ͬͺʹͯ͘͠ΕΔ ઐ༻ͷαʔόΛॻ͜͏ ↓ kuiperbelt
͍͍ͩͨ͜Μͳײ͡ • client͕kuiperbeltʹWSͰͭͳ͛ΔͱޙΖͷ PerlʹೝূϦΫΤετΛ͛ͯ200ͩͬͨΒ WS։࢝ • ޙΖͷPerl͔ΒkuiperbeltʹHTTPͰϦΫΤε τΛ͛ΔͱWSͰϝοηʔδΛૹ͢Δ
͍͍ͩͨҎԼͷهࣄʹ http://qiita.com/mackee_w/items/b6036d132888caaf5f98
ΫϥελԽͱ ϓϥάΠϯͷ
ݱঢ়ͷkuiperbeltͷࢄͷ Έ • Ұ൪ॳΊͷೝূϦΫΤετͷ࣌ʹϔομʹࣗͷϗ ετ໊Λ͚ͯૹ͍ͬͯΔ • ͜ͷΫϥΠΞϯτʹૹΓ͍ͨͱ͖ͦͷϗετ໊Λ ͍ͬͯͩ͘͞ͱͳΔ(redisͱ͔ʹอଘ͠ͱ͍ͯͶ) • ͜ΕͩͱͲͷαʔόʹͲͷΫϥΠΞϯτ͕ͿΒԼ͕ͬ
͍ͯΔ͔ΛόοΫΤϯυଆ͕ҙࣝ͠ͳ͍ͱ͍͚ͳ͍
ݱঢ়ͷkuiperbeltͷࢄͷ Έ LVJQFSCFMU CBDLFOE
LVJQFSCFMU CBDLFOE ೝূͷͱ͖ʹ ͭͳ͕ͬͨkuiperbeltͷϗετΛ௨͢Δ ଓ࣌
CBDLFOE LVJQFSCFMU ηογϣϯΩʔͱϗετ໊ͷϖΞΛอଘ ଓ࣌
CBDLFOE LVJQFSCFMU ηογϣϯΩʔ͔Βϗετ໊ΛऔΔ ૹ৴࣌
CBDLFOE ϗετ໊Ͱͭͳ͕͍ͬͯΔkuiperbeltΛࢦ໊ͯ͠ ௨৴͢Δ ૹ৴࣌ LVJQFSCFMU
όοΫΤϯυ͕ Ͳͷαʔόʹͭͳ͕͍ͬͯΔ ͔Ͳ͏͔Λߟྀ͢Δඞཁ͕͋ Δ
ͦͷଞϦΞϧλΠϜήʔϜαʔ όͷྫ • ʮ͍ͭ͜ʹͭͳ͛ʂʯ͍ͬͯ͏αʔόΛࣄલ ʹAPIͰࢦఆ͍ͯͦͭ͠ʹܨ͍ͰΒ͏ • ϝϦοτ: ภΓΛίϯτϩʔϧ • Ͳ͜ʹͭͳ͍ͰͲ͜ʹૹ৴ͯ͠Α͠ͳʹ
ϝοηʔδΛૹͬͯ͘ΕΔ
ͦͷଞϦΞϧλΠϜήʔϜαʔ όͷྫ • ʮ͍ͭ͜ʹͭͳ͛ʂʯ͍ͬͯ͏αʔόΛࣄલ ʹAPIͰࢦఆ͍ͯͦͭ͠ʹܨ͍ͰΒ͏ • ϝϦοτ: ภΓΛίϯτϩʔϧ • Ͳ͜ʹͭͳ͍ͰͲ͜ʹૹ৴ͯ͠Α͠ͳʹ
ϝοηʔδΛૹͬͯ͘ΕΔ ͜ΕΛΓ͍ͨʂʂʂ ↓
node.jsͱ͔ͰΑ͋͘Δͭ ↓ ԣͷҙࢥૄ௨ʹ redis pubsubΛ͏
pubsubΛར༻͢Δ • ͕͍ࣗ࣋ͬͯΔΫϥΠΞϯτͰ͋Εࠓ· ͰͲ͓Γ͍ͦͭʹϝοηʔδΛૹ • ͍࣋ͬͯͳ͚ΕΫϥΠΞϯτ͕͋Δ͔Ͳ͏ ͔Λ͍߹Θͤͯpublish͢Δ • όοΫΤϯυଆΫϥΠΞϯτͱαʔόͷ ΛҙࣝͤͣʹϝοηʔδΛ͛ΒΕΔ
શһʹඞਢͷػೳ͔ʁ • ผʹόοΫΤϯυ͕ؤுΕredisͷυϥΠό ΛೖΕͳͯ͘ྑ͍ • redis pubsubҎ֎ʹಉ༷ͷػೳΛผͷΓ ํͰ࣮ݱͰ͖ΔՄೳੑ͕͋Δ • ແͯ͘ಈ͘Α͏ʹ࡞Εͳ͘ͳ͍
ϓϥάΠϯԽ͢Δ
GoͷϓϥάΠϯ • goϏϧυ࣌ʹશ෦ͷϥΠϒϥϦΛؚΊͯ͠ ·͏ͷͰಈతϩʔυͷΈ͕ͳ͍(1.5ͰϥΠ ϒϥϦԽग़དྷΔͷೖ͕ͬͨ·ͩෆ҆ఆͱ͍ ͏͔͑Δͷ͔ʁ) • ผͷϓϩηεͱ্ཱͯͪ͛ͯ͠ϓϩηεؒ௨ ৴͢Δͷ͕Ұൠత
GoͷແཧΓϓϥάΠϯԽ .BJO1SPDFTT 1MVHJO1SPDFTT" 1MVHJO1SPDFTT# ϓϩηεؒ௨৴
github.com/dullgiulio/pingo • net/rpc + pluginͷϓϩηεؒͰΑ͠ͳʹίω Ϋγϣϯషͬͯ͘ΕΔ + stdout/errͷ౷߹ • جຊతʹnet/rpcͳͷͰͦΕҎ্ग़དྷͳ͍
• ίϚϯυʹউखʹΦϓγϣϯ͕ੜ͑Δ
͍ํ
͍ํ ͭͳ͛ͯ͠·͑͋ͱnet/rpc
͍ํ structΛొ͢Δͱ͍ͦͭͷmethodΛ ݺΔΑ͏ʹͳΔ
ࠐΜͩͱ͜Ζ • ଓ࣌ -> hookͯ͠pluginʹొ • pluginଆredisͰchannelΛsubscribe • அ࣌ ->
hookͯ͠plugin͔Βআ • pluginଆsubscribe͍ͯ͠ΔνϟϯωϧΛ আ
ࠐΜͩͱ͜Ζ • ૹ৴࣌ -> ࣗʹΩʔ͕ͳ͚Εpluginʹ͛Δ • pluginͱΓ͋͑ͣpublish͢Δ͕ड͚Δ subscriber͕͍ͳ͚Εແ͍ΑͬͯΤϥʔΛฦ͢ • ड৴࣌
-> pluginͷsubscribeΛݟ͍ͯΔ͕ͭདྷͨ Βϩϯάϙʔϧ(?)͍ͯ͠ΔRPCͰϝοηʔδΛฦ͢ (ͬͱ͏·͘Γ͍ͨ)
demo (͕࣌ؒ͋ͬͨΒ)
·ͱΊ • PerlͰDBͱ͔Λ·ͱʹ͍ͭͭWSΓ͍ͨ ͷͰGoͰαʔόॻ͖·ͨ͠ • GoͰແཧΓPluginॻ͍ͯͦͷαʔόʹredis pub/subͬͯෳݐͯΒΕΔΑ͏ʹ͠·ͨ͠ • GoͰಈతϩʔυग़དྷΔΑ͏ʹͳͬͯ΄͍͠
Yokohama\.(go|pm6?)Γ·͢ʂ http://yokohamapm.connpass.com/event/26969/