Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swiftに適したサーバーアーキテクチャを再考して実装までしてみる

9ebab3d4f66a62a859ad238e7e97597f?s=47 Yuki Takei
December 19, 2016

 Swiftに適したサーバーアーキテクチャを再考して実装までしてみる

Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016

9ebab3d4f66a62a859ad238e7e97597f?s=128

Yuki Takei

December 19, 2016
Tweet

Transcript

  1. Swiftʹదͨ͠αʔόʔΞʔΩςΫ νϟΛ࠶ߟ࣮ͯ͠૷·Ͱͯ͠ΈΔ Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016

  2. TSSS Meetupɺ ͳΜͱ൒೥ͿΓͷ։࠵Ͱ͢ʂ

  3. ࣗݾ঺հ

  4. Swift͕OpenԽ͔ͯ͠Βɺ ৭ʑͳϥΠϒϥϦΛ࡞ͬͯެ։͍ͯ͠·͢ɻ

  5. OSS • Slimane -> Web Framework • Skelton -> Event

    Driven HTTP Server • Suv -> Async Net, I/O Platform (libuv based)
  6. Slimaneͷ։ൃணख͔Βૣ͍͜ͱʹ΋͏໿1೥ (࠷ۙ͸͋·Γ΍ͬͯͳ͍ͷͰ͕͢ɺɺ)

  7. ͔ͭͯ͸ɺSwift͕ຬ଍ʹLinuxͰ͸ಈ͔ͣ

  8. Server-Side-SwiftͷΩʔϓϨΠϠʔͨͪ΋ϑϨʔϜϫʔΫͳͲ ͷେ෦෼ΛࣗલͰ࡞͍ͬͯ·ͨ͠ɻ

  9. ͔͠͠

  10. Swift3͕ϦϦʔε͞ΕͯɺServer SideͰ΋Swiftͷඪ४APIΛੵ ۃతʹ࢖͍ͬͯ͜͏ͱ͍ͬͨྲྀΕʹͳ͖͍ͬͯͯ·͢ɻ

  11. ͦ͜ͰɺࠓͷServe Side Swiftʹదͨ͠ αʔόʔΞʔΩςΫνϟͱ͸ҰମͲΜͳ΋ͷͳͷ͔ʁ

  12. ͦΕΛࣗ෼ͳΓʹ࠶ߟ͠ɺ࣮૷ͯ͠Έ·ͨ͠ɻ ͱ͍͏͓࿩Ͱ͢ɻ

  13. ·ͣ͸ɺࠓճͷൃදͷωλͱͳΔϥΠϒϥϦͷ͝঺հͰ͢

  14. None
  15. • Swift3͕ඪ४Ͱఏڙ͢ΔAPIΛੵۃతʹ࢖ͬͨωοτ ϫʔΫϥΠϒϥϦ • ϑϨʔϜϫʔΫͰ͸ͳ͘ɺ͋͘·ͰωοτϫʔΫϓϩ άϥϛϯά؀ڥ • جຊతʹ͸ಉظI/OͷAPIΛఏڙ (callbackΛۃྗഉআ) •

    ඇಉظϓϩάϥϛϯά͸ಠࣗͷAPIΛར༻͢Δ(ޙड़) • ݱࡏ͸HTTP(S)ɺTCPͷServer/ClientͱIP(v4, 6)Λఏڙ Prorsumͱ͸ʁ
  16. Ͱ͸ૣ଎ɺSwiftʹదͨ͠αʔόʔΞʔΩςΫνϟͱ͸Կͳͷ͔ ୳͍͖͍ͬͯͨͱࢥ͍·͢ɻ

  17. ͦͷલʹɺͲΜͳछྨͷαʔόʔΞʔΩςΫνϟ͕͋ͬͨͷ͔ɺ ͓͢͜͠͞Β͍Ͱ͢ɻ

  18. ୅දతͳαʔόʔΞʔΩςΫνϟ • ϚϧνεϨουϞσϧ • ϚϧνϓϩηεϞσϧ • Πϕϯτۦಈ • ϋΠϒϦουϞσϧ

  19. ϚϧνεϨουϞσϧ main process worker thread worker thread worker thread client

    client client thread ϦΫΤετຖʹthreadΛ࡞Γ(࠷ۙ͸Pool͕ओྲྀ)ɺͦͷthread্ͰϦΫΤετΛࡹ͘ɻ ϓϩηεͱҧ͍ϝϞϦΛڞ༗Ͱ͖ΔɻʢϩοΫʹΑΔഉଞ੍ޚඞਢʣ C10K໰୊͕࿩୊ʹͳͬͨɻ thread thread
  20. ϚϧνϓϩηεϞσϧ ਤ͸ϚϧνεϨουʹࣅ͍ͯΔ͕ɺϓϩηεΛϑΥʔΫͯ͠ϝϞϦۭؒΛ෼͚Δɻ ϑΥʔΫͨ͠ϓϩηε಺ͰϦΫΤετΛࡹ͍͍ͯ͘ɻ ਌ࢠؒͷ௨৴͸υϝΠϯιέοτΛ࢖͏ main process worker process fork worker

    process worker process client client client fork fork
  21. ΠϕϯτۦಈϞσϧ γϯάϧίΞ্ʹΠϕϯτϧʔϓΛ࡞੒͠ɺιέοτ΍ϑΝΠϧγεςϜ΁ ͷॻ͖ࠐΈ࣌ʹΠϕϯτ(callback౳)ΛൃՐ͢ΔɻγϯάϧίΞͷͨΊɺ ϨʔείϯσΟγϣϯ΍deadlock౳Λؾʹ͢Δඞཁ͕ແ͍͕ɺϚϧνίΞ Λ׆͔͢͜ͱ͕ग़དྷͳ͍ɻC10K໰୊Λղܾͨ͠ main process select, epoll, kqueue

    client client client
  22. ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳ਺ͷΞʔΩςΫ νϟΛ૊Έ߹Θͤͨ΋ͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔͸ෆ໌) Node.jsͰ͸ClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker

    worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
  23. ͜ͷ಺ɺSlimane͸libuvϕʔεͷͨΊɺNode.jsͱશ͘Ұॹͷ Πϕϯτۦಈ+WorkerProcessϞσϧΛ࠾༻͍ͯ͠·ͨ͠ɻ

  24. ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳ਺ͷΞʔΩςΫ νϟΛ૊Έ߹Θͤͨ΋ͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔͸ෆ໌) Node.jsͰ͸ClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker

    worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
  25. ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳ਺ͷΞʔΩςΫ νϟΛ૊Έ߹Θͤͨ΋ͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔͸ෆ໌) Node.jsͰ͸ClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker

    worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client ͜ΕͰ͢Ͷ
  26. Ͱ͸ɺProrsum͸ͱ͍͏ͱʁ

  27. ProrsumͷΞʔΩςΫνϟΛඥղ͘લʹɺ ·ͣ͸SwiftͷඇಉظI/O΍ฒྻॲཧͷํ๏ΛֶͿඞཁ͕͋Γͦ ͏Ͱ͢

  28. SwiftͰ͸ɺiOSͳͲͰUIඳըΛࢭΊͯ͠·͏Α͏ͳॏ͍ॲཧΛ ॻ͘ࡍʹɺGCDͱ͍͏APIΛ࢖͍͔ͬͯͨͱࢥ͍·͢

  29. Grand Central Dispatch(GCD) • DispatchQueue • DispatchSource • DispatchGroup •

    DispatchSemaphore ௨ৗ͸ΞϓϦέʔγϣϯதʹهड़͢ΔεϨου؅ཧ༻ͷίʔυΛɺ γεςϜϨϕϧͰ࣮૷ͨ͠΋ͷ (By Apple ฒߦϓϩάϥϛϯάΨΠυ) https://developer.apple.com/jp/documentation/ConcurrencyProgrammingGuide.pdf ୅දతͳ΋ͷ͸ҎԼʁ
  30. ཁ͸ɺThreadͷ؅ཧ΍ฒྻϓϩάϥϛϯά͸θϩ͔Β࣮૷ ͢ΔͱେมͳͷͰɺγεςϜଆʢLinuxͰ͋Ε͹ϥΠϒϥϦ ଆʣͰ࣮૷ͨ͠΋ͷΛɺϓϩάϥϚʹ࢖͍΍͘͢ఏڙ͠· ͢Αͱ͍͏΋ͷɻ

  31. Dispatch Queue • λεΫΛqueuingͯ͠ɺ͋ΔThread্Ͱඇಉظ/ಉظత ʹ࣮ߦ͢Δ͜ͱ͕ग़དྷΔAPI • mainQueue, GlobalQueueɺϢʔβʔ࡞੒Queueʹ෼͔ ΕΔ •

    SerialͱConcurrentͷattribute͕͋Δ • queueʹରͯ͠༏ઌॱҐͷίϯτϩʔϧ͕Մೳ • ҰͭͷQueue͸࣮ߦ׬ྃ·ͰϒϩοΫ͞ΕΔ
  32. Dispatch Queue Serial Task Task Task Task Task queue.async {}

    Concurrent Task Task Task Task Task Task Task Task queue.async {} executing waiting balancing
  33. Dispatch Source • ϑΝΠϧهड़ࢠͳͲΛ؂ࢹͯ͠ɺԿ͔ͷΠϕϯτ Λػʹొ࿥ࡁΈͷcallbackΛݺͼग़ͨ͢ΊͷAPI • ΠϕϯτυϦϒϯͳϓϩάϥϛϯά͕ॻ͚Δ • OSґଘͳඇಉظؔ਺Λ͏·͘ϥοϓͯ͘͠Εͯ ͍Δ(libevʹ͍ۙ)

    • ίʔυΛಡΜͩΒɺMacͰ͸kqueueΛ࢖ͬͯ ϑΝΠϧهड़ࢠΛ؂ࢹ͍ͯͨ͠
  34. Dispatch SourceͰ؂ࢹՄೳͳ΋ͷͷҰ෦ • Timer • Signal • FileSystem • Socket

    • MemoryPressure
  35. ͨͱ͑͹ɺϑΝΠϧ΁ͷॻ͖ࠐΈΛݕ஌ͯ͠ɺϓ ϩάϥϜΛ࠶ίϯύΠϧ͢ΔΑ͏ͳϓϩάϥϜͳ Ͳ͕؆୯ʹॻ͚ΔΑ͏ʹͳΓ·͢ɻ (LinuxͰ͸ݱঢ়epoll࢖͍ͬͯͳ͍ͨΊɺKitura͸ࣗલͰepoll Λॻ͍ͯ·ͨ͠স)

  36. ͜͜·Ͱந৅Խ͞ΕͨAPI͕͋ΔͷͰɺ GCDΛ׆͔ͨ͠ΞʔΩςΫνϟ͕SwiftͰ͸ྑͦ͞͏Ͱ͢

  37. ͦΕΒΛ౿·͑ɺࠓճܾ·ͬͨΞʔΩςΫνϟ͕ͪ͜Β

  38. 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
  39. GCDʹΑΓɺΠϕϯτۦಈϞσϧͷϚϧνίΞΛ׆͔ͤͳ͍໰ ୊Λ1ϓϩηε͚ͩͰղܾͰ͖·ͨ͠ɻ (CPUΛ࢖͍੾Ε͍ͯͳ͍ͱ͍͏ผ໰୊͕·ͩ͋Δ…)

  40. ·ͨɺγϯάϧϓϩηεͱ͍͏͜ͱͰ Slimaneʹൺ΂ͯϓϩηε؅ཧ͸ඇৗʹ؆୯ʹ

  41. ͔͠͠ɺ·ͨ৽ͨͳ໰୊͕ൃੜ

  42. Slimane͸׬શͳΠϕϯτۦಈαʔόʔͩͬͨͷͰɺɺ

  43. None
  44. CallBack Hell!!

  45. None
  46. callbackͷ໰୊఺ • ͦ΋ͦ΋Swiftඪ४Ͱ͸ඇಉظύϥμΠϜʹऑ͍ (Promise΍ FutureɺAsync/Await͕ݴޠػೳʹͳ͍) • ΤϥʔϋϯυϦϯά͕೉͍͠(callbackຖʹΤϥʔॲཧ͕ඞཁ) • try catchͱ૬ੑѱ͍

    • ॥؀ࢀরΛ࡞Γ΍͍͢ʢΩϟϓνϟϦετΛॻ͖๨ΕΔʣ • return͠๨Εͯcallback͕2ճݺ͹ΕΔ໰୊ • @escapingͱ͔ɺ(T)->Voidͱ͔Կճ΋ॻ͘ͷ໘౗
  47. ͔͠͠ɺɺ

  48. GCD΋ɺඇಉظॲཧͷ݁ՌΛblockͰड͚औΔͱ͍͏Ξ ϓϩʔνΛ࠾༻͍ͯ͠·ͨ͠ɺɺ ʢͱ͸͍͑ɺ͜ΕʹΑΓɺϨʔείϯσΟγϣϯͳͲΛ͋·Γؾʹ͠ͳͯ͘ྑ͘ͳ Γ·͢ɻʣ

  49. block = callback

  50. ·ɺ·͔͞ww

  51. None
  52. None
  53. ͑ɺ݁ہwww

  54. ͪΐͬɺ଴ͯΑ͒

  55. SwiftͰαʔόʔॻ͘ͷ͖͋ΒΊΑ͏͔ͳ… ஫) DispatchGroup΍DispatchSemaphore Ͱ͋Δఔ౓callbackΛແ͘͢͜ͱ͸ग़དྷ·͢

  56. ͨͩɺΈ͞ͳΜࢥ͍ग़͍ͯͩ͘͠͞ɻ

  57. ඇಉظͷϑϩʔ੍ޚΛcallbackҎ֎Ͱղܾͨ͋͠ͷݴޠΛ

  58. None
  59. ……….

  60. GoݴޠͩΑʔ

  61. Goݴޠͱ͸ Go͸ϓϩάϥϛϯάݴޠͷͻͱͭɻGoogleʹΑͬͯ։ൃ ͞Ε͓ͯΓ[4]ɺઃܭʹϩϒɾύΠΫɺέϯɾτϯϓιϯΒ ͕ؔΘ͍ͬͯΔɻ ओͳಛ௃ͱͯ͠ɺܰྔεϨοσΟϯάͷͨΊͷػೳɺ PythonͷΑ͏ͳಈతܕ෇͚ݴޠͷΑ͏ͳϓϩάϥϛϯάͷ ༰қੑɺͳͲ͕͋ΔɻGoॲཧܥͱͯ͠͸ίϯύΠϥͷΈ͕ ։ൃ͞Ε͍ͯΔɻ Wikipedia, Go

    (ϓϩάϥϛϯάݴޠ)ΑΓ
  62. Goݴޠͷฒߦ/ฒྻॲཧ GoݴޠͰ͸GoroutineΛ࢖ͬͯɺฒߦ/ฒྻॲཧΛ࣮ݱ͍ͯ͠·͢ɻ ฒߦ(Concurrent) ฒྻ(parallel)

  63. 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
  64. Channel Gorotuine͸ThreadؒΛ·͍ͨͰ࣮ߦ͞ΕΔͨΊɺGoroutineಉ࢜ͰҰͭͷม਺΁ΞΫ ηε͢ΔͱRace Condition͕ൃੜͯ͠͠·͏ɻ ͦΕΛ๷͙ͨΊʹɺGoͰ͸Channelͱ͍͏ػೳ͕ఏڙ͞Ε͓ͯΓɺͦΕΛ࢖ͬͯ஋ Λૹड৴͢Δ G1 G2 G3 send

    send send main thread receive Channel
  65. ίʔυ ͜ͷϓϩάϥϜͷ݁Ռ͸ɺHello WorldͱWorld HelloͷͲͪΒ ͔ʹͳΓ·͢

  66. goroutineͰ͔֬ʹthreadΛ࢖ͬͨฒྻॲཧʢඇಉظॲཧʣ ͕ߦΘΕ͍ͯΔ͜ͱ͕Θ͔Γ·ͨ͠ɻ

  67. None
  68. ඇಉظͰ͸͋Δͷʹɺίʔυ͸ͱͯ΋ಉظతͰ͢ΑͶɻ

  69. ͳͥͳΒɺChannelͷૹड৴͸ϒϩοΫ͞ΕΔ͔ΒͰ͢ɻ

  70. = ChannelΛ࢖ͬͨഉଞ੍ޚͰ͢Ͷ

  71. DispatchQueue͸ThreadϕʔεͰͨ͠ɻ

  72. ͱ͍͏͜ͱ͸ʂ

  73. Goroutine+ChannelͷΠϯλʔϑΣʔεΛ࢖͑͹ɺ SwiftͰ΋ඇಉظॲཧ͕ಉظతʹॻ͚ͦ͏Ͱ͢ɻ (Context switch͸OSଆͰ͕͢..)

  74. ͦ͜ͰɺProrsumʹGoroutineͱChannelͷΑ͏ͳػೳΛ࣮૷͠ ͯΈ·ͨ͠

  75. None
  76. None
  77. None
  78. None
  79. ChannelʹΑΓɺϓϩάϥϚ͸DispatchQueueؒͷ஋ͷڞ༗࣌ ʹɺഉଞ੍ޚ͔Β։์͞Ε·͢

  80. • ݱঢ়͸ͨͩͷDispatchQueue.asyncͷΤΠϦΞε • serial͔ɺconcurrent͔࣮ߦ࣌ʹબ୒Մೳ • GoͷΑ͏ʹϒϩοΩϯάॲཧΛۭ͖εϨουʹ context switch࣮ͤͯ͞ߦ͢ΔΑ͏ͳ࠷దԽ͸͞ Ε͍ͯͳ͍ •

    ThreadϕʔεͳͷͰɺGoroutineΑΓ΋΋ͪΖΜ Ϧιʔεͷރׇ͸ૣ͍ Prorsumͷgo()ʹؔͯ͠
  81. • ࣮͸MutexLockΛ࢖ͬͨ୯ͳΔδΣωϦοΫͳڞ༗ϝϞϦ • lock͕͔͔ΔͨΊɺ࢖͍ա͗ͨΒੑೳ͸ྼԽ͢Δ • Buffer͸LinkedListͰ࣮૷͞Ε͍ͯΔ • Buffer capacityΛӽ͑ͯૹ৴͢Δͱthrow͢Δ •

    Goͱҧ͍ɺtry catchͰΤϥʔͷัଊ͕Մೳ • Processؒͷ௨৴͸Ͱ͖ͳ͍(ErlangͷActorͳͲͱ͸׬શ ʹผ෺) ProrsumͷChannelʹؔͯ͠
  82. Ͱ͸ɺProrsumͰΞϓϦέʔγϣϯΛॻ͍ͯɺGCDͱChannel ͷ૊Έ߹Θ͕࣮ͤ༻తͳͷ͔ݟͯΈ·͠ΐ͏

  83. ࠓճ͸ɺJSON-RPC ServerΛॻ͍ͯΈ·ͨ͠

  84. None
  85. ಈ࡞σϞ

  86. ιʔείʔυͷղઆ

  87. ؾʹͳΔύϑΥʔϚϯε

  88. ࠓճ͸ɺGoɺKituraɺNode.jsͦͯ͠Prorsum ͰϕϯνϚʔΫରܾΛͯ͠Έ·ͨ͠ɻ

  89. 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
  90. • Go଎͗͢ (´ʀωʀʆ)ŲƄƂŕ • KituraͱExpress͸ϑϨʔϜϫʔΫͳͷͰɺ͜ͷϕϯν ϚʔΫࣗମ͸׬શʹFairͰ͸ͳ͍ • Prorsum͸2Ґͱ͍͏݁Ռ͕ͩɺϦΫΤετͷread/writeΛ ϊϯϒϩοΩϯάʹ͢Ε͹ɺGOʹ΋͏গ͠೑ബͦ͠͏ •

    Node.jsͱಉ౳Ҏ্ͳύϑΥʔϚϯε͸ɺ΄΅Swiftඪ४Ͱ ΋ग़Δ • ࠓճ࠶ߟͨ͠ΞʔΩςΫνϟ͸ɺҰԠ੒ޭʁ ײ૝
  91. ࠷ޙʹ

  92. 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
  93. • ͓ͦΒ͘ݱߦͷϑϨʔϜϫʔΫ΋ެࣜαʔόʔAPI ʹ৐͔ͬͬͯ͘Δͱࢥ͍·͢ɻ • ؤுͬͯࣗ࡞ͯ͠΋ɺެ͕ࣜग़ͨλΠϛϯάͰ࣌ ؒͷແବʹͳΔՄೳੑ͕͋Γ·͢ɻ • ಛʹTLS΍HTTPपΓ͸RFC΋ଟྔͰɺ࣮૷΋ෳࡶ ͳͨΊ׬੒·Ͱʹ݁ߏͳ͕͔͔࣌ؒΓ·͢ɻ

  94. 3rd partiy੡ͷϥΠϒϥΛԼखʹ૿΍͢ΑΓ΋ɺServer- Work-Groupͷٞ࿦ʹࢀՃͯ͠ɺ͍͍ඪ४ϥΠϒϥϦΛ ࡞͍ͬͯ͘΄͏͕ݐઃతͰ͢ɻ (ͦͯ͠ɺૣ͘ຊ൪αʔϏεͰ࢖͑ΔΑ͏ʹ…

  95. Prorsum΋HTTP΍TLSपΓ͸ɺެࣜ൛ʹReplace͢Δ༧ఆͰ͢ɻ

  96. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ