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
Swiftに適したサーバーアーキテクチャを再考して実装までしてみる
Search
Yuki Takei
December 19, 2016
Technology
7
2.8k
Swiftに適したサーバーアーキテクチャを再考して実装までしてみる
Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016
Yuki Takei
December 19, 2016
Tweet
Share
More Decks by Yuki Takei
See All by Yuki Takei
VAR モデルによる OSS プロジェクト同士が生存性に与える 影響の分析
noppoman
0
290
Server Side Swift の個人的な利用シーン
noppoman
2
590
Serverless Server Side Swift
noppoman
2
1.6k
Practical Hexaville(ja)
noppoman
0
480
実践Server Side Swift
noppoman
13
4.2k
Server Side Swiftを使った サービス開発とその運用を考える
noppoman
4
1.3k
Swift3 Framework Slimane and Server Side Swift (ja)
noppoman
2
2.3k
About Deploying and Process Management for Slimane
noppoman
2
420
Server Side Framework Slimaneの紹介
noppoman
1
1.1k
Other Decks in Technology
See All in Technology
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
Culture Deck
optfit
0
420
JEDAI Meetup! Databricks AI/BI概要
databricksjapan
0
110
室長と気ままに学ぶマイクロソフトのビジネスアプリケーションとビジネスプロセス
ryoheig0405
0
370
Oracle Cloud Infrastructure:2025年2月度サービス・アップデート
oracle4engineer
PRO
1
220
クラウドサービス事業者におけるOSS
tagomoris
2
840
Classmethod AI Talks(CATs) #17 司会進行スライド(2025.02.19) / classmethod-ai-talks-aka-cats_moderator-slides_vol17_2025-02-19
shinyaa31
0
120
なぜ私は自分が使わないサービスを作るのか? / Why would I create a service that I would not use?
aiandrox
0
750
アジャイル開発とスクラム
araihara
0
170
OpenID BizDay#17 KYC WG活動報告(法人) / 20250219-BizDay17-KYC-legalidentity
oidfj
0
250
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
130
オブザーバビリティの観点でみるAWS / AWS from observability perspective
ymotongpoo
8
1.5k
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
The Cult of Friendly URLs
andyhume
78
6.2k
Site-Speed That Sticks
csswizardry
4
380
How STYLIGHT went responsive
nonsquared
98
5.4k
For a Future-Friendly Web
brad_frost
176
9.5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
RailsConf 2023
tenderlove
29
1k
Speed Design
sergeychernyshev
27
790
Documentation Writing (for coders)
carmenintech
67
4.6k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Why Our Code Smells
bkeepers
PRO
336
57k
Transcript
Swiftʹదͨ͠αʔόʔΞʔΩςΫ νϟΛ࠶ߟ࣮ͯ͠·Ͱͯ͠ΈΔ Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016
TSSS Meetupɺ ͳΜͱͿΓͷ։࠵Ͱ͢ʂ
ࣗݾհ
Swift͕OpenԽ͔ͯ͠Βɺ ৭ʑͳϥΠϒϥϦΛ࡞ͬͯެ։͍ͯ͠·͢ɻ
OSS • Slimane -> Web Framework • Skelton -> Event
Driven HTTP Server • Suv -> Async Net, I/O Platform (libuv based)
Slimaneͷ։ൃணख͔Βૣ͍͜ͱʹ͏1 (࠷ۙ͋·Γͬͯͳ͍ͷͰ͕͢ɺɺ)
͔ͭͯɺSwift͕ຬʹLinuxͰಈ͔ͣ
Server-Side-SwiftͷΩʔϓϨΠϠʔͨͪϑϨʔϜϫʔΫͳͲ ͷେ෦ΛࣗલͰ࡞͍ͬͯ·ͨ͠ɻ
͔͠͠
Swift3͕ϦϦʔε͞ΕͯɺServer SideͰSwiftͷඪ४APIΛੵ ۃతʹ͍ͬͯ͜͏ͱ͍ͬͨྲྀΕʹͳ͖͍ͬͯͯ·͢ɻ
ͦ͜ͰɺࠓͷServe Side Swiftʹదͨ͠ αʔόʔΞʔΩςΫνϟͱҰମͲΜͳͷͳͷ͔ʁ
ͦΕΛࣗͳΓʹ࠶ߟ͠ɺ࣮ͯ͠Έ·ͨ͠ɻ ͱ͍͏͓Ͱ͢ɻ
·ͣɺࠓճͷൃදͷωλͱͳΔϥΠϒϥϦͷ͝հͰ͢
None
• Swift3͕ඪ४Ͱఏڙ͢ΔAPIΛੵۃతʹͬͨωοτ ϫʔΫϥΠϒϥϦ • ϑϨʔϜϫʔΫͰͳ͘ɺ͋͘·ͰωοτϫʔΫϓϩ άϥϛϯάڥ • جຊతʹಉظI/OͷAPIΛఏڙ (callbackΛۃྗഉআ) •
ඇಉظϓϩάϥϛϯάಠࣗͷAPIΛར༻͢Δ(ޙड़) • ݱࡏHTTP(S)ɺTCPͷServer/ClientͱIP(v4, 6)Λఏڙ Prorsumͱʁ
ͰૣɺSwiftʹదͨ͠αʔόʔΞʔΩςΫνϟͱԿͳͷ͔ ୳͍͖͍ͬͯͨͱࢥ͍·͢ɻ
ͦͷલʹɺͲΜͳछྨͷαʔόʔΞʔΩςΫνϟ͕͋ͬͨͷ͔ɺ ͓͢͜͠͞Β͍Ͱ͢ɻ
දతͳαʔόʔΞʔΩςΫνϟ • ϚϧνεϨουϞσϧ • ϚϧνϓϩηεϞσϧ • Πϕϯτۦಈ • ϋΠϒϦουϞσϧ
ϚϧνεϨουϞσϧ main process worker thread worker thread worker thread client
client client thread ϦΫΤετຖʹthreadΛ࡞Γ(࠷ۙPool͕ओྲྀ)ɺͦͷthread্ͰϦΫΤετΛࡹ͘ɻ ϓϩηεͱҧ͍ϝϞϦΛڞ༗Ͱ͖ΔɻʢϩοΫʹΑΔഉଞ੍ޚඞਢʣ C10K͕ʹͳͬͨɻ thread thread
ϚϧνϓϩηεϞσϧ ਤϚϧνεϨουʹࣅ͍ͯΔ͕ɺϓϩηεΛϑΥʔΫͯ͠ϝϞϦۭؒΛ͚Δɻ ϑΥʔΫͨ͠ϓϩηεͰϦΫΤετΛࡹ͍͍ͯ͘ɻ ࢠؒͷ௨৴υϝΠϯιέοτΛ͏ main process worker process fork worker
process worker process client client client fork fork
ΠϕϯτۦಈϞσϧ γϯάϧίΞ্ʹΠϕϯτϧʔϓΛ࡞͠ɺιέοτϑΝΠϧγεςϜ ͷॻ͖ࠐΈ࣌ʹΠϕϯτ(callback)ΛൃՐ͢ΔɻγϯάϧίΞͷͨΊɺ ϨʔείϯσΟγϣϯdeadlockΛؾʹ͢Δඞཁ͕ແ͍͕ɺϚϧνίΞ Λ׆͔͢͜ͱ͕ग़དྷͳ͍ɻC10KΛղܾͨ͠ main process select, epoll, kqueue
client client client
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
͜ͷɺSlimanelibuvϕʔεͷͨΊɺNode.jsͱશ͘Ұॹͷ Πϕϯτۦಈ+WorkerProcessϞσϧΛ࠾༻͍ͯ͠·ͨ͠ɻ
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client ͜ΕͰ͢Ͷ
ͰɺProrsumͱ͍͏ͱʁ
ProrsumͷΞʔΩςΫνϟΛඥղ͘લʹɺ ·ͣSwiftͷඇಉظI/Oฒྻॲཧͷํ๏ΛֶͿඞཁ͕͋Γͦ ͏Ͱ͢
SwiftͰɺiOSͳͲͰUIඳըΛࢭΊͯ͠·͏Α͏ͳॏ͍ॲཧΛ ॻ͘ࡍʹɺGCDͱ͍͏APIΛ͍͔ͬͯͨͱࢥ͍·͢
Grand Central Dispatch(GCD) • DispatchQueue • DispatchSource • DispatchGroup •
DispatchSemaphore ௨ৗΞϓϦέʔγϣϯதʹهड़͢ΔεϨουཧ༻ͷίʔυΛɺ γεςϜϨϕϧͰ࣮ͨ͠ͷ (By Apple ฒߦϓϩάϥϛϯάΨΠυ) https://developer.apple.com/jp/documentation/ConcurrencyProgrammingGuide.pdf දతͳͷҎԼʁ
ཁɺThreadͷཧฒྻϓϩάϥϛϯάθϩ͔Β࣮ ͢ΔͱେมͳͷͰɺγεςϜଆʢLinuxͰ͋ΕϥΠϒϥϦ ଆʣͰ࣮ͨ͠ͷΛɺϓϩάϥϚʹ͍͘͢ఏڙ͠· ͢Αͱ͍͏ͷɻ
Dispatch Queue • λεΫΛqueuingͯ͠ɺ͋ΔThread্Ͱඇಉظ/ಉظత ʹ࣮ߦ͢Δ͜ͱ͕ग़དྷΔAPI • mainQueue, GlobalQueueɺϢʔβʔ࡞Queueʹ͔ ΕΔ •
SerialͱConcurrentͷattribute͕͋Δ • queueʹରͯ͠༏ઌॱҐͷίϯτϩʔϧ͕Մೳ • ҰͭͷQueue࣮ߦྃ·ͰϒϩοΫ͞ΕΔ
Dispatch Queue Serial Task Task Task Task Task queue.async {}
Concurrent Task Task Task Task Task Task Task Task queue.async {} executing waiting balancing
Dispatch Source • ϑΝΠϧهड़ࢠͳͲΛࢹͯ͠ɺԿ͔ͷΠϕϯτ ΛػʹొࡁΈͷcallbackΛݺͼग़ͨ͢ΊͷAPI • ΠϕϯτυϦϒϯͳϓϩάϥϛϯά͕ॻ͚Δ • OSґଘͳඇಉظؔΛ͏·͘ϥοϓͯ͘͠Εͯ ͍Δ(libevʹ͍ۙ)
• ίʔυΛಡΜͩΒɺMacͰkqueueΛͬͯ ϑΝΠϧهड़ࢠΛࢹ͍ͯͨ͠
Dispatch SourceͰࢹՄೳͳͷͷҰ෦ • Timer • Signal • FileSystem • Socket
• MemoryPressure
ͨͱ͑ɺϑΝΠϧͷॻ͖ࠐΈΛݕͯ͠ɺϓ ϩάϥϜΛ࠶ίϯύΠϧ͢ΔΑ͏ͳϓϩάϥϜͳ Ͳ͕؆୯ʹॻ͚ΔΑ͏ʹͳΓ·͢ɻ (LinuxͰݱঢ়epoll͍ͬͯͳ͍ͨΊɺKituraࣗલͰepoll Λॻ͍ͯ·ͨ͠স)
͜͜·ͰநԽ͞ΕͨAPI͕͋ΔͷͰɺ GCDΛ׆͔ͨ͠ΞʔΩςΫνϟ͕SwiftͰྑͦ͞͏Ͱ͢
ͦΕΒΛ౿·͑ɺࠓճܾ·ͬͨΞʔΩςΫνϟ͕ͪ͜Β
ProrsumͷαʔόʔΞʔΩςΫνϟ DispatchSource + DispatchQueueΛͬͨ Πϕϯτۦಈ + WorkerThreadͷϋΠϒϦοτϞσϧ main thread DispatchSourceͰɺ
listeningSocketΛࢹ Queue Queue Queue Queue Queue Queue Queue Queue Queue client DispatchQueue(concurrent) nonblocking I/O blocking I/O
GCDʹΑΓɺΠϕϯτۦಈϞσϧͷϚϧνίΞΛ׆͔ͤͳ͍ Λ1ϓϩηε͚ͩͰղܾͰ͖·ͨ͠ɻ (CPUΛ͍Ε͍ͯͳ͍ͱ͍͏ผ͕·ͩ͋Δ…)
·ͨɺγϯάϧϓϩηεͱ͍͏͜ͱͰ Slimaneʹൺͯϓϩηεཧඇৗʹ؆୯ʹ
͔͠͠ɺ·ͨ৽ͨͳ͕ൃੜ
SlimaneશͳΠϕϯτۦಈαʔόʔͩͬͨͷͰɺɺ
None
CallBack Hell!!
None
callbackͷ • ͦͦSwiftඪ४ͰඇಉظύϥμΠϜʹऑ͍ (Promise FutureɺAsync/Await͕ݴޠػೳʹͳ͍) • ΤϥʔϋϯυϦϯά͕͍͠(callbackຖʹΤϥʔॲཧ͕ඞཁ) • try catchͱ૬ੑѱ͍
• ॥ࢀরΛ࡞Γ͍͢ʢΩϟϓνϟϦετΛॻ͖ΕΔʣ • return͠Εͯcallback͕2ճݺΕΔ • @escapingͱ͔ɺ(T)->Voidͱ͔Կճॻ͘ͷ໘
͔͠͠ɺɺ
GCDɺඇಉظॲཧͷ݁ՌΛblockͰड͚औΔͱ͍͏Ξ ϓϩʔνΛ࠾༻͍ͯ͠·ͨ͠ɺɺ ʢͱ͍͑ɺ͜ΕʹΑΓɺϨʔείϯσΟγϣϯͳͲΛ͋·Γؾʹ͠ͳͯ͘ྑ͘ͳ Γ·͢ɻʣ
block = callback
·ɺ·͔͞ww
None
None
͑ɺ݁ہwww
ͪΐͬɺͯΑ͒
SwiftͰαʔόʔॻ͘ͷ͖͋ΒΊΑ͏͔ͳ… ) DispatchGroupDispatchSemaphore Ͱ͋ΔఔcallbackΛແ͘͢͜ͱग़དྷ·͢
ͨͩɺΈ͞ͳΜࢥ͍ग़͍ͯͩ͘͠͞ɻ
ඇಉظͷϑϩʔ੍ޚΛcallbackҎ֎Ͱղܾͨ͋͠ͷݴޠΛ
None
……….
GoݴޠͩΑʔ
Goݴޠͱ GoϓϩάϥϛϯάݴޠͷͻͱͭɻGoogleʹΑͬͯ։ൃ ͞Ε͓ͯΓ[4]ɺઃܭʹϩϒɾύΠΫɺέϯɾτϯϓιϯΒ ͕ؔΘ͍ͬͯΔɻ ओͳಛͱͯ͠ɺܰྔεϨοσΟϯάͷͨΊͷػೳɺ PythonͷΑ͏ͳಈతܕ͚ݴޠͷΑ͏ͳϓϩάϥϛϯάͷ ༰қੑɺͳͲ͕͋ΔɻGoॲཧܥͱͯ͠ίϯύΠϥͷΈ͕ ։ൃ͞Ε͍ͯΔɻ Wikipedia, Go
(ϓϩάϥϛϯάݴޠ)ΑΓ
Goݴޠͷฒߦ/ฒྻॲཧ GoݴޠͰGoroutineΛͬͯɺฒߦ/ฒྻॲཧΛ࣮ݱ͍ͯ͠·͢ɻ ฒߦ(Concurrent) ฒྻ(parallel)
Goroutine GoroutineෳThread্ʹଟॏԽ͞ΕͨCoroutineͷΑ͏ͳಈ࡞Λ͢Δɻ Ұͭͷgoroutine͕͍࣌ؒϒϩοΫ͢Α͏ͳؔͰɺผͷgoroutineʹhand off͠ ͯॲཧΛଓߦ͢ΔͨΊɺCPUΛ༨ΒͤͣʹޮతʹϓϩάϥϜΛ࣮ߦͰ͖Δ G1 G2 G3 G4 G5
sleep(1) G6 G4 G5 sleep(1) G6 G8 G4 G7 G9 thread1 thread2 thread3
Channel GorotuineThreadؒΛ·͍ͨͰ࣮ߦ͞ΕΔͨΊɺGoroutineಉ࢜ͰҰͭͷมΞΫ ηε͢ΔͱRace Condition͕ൃੜͯ͠͠·͏ɻ ͦΕΛ͙ͨΊʹɺGoͰChannelͱ͍͏ػೳ͕ఏڙ͞Ε͓ͯΓɺͦΕΛͬͯ Λૹड৴͢Δ G1 G2 G3 send
send send main thread receive Channel
ίʔυ ͜ͷϓϩάϥϜͷ݁ՌɺHello WorldͱWorld HelloͷͲͪΒ ͔ʹͳΓ·͢
goroutineͰ͔֬ʹthreadΛͬͨฒྻॲཧʢඇಉظॲཧʣ ͕ߦΘΕ͍ͯΔ͜ͱ͕Θ͔Γ·ͨ͠ɻ
None
ඇಉظͰ͋ΔͷʹɺίʔυͱͯಉظతͰ͢ΑͶɻ
ͳͥͳΒɺChannelͷૹड৴ϒϩοΫ͞ΕΔ͔ΒͰ͢ɻ
= ChannelΛͬͨഉଞ੍ޚͰ͢Ͷ
DispatchQueueThreadϕʔεͰͨ͠ɻ
ͱ͍͏͜ͱʂ
Goroutine+ChannelͷΠϯλʔϑΣʔεΛ͑ɺ SwiftͰඇಉظॲཧ͕ಉظతʹॻ͚ͦ͏Ͱ͢ɻ (Context switchOSଆͰ͕͢..)
ͦ͜ͰɺProrsumʹGoroutineͱChannelͷΑ͏ͳػೳΛ࣮͠ ͯΈ·ͨ͠
None
None
None
None
ChannelʹΑΓɺϓϩάϥϚDispatchQueueؒͷͷڞ༗࣌ ʹɺഉଞ੍ޚ͔Β։์͞Ε·͢
• ݱঢ়ͨͩͷDispatchQueue.asyncͷΤΠϦΞε • serial͔ɺconcurrent͔࣮ߦ࣌ʹબՄೳ • GoͷΑ͏ʹϒϩοΩϯάॲཧΛۭ͖εϨουʹ context switch࣮ͤͯ͞ߦ͢ΔΑ͏ͳ࠷దԽ͞ Ε͍ͯͳ͍ •
ThreadϕʔεͳͷͰɺGoroutineΑΓͪΖΜ Ϧιʔεͷރׇૣ͍ Prorsumͷgo()ʹؔͯ͠
• ࣮MutexLockΛͬͨ୯ͳΔδΣωϦοΫͳڞ༗ϝϞϦ • lock͕͔͔ΔͨΊɺ͍ա͗ͨΒੑೳྼԽ͢Δ • BufferLinkedListͰ࣮͞Ε͍ͯΔ • Buffer capacityΛӽ͑ͯૹ৴͢Δͱthrow͢Δ •
Goͱҧ͍ɺtry catchͰΤϥʔͷัଊ͕Մೳ • Processؒͷ௨৴Ͱ͖ͳ͍(ErlangͷActorͳͲͱશ ʹผ) ProrsumͷChannelʹؔͯ͠
ͰɺProrsumͰΞϓϦέʔγϣϯΛॻ͍ͯɺGCDͱChannel ͷΈ߹Θ͕࣮ͤ༻తͳͷ͔ݟͯΈ·͠ΐ͏
ࠓճɺJSON-RPC ServerΛॻ͍ͯΈ·ͨ͠
None
ಈ࡞σϞ
ιʔείʔυͷղઆ
ؾʹͳΔύϑΥʔϚϯε
ࠓճɺGoɺKituraɺNode.jsͦͯ͠Prorsum ͰϕϯνϚʔΫରܾΛͯ͠Έ·ͨ͠ɻ
Benchmarking Request/sec 0 17500 35000 52500 70000 Prorsum Kitura Go
1.7 HTTP Server Express 14,769 64,768 17,144 29,436 ɾwrk -d 30s -t 4 -c 20 ɾResponded with the 10 length of random JSON array ɾMachine: MacOS Sierra, 8 logical cores, 8GB RAM
• Go͗͢ (´ʀωʀʆ)ŲƄƂŕ • KituraͱExpressϑϨʔϜϫʔΫͳͷͰɺ͜ͷϕϯν ϚʔΫࣗମશʹFairͰͳ͍ • Prorsum2Ґͱ͍͏݁Ռ͕ͩɺϦΫΤετͷread/writeΛ ϊϯϒϩοΩϯάʹ͢ΕɺGOʹ͏গ͠ബͦ͠͏ •
Node.jsͱಉҎ্ͳύϑΥʔϚϯεɺ΄΅Swiftඪ४Ͱ ग़Δ • ࠓճ࠶ߟͨ͠ΞʔΩςΫνϟɺҰԠޭʁ ײ
࠷ޙʹ
swift-server/work-groupʹͯҎԼͷϥΠϒϥϦΛ Swiftඪ४Ͱ͑ΔΑ͏ʹ༷ࡦఆதͰ͢ɻ • RFC 7230-7235(HTTP/1.1) • RFC 6455 (WebSocket) •
RFC 7540(HTTP/2.0) • TCP/IP(v6,v4), UDP including I/O • TLS/Encryption https://github.com/swift-server/work-group
• ͓ͦΒ͘ݱߦͷϑϨʔϜϫʔΫެࣜαʔόʔAPI ʹ͔ͬͬͯ͘Δͱࢥ͍·͢ɻ • ؤுͬͯࣗ࡞ͯ͠ɺެ͕ࣜग़ͨλΠϛϯάͰ࣌ ؒͷແବʹͳΔՄೳੑ͕͋Γ·͢ɻ • ಛʹTLSHTTPपΓRFCଟྔͰɺ࣮ෳࡶ ͳͨΊ·Ͱʹ݁ߏͳ͕͔͔࣌ؒΓ·͢ɻ
3rd partiyͷϥΠϒϥΛԼखʹ૿͢ΑΓɺServer- Work-GroupͷٞʹࢀՃͯ͠ɺ͍͍ඪ४ϥΠϒϥϦΛ ࡞͍ͬͯ͘΄͏͕ݐઃతͰ͢ɻ (ͦͯ͠ɺૣ͘ຊ൪αʔϏεͰ͑ΔΑ͏ʹ…
ProrsumHTTPTLSपΓɺެࣜ൛ʹReplace͢Δ༧ఆͰ͢ɻ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ