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

「メルカリ アッテ」を支える Google App Engine と Golang

「メルカリ アッテ」を支える Google App Engine と Golang

2016年6月8日の appengine ja night #33 の発表資料です。

Tatsuya Tsuruoka

June 08, 2016
Tweet

More Decks by Tatsuya Tsuruoka

Other Decks in Programming

Transcript

  1. ʮϝϧΧϦΞοςʯΛࢧ͑Δ
    2016/06/08
    (PPHMF"QQ&OHJOFͱ(PMBOH

    View Slide

  2. ࣗݾ঺հ
    2
    ௽Ԭ ୡ໵
    • ι΢κ΢ & ϝϧΧϦ
    • ૑ۀ࣌ͷόοΫΤϯυͷΤϯδχΞϦϯάͱ

    ։ൃνʔϜͷϚωʔδϝϯτΛ୲౰
    • νʔϜָ͕͘͠࢓ࣄͰ͖Δ৔Λ࡞Δͷ͕޷͖

    View Slide

  3. ֓ཁ
    3
    1. ৽ن Web αʔϏεͷΠϯϑϥ؀ڥͱͯ͠

    GAE/Go Λ࠾༻ͨ͠ͷ͸ͳ͔ͥ 

    2. GAE/Go ʹΑΔ։ൃͱӡ༻͸ͲͷΑ͏ͳ΋ͷͳͷ͔ɻ

    ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ

    αϙʔτମ੍ɺίετ͸ɺଞͷΠϯϑϥ؀ڥͱൺֱͯ͠
    Ͳ͏͔ͩͬͨ

    View Slide

  4. ("&(P࠾༻ͷཧ༝

    View Slide

  5. GAE/Go ࠾༻ͷཧ༝
    5
    • ཧ༝1 : GAE ͷεέʔϥϒϧͳ෼ࢄγεςϜͷ࢓૊Έ
    • ཧ༝2 : GCP ੝Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ
    • ཧ༝3 : νʔϜ։ൃʹ޲͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ

    View Slide

  6. GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE
    6
    • લఏɿ৽نࣄۀΞοςͷΠϯϑϥཁ݅
    • άϩʔόϧ
    • ෳ਺ϦʔδϣϯʢUSɺEUɺAPACʣͰαʔϏεΛల։͍ͨ͠
    • ڞ௨ͷίʔυ & ͻͱͭͷσʔλϕʔε
    • େن໛ΞϓϦέʔγϣϯ
    • DAU਺ઍສਓن໛ɻॠؒతͳΞΫηε͸਺ສϦΫΤετ/ඵ
    • ϋΠεέʔϥϒϧ
    • ػೳվम࣌ͳͲʹαʔϏεແఀࢭʹ͍ͨ͠
    • εέʔϧͷͨΊͷ४උ࡞ۀΛͳ͍ͨ͘͠

    View Slide

  7. GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE
    7
    • Α͋͘ΔΞϓϩʔνͰɺ͏·͍͘͘΋ͷ͸ɿ
    • ҊA : աڈʹܦݧͷ͋Δߏ੒΍طଘͷΠϯϑϥΛ࢖͏
    • ҊB : ৽نઃܭɻকདྷతʹ͸ඞཁʹԠͯ͡ઃܭΛੈ୅ަ୅ͤ͞Δ
    • → ϝϧΧϦͷͱ͖͸ҊBɻϦϦʔεޙ3ϲ݄Ͱ਺ेສϢʔβͱ͍͏૝ఆΛ͠
    ͯɺߴੑೳઐ༻αʔό1୆Ͱߏஙɻߏ੒Λੈ୅ަ୅ͤ͞Δ͜ͱͰεέʔϧ͞
    ͍ͤͯͬͨ
    • ࠓճͷ৽نࣄۀͷΠϯϑϥཁ݅͸ϋʔυϧ͕ߴ͘ɺҊAɺҊB ͲͪΒͷΞϓ
    ϩʔν΋͏·͋ͯ͘͸·Βͳ͔ͬͨ

    View Slide

  8. GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE
    8
    • ผͷΞϓϩʔνɺPaaS ʹ͍ͭͯߟ͑ͯΈΔ
    • GAE Ҏ֎ͷ PaaS ͸ʁ
    • AWS ্ʹߏஙͯ͠ఏڙ͞Ε͍ͯΔ PaaS ͸ AWSʢIaaSʣͷ੍໿Λड͚ͯ
    ͠·͏
    • PaaS ΛӡӦ͍ͯ͠Δاۀͷن໛͕খ͍͞৔߹ɺͦ͜ʹΠϯϑϥΛ༬͚Δͱ
    ϦεΫΛίϯτϩʔϧͮ͠Β͍
    • Microsoft Azure ΍ Force.com ͸ɺࠓճͷ։ൃཁ݅ʹ͸߹Θͳ͍

    View Slide

  9. GAE/Go ࠾༻ͷཧ༝1 : εέʔϥϒϧͳ GAE
    9
    • GAE → ཁ݅ΛຬͨͤΔ
    • άϩʔόϧ
    • US ͔Βੈք޲͚ʹଟ͘ͷαʔϏε͕ల։͞Ε͍ͯΔ
    • Google ͱΠϯϑϥΛڞ༻͍ͯ͠Δ GAE ΋౰વάϩʔόϧରԠ
    • େن໛ΞϓϦέʔγϣϯ
    • Snapchat ͷΑ͏ͳDAU1ԯਓن໛ͷࣄྫ
    • ϋΠεέʔϥϒϧ
    • ෼ࢄγεςϜΛ࡞ΔͨΊͷ࢓૊Έ͕੔͍ͬͯΔ
    • খ͞ͳن໛͔Βେ͖ͳن໛·Ͱઢܗʹεέʔϧ

    View Slide

  10. GAE/Go ࠾༻ͷཧ༝2 : GCP ੝Γ্͕Γͷஹ͠
    10
    • ཧ༝2 : GCP ੝Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ
    • 2015೥9݄ࠒɺ৽نࣄۀͷٕज़બఆΛ࢝͠Ίͨͱ͖ʹɺ͢Ͱʹ GCP(GKE) Λ
    ࢖ͬͯ։ൃΛ͍ͯͨ͠ΤϯδχΞ͔ΒʮGCP ͕ඇৗʹྑ͔ͬͨʯͱ͍͏࿩Λ
    ฉ͍ͨ
    • ͦΕ·Ͱ BigQuery ΍ GCE ͘Β͍͔͠৮͍ͬͯͳ͔ͬͨͷͰɺ৘ใऩूΛ։
    ࢝ɻGoogle ͷ୲౰ऀΛ঺հͯ͠΋Β͍ɺ͙͢ʹ࠷৽ͷ GCP ৘ใΛڭ͑ͯ΋
    Β͏
    • → AWS ͷιϦϡʔγϣϯΞʔΩςΫτͷΑ͏ͳ௚઀࿩ͤΔٕज़୲౰ऀ͕͍
    Δ͜ͱʹ·ͣڻ͍ͨ

    View Slide

  11. GAE/Go ࠾༻ͷཧ༝2 : GCP ੝Γ্͕Γͷஹ͠
    11
    • ࠓͰͦ͜ීٴ͍ͯ͠Δ AWS ΋౦ژϦʔδϣϯ͕ͳ͍͜Ζ͸ٕज़୲౰ऀ΋͍ͳ
    ͯ͘ɺΦϯϥΠϯυΩϡϝϯτΛཔΔ͔͠ͳ͔ͬͨ
    • ௚ۙ·Ͱ GCP ΋ͦ͏͍͏ঢ়ଶʹͳ͍ͬͯΔͱࢥ͍ͬͯͨ
    → ௚઀࿩ͤΔ୲౰ऀ͕͍ͯɺGCP ʹؔ͢Δٙ໰ʹ΋ਝ଎ˍత֬ʹճ౴Λ΋Β
    ͑Δঢ়ଶ
    • ͞ΒʹΦϯϥΠϯ্Ͱ΋ɺGoogle ʹΑΔ GCP ͷ৘ใΞοϓσʔτස౓͸ߴ
    ·͍ͬͯΔ
    • → Google ͕ GCP ʹରͯ͠ଟ͘ͷϦιʔεΛׂ͍͍ͯΔ͜ͱ͕Θ͔ͬͨɻ
    αʔϏεΛͷͤΔΠϯϑϥͱͯ͠े෼ʹ҆શͱ൑அ

    View Slide

  12. GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ
    12
    • ࠷ॳʹ Golang ʹ͍ͭͯݕ౼͢ΔΑ͏ʹͳ͖͔͚ͬͨͬɿ


    ࠾༻ձ৯ʹ޲͔͏λΫγʔͷத… 

    ࢁాʮ࣍Ͳ͏͍͏ݴޠͰ࡞Δʁʯ

    ௽ʮϝϧΧϦͱಉ͡ PHP Ͱ͢Ͷʯ

    ࢁాʮGo ͬͯͲ͏͔ͳʁʯ

    ௽ʮྑ͍ݴޠͰ͢Ͷɻͨͩࠓճ΋PHPͰ࣮֬ʹ࡞Ζ͏ͱࢥ͍·͢ʯ

    ʢͦͷޙ Golang ʹ͍͍ͭͯΖ͍Ζ৘ใΛूΊΔʣ

    View Slide

  13. GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ
    13
    • Golang ͱ Web αʔϏε։ൃͷ૬ੑ
    • CLI ͳͲγεςϜϓϩάϥϛϯά͸ಘҙͳྖҬͱͯ͠޿͘஌ΒΕ͍ͯΔ
    • → ϝϧΧϦࣾ಺Ͱ΋ଟ਺ͷ࣮੷͋Δ Go ϓϩμΫτ͕͋Γɺੜ࢈ੑͷߴ
    ͞͸ೝ͍ࣝͯͨ͠
    • ࣮ࡍʹ৮ΔͱɺWeb αʔϏε։ൃʹ͓͍ͯ΋ඇৗʹڧྗͳ͜ͱ͕Θ͔ͬͯ
    ͖ͨ
    • ݴޠࣗମͷಛ௃ɿ੩తܕ෇͚ɺγϯϓϧͳߏจɺgo fmt/doc ͳͲ
    • ύοέʔδ/ϥΠϒϥϦͷےͷྑ͞ɿnet/http ΍ x/net/context
    • GAE ΋ Golang ͷਖ਼ࣜରԠ͕ൃද͞Ε͍ͯͨʢ2015೥7݄ʣ

    View Slide

  14. GAE/Go ࠾༻ͷཧ༝3 : Golang αϙʔτ
    14
    • ཧ༝1 : GAE ͷεέʔϥϒϧͳ෼ࢄγεςϜͷ࢓૊Έ
    • ཧ༝2 : GCP ੝Γ্͕Γͷஹ͠ͱকདྷͷՄೳੑ
    • ཧ༝3 : νʔϜ։ൃʹ޲͍͍ͯΔ GolangɻGAE ʹΑΔਖ਼ࣜରԠ


    → ͜ΕΒͷཧ༝Ͱι΢κ΢ࣾ͸ GAE/Go ʹܾఆɻ

    ϝϧΧϦʹର͢Δι΢κ΢ͷٕज़తͳҐஔ͚͕ͮϋοΩϦͯ͠ɺ

    ਺೥ޙʹͲ͏ͳ͍ͬͯΔ͔΋૝૾Ͱ͖ͨͷͰ໎͍ͳܾ͘ఆͰ͖ͨ

    View Slide

  15. ("&(P࠾༻ͷ݁Ռ

    View Slide

  16. GAE/Go ࠾༻ͷ݁Ռ
    16
    • ݁Ռ1 : ੜ࢈ੑ
    • ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε
    • ݁Ռ3 : Մ༻ੑ
    • ݁Ռ4 : αϙʔτମ੍
    • ݁Ռ5 : ίετ

    View Slide

  17. GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ
    17
    • ͲΕ͚ͩૉ੖Β͍͠ͱݴΘΕΔΠϯϑϥ΍։ൃݴޠͰ͋ͬͯ΋ɺ
    ͔ͦ͜ΒϓϩμΫτ͕ϦϦʔε͞Εͳ͚Ε͹ɺҙຯ͕ͳ͍
    • ࠓճɺGAE/Go Λࣗ৴Λ࣋ͬͯબ୒ͨ͠΋ͷͷɺ͜ͷٕज़͕ੈؒ
    ҰൠͰ΋ීٴ͍ͯ͘͠΋ͷͳͷ͔͸Α͘ݟۃΊΔඞཁ͕͋ͬͨ
    • →ʮΞοςʯͷόοΫΤϯυͷ։ൃ͸શһ͕ GAE ΋ Golang ΋
    ະܦݧ͔Β࢝·͍ͬͯΔɻࣾ಺ͷৄ͍͠ਓʹ͸(ҙਤతʹ)૬ஊͤ
    ͣʹ։ൃ

    View Slide

  18. GAE/Go ࠾༻ͷ݁Ռ1 : ੜ࢈ੑ
    18
    • ࣮ࡍʹͲ͏͔ͩͬͨɿ
    • ։ൃணख͔Β2ϲ݄໨ʹݶఆެ։όʔδϣϯΛϦϦʔεɻ5ϲ݄
    ໨ʹਖ਼ࣜ൛ϦϦʔε
    • ະܦݧ͔Β࢝·ͬͯ΋ԿΒ͔ͷΠϯϑϥͱ։ൃݴޠΛѻ͑ΔΤ
    ϯδχΞͰ͋Ε͹ɺ͙͢ʹϓϩμΫτͷ։ൃʹՃΘΕΔ
    • → ೖࣾͯ͠1िؒҎ಺ʹຊ൪؀ڥͰಈ͘ίʔυΛॻ͍ͯߩݙɻ
    1ϲ݄໨ʹ͸पғͷίʔυͱḮ৭ͳ͍Ϩϕϧ΋
    • ݁Ռ1: ੜ࢈ੑ → ˕ྑ͍

    View Slide

  19. GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε
    19
    • ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε

    • GAE ͷΞϓϦ͸ɺਖ਼͘͠ઃܭ࣮ͯ͠૷ͨ࣌͠఺Ͱෛՙରࡦ͕׬ྃ
    ͍ͯ͠Δ
    → ྫɿϝοηʔδػೳɻDatastore ʹ௥هͯ͠औಘ͢Δ͚ͩɻ
    Ϣʔβ͕ͲΕ͚ͩ૿͑ͯϝοηʔδྲྀ௨݅਺΍ಡΈऔΓճ਺͕૿
    ͑ͯ΋Կ΋͠ͳͯ͘ OK

    View Slide

  20. GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε
    20
    • ΞοςͰ࣮ࡍʹ͋ͬͨෛՙɿ
    • ϝϧΧϦͷΞϓϦ্ͷόφʔ͔ΒΞος΁ͷ༠ಋ
    • → ҰॠͰ App Store ϥϯΩϯά্Ґ΁
    • ਺ेສʙ਺ඦສ݅ͷ Push ௨஌ͷҰ੪഑৴
    • → ॠؒతʹΞΫηε͕਺ेഒʹ
    • ͜ΕΒͷෛՙ͸ GAE/Go ্ͰαʔϏε͕ಈ͍͍ͯΔ࣌఺ͰࣗಈͰ
    εέʔϧͯ͠ରԠͰ͖Δ

    View Slide

  21. GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε
    21
    • ϓϩϏδϣχϯά΍΢ΥʔϜΞοϓ͸ෆཁ
    • ϓϩϞʔγϣϯνʔϜͱΤϯδχΞ͕ࣄલʹෛՙʹ͍ͭͯଧͪ
    ߹ΘͤΔඞཁͳ͠
    • 1Ϣʔβͷͱ͖ʹਖ਼͘͠ಈ͍͍ͯΕ͹ɺԿઍສϢʔβʹͳͬͯ΋໰
    ୊ͳ͠ ※ಛఆͷΩʔʹର͢Δߋ৽ॲཧ͕େྔൃੜ͢Δͱ͖ͳͲɺྫ֎͸͋Γ

    View Slide

  22. GAE/Go ࠾༻ͷ݁Ռ2 : εέʔϥϏϦςΟͱύϑΥʔϚϯε
    22
    • ͜ͷεέʔϥϏϦςΟ͸ Golang ͷύϑΥʔϚϯεʹΑ࣮ͬͯݱ͞
    Ε͍ͯΔ
    • GAE ͷΠϯελϯε͸
    • Golang ͷ৔߹ɺ਺ेms Ͱىಈ͢Δ
    • ΞΫηε͕͋Ε͹૿͑ͯɺͳ͚Ε͹ݮΔ
    → ΞΫηε͕͋Δͱ͖ʹॠ࣌ʹىಈ͢ΔͷͰ΢ΥʔϜΞοϓෆཁ
    • ݁Ռ2: εέʔϥϏϦςΟͱύϑΥʔϚϯε → ˕ྑ͍

    View Slide

  23. GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ
    23
    • ݁Ռ3 : Մ༻ੑ

    • Ξος͸ 100% Քಇத
    → ·ͩӡ༻ظ͕ؒ୹͍ͨΊਖ਼֬ͳධՁ͸Ͱ͖ͳ͍
    • ϝϧΧϦͷաڈͷΠϯϑϥ͸ϐʔΫλΠϜʹͳΔͱμ΢ϯ͢Δ͜ͱ
    ͕Α͋ͬͨ͘ͷͰɺࣾ಺ͷ໨ඪઃఆʹՔಇ཰ΛೖΕ͍ͯͨ
    • Ξος͸100%αʔϏεఏڙͰ͖Δ͜ͱ͕લఏͳͷͰ໨ඪઃఆ΋͠
    ͍ͯͳ͍

    View Slide

  24. GAE/Go ࠾༻ͷ݁Ռ3 : Մ༻ੑ
    24
    • ϝϯςφϯε΍ܭըఀࢭ͸ʁ
    →ΞοςͰ͸ϝϯςφϯε΍ܭըఀࢭ͸༧ఆ͍ͯ͠ͳ͍ɻྫ͑͹
    DB ʹΧϥϜΛ௥Ճ͢ΔͨΊʹαʔϏεΛࢭΊͨΓ͸͠ͳ͍
    • GAE + Datastore Ͱ͋Ε͹؆୯ʹආ͚ΒΕΔ
    • ͍ͭͰ΋࢖͑ΔαʔϏεʹ͢ΔͨΊʹɺଟେͳ࿑ྗΛ෷͍ͬͯΔΘ
    ͚Ͱ͸ͳ͍఺͕େࣄ
    • GAE ΍ Datastore ͷಛੑʹ߹Θͤͯ࡞Ε͹ɺͦ͏ͳΔ

    • ݁Ռ3: Մ༻ੑ → ˕ྑ͍

    View Slide

  25. GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍
    25
    • ݁Ռ4 : αϙʔτମ੍

    • ࣄલʹ৘ใΛूΊͯαϙʔτମ੍ʹ͍ͭͯ͸Α͘Θ͔Βͳ͔ͬͨ
    ͷͰɺݸਓతʹ͸Ұ൪ݒ೦ͩͬͨ఺
    • Google ͞ΜͱͷϛʔςΟϯάΛ܁Γฦͨ͠ΓɺGCP ͷ༗ঈαϙʔ
    τʢGoldϓϥϯʣʹೖΔ͜ͱͰɺॆ࣮ͨ͠ମ੍͕ݟ͖͑ͯͨ

    View Slide

  26. GAE/Go ࠾༻ͷ݁Ռ4 : αϙʔτମ੍
    26
    • ϝϧΧϦͷ஍ͷརɿಉ͡Ϗϧʹ Google ͞Μ͕͍ΔͷͰɺࠔͬͨͱ
    ͖ʹ͙͢ʹ௚઀࿩ͯ͠৘ใަ׵Ͱ͖Δ
    → Ӧۀ୲౰ऀ΍ٕज़୲౰ऀ͕ͨ͘͞Μ͍ΔͷͰɺଞͷϏϧͷօ͞
    ·΋΄΅ಉ༷ͷαϙʔτ͸ड͚ΒΕΔ(͸ͣ)
    • GCP ͷ༗ঈαϙʔτɺߴ౓ͳٕज़తͳ࣭໰ʹରͯ͠΋1࣍ճ౴͸
    ౰೔ʹདྷͨΓɺ஗ͯ͘΋2೔Ҏ಺ʹ໰୊͕ղܾ͢Δ
    • ଞͷબ୒ࢶɿτοϓήʔτ͞ΜͷΑ͏ͳ GCP ύʔτφʔاۀ
    • ݁Ռ4: αϙʔτମ੍ → ˕ྑ͍

    View Slide

  27. GAE/Go ࠾༻ͷ݁Ռ5 : ίετ
    27
    • ݁Ռ5 : ίετ

    • աڈʹ͸ར༻ྉ͕ۚߴֹͩͬͨ࿩Λฉ͍ͨΓ͢Δ
    • աڈ͸Ұ୴๨Εͯɺ͍·࢖͏ͱͲ͏͍͏ֹۚʹͳΔͷ͔Λ஌Δ
    • ݱࡏ͸ۃΊͯ௿ίετʹͳ͍ͬͯΔ

    View Slide

  28. GAE/Go ࠾༻ͷ݁Ռ5 : ίετ
    28
    • Ξοςͷ GCP ؀ڥɺ5݄ͷར༻ྉۚʢ໨҆ʣ
    ։ൃ؀ڥ * αʔόαΠυΤϯδχΞਓ਺෼ = 0ԁʢ1ԁະຬʣ
    QA ؀ڥ = 1,100ԁ
    ຊ൪؀ڥ͸ɺDAU100ສ׵ࢉ͢Δͱ200ສԁ
    • අ༻ͷ಺༁
    ɾDatastore Read Ops 46%ɺSimple Searches 28%ɺ

    Frontend Instances 17%ɺOut Bandwidth 4%ɺͦͷଞ 4%

    View Slide

  29. GAE/Go ࠾༻ͷ݁Ռ5 : ίετ
    29
    • Πϯϑϥઐ೚ͷΤϯδχΞ͕͍ͳͯ͘΋ӡ༻Ͱ͖ΔͨΊɺΠϯϑ
    ϥΛҡ࣋͢Δਓ݅අ΋͔͔͍ͬͯͳ͍
    • ΦϯϓϨϛεΛؚΊͨଞͷͲͷΑ͏ͳΠϯϑϥ؀ڥͰ΋ɺ

    GCP ΑΓ҆ՁʹαʔϏεΛ࡞Δ͜ͱ͸Ͱ͖ͳ͍
    • ͢΂ͯैྔ՝ۚɻϢʔβ਺͕૿͑Ε͹අ༻͸ਖ਼ൺྫ͢ΔɻϦβʔϒ
    υΠϯελϯεͷΑ͏ͳɺܭըੑ͕ඞཁͳ΋ͷ͸ͳ͘ɺৗʹ҆Ձ
    ͳঢ়ଶ
    • ݁Ռ5: ίετ → ˕ྑ͍

    View Slide

  30. ݁࿦
    30
    • GAE/Go Λ࠾༻ͨ݁͠ՌɺͲ͏͔ͩͬͨ
    → ੜ࢈ੑɺεέʔϥϏϦςΟͱύϑΥʔϚϯεɺՄ༻ੑɺ

    αϙʔτମ੍ɺίετɺތுͰ͸ͳ͘͢΂ͯຬ଍
    • ࠓޙͷҊ݅Ͱ΋ GAE/Go Λ࢖͍͍͔ͨ
    → Yes!

    View Slide