Slide 1

Slide 1 text

esa.ioͷҭͯํ 2018/02/23 esa LLC ਂ୩ಞੜ

Slide 2

Slide 2 text

2 • ߹ಉձࣾ esa • ߹ܭ3໊ • ΤϯδχΞ2໊ • σβΠφʔ1໊ • શһ͕ίʔυΛॻ͘ • શһ͕ձࣾ୅ද • ૑ۀ4೥໨

Slide 3

Slide 3 text

esa LLC͕΍͍ͬͯΔ͜ͱ • esa.ioͷ։ൃɾӡӦ (ࠓ೔ͷຊ୊) • pplog.netͷ։ൃɾӡӦ • ଞͷձࣾͷ։ൃ΍σβΠϯͷ͓ख఻͍ 3

Slide 4

Slide 4 text

esa LLC͕΍Βͳ͍͜ͱ • αʔϏε΍ձࣾͷٸܹͳ੒௕͸໨ࢦ͞ͳ͍ • ౤ࢿ͸ड͚ͳ͍ • (ۜߦ౳͔Βগֹͷ༥ࢿ͸ड͚ͨ͜ͱ͕͋Δ) • Web ޿ࠂ͸ग़͞ͳ͍ 4

Slide 5

Slide 5 text

esa.ioͱ͸? 5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

7 • ݱࡏɺ໿2,200νʔϜ͕ར༻த • ITاۀΛத৺ͱͨ͠ձࣾɾஂମɾݸਓʢن໛: 1ਓʙ300ਓఔ౓ʣ • ΤϯδχΞɾσβΠφʔΛத৺ʹɺاըɾӦۀ৬ɾࣄ຿ܥͷํ΋ར༻ • ݸਓ΍͝Ոఉɺେֶͷݚڀࣨɺझຯͷஂମ΋ଟ਺ User About esa.io • MarkdownܗࣜͰॻ͚ΔɺνʔϜͷͨΊͷ৘ใڞ༗πʔϧ • ೔ใɾٞࣄ࿥ɾϝϞɾΞΠσΞɾ࢓༷ॻɾاըॻ౳ɺνʔϜͰͷυ Ωϡϝϯτڞ༗Ͱར༻

Slide 8

Slide 8 text

8 • ݱࡏɺ2,000νʔϜҎ্͕༗ྉར༻ • ITاۀΛத৺ͱͨ͠ձࣾɾஂମɾݸਓʢن໛: 1ਓʙ300ਓఔ౓ʣ • ΤϯδχΞɾσβΠφʔΛத৺ʹɺاըɾӦۀ৬ɾࣄ຿ܥͷํ΋ར༻ • ݸਓ΍͝Ոఉɺझຯͷஂମ΋ଟ਺ User Concept: ৘ใΛɺҭ͍ͯͨɻ • υΩϡϝϯτ͸࠷ॳ͔Β׬ᘳͰ͸ͳ͘ɺ࣌ؒΛ͔͚ͯΑ͍΋ͷʹҭ͍ͬͯ͘ • ݸਓ͕ΏΔ͍ΞΠσΞΛग़͠΍͘͢ɺΈΜͳͰܧଓతʹվળ͠΍͍͢࢓૊Έ • ্͔Βͷԡ͠෇͚Ͱ͸ͳ͘ϘτϜΞοϓͰࣗൃతʹ৘ใൃ৴͢ΔΑ͏ʹͳΔ ͜ͱ͕ɺΑΓ͍͖͍͖ͱͨࣗ͠཯తͳνʔϜͮ͘Γʹͭͳ͕Δ

Slide 9

Slide 9 text

2014೥ͷ5݄ ͋Δ։ൃऀίϛϡχςΟͷ झຯ։ൃ߹॓Ͱ஀ੜ 9

Slide 10

Slide 10 text

10 ↓ਖ਼ࣜެ։ ↑୯ମͰࠇࣈԽ ࠶ࠇࣈԽˣ ࣾһ͕1໊૿Ճˣ

Slide 11

Slide 11 text

౰ॳͷ໨ඪͰ͋ͬͨ ʮesa ͷऩӹ͚ͩͰձࣾΛܦ ӦͰ͖ΔʯΛୡ੒ 11

Slide 12

Slide 12 text

ࠓ೔͓࿩͍ͨ͜͠ͱ • esaΛগਓ਺Ͱ։ൃɾӡӦ͍ͯͨ͘͠ΊʹɺͲ ͷΑ͏ͳٕज़ɾઓུ΍PaaS/SaaSͷྗΛआΓ ͖͔ͯͨΛ࣮ྫΛަ͑ͯ঺հ • झຯͰ࡞Γ࢝ΊͨWebαʔϏε͕ͲͷΑ͏ʹ ͯ͠Ϗδωεͱͯ͠੒ཱ͢ΔΑ͏ʹͳ͔ͬͨ 12

Slide 13

Slide 13 text

ࠓ೔͓࿩͍ͨ͜͠ͱ • [x] esaͱesa LLC ʹ͍ͭͯ (5෼) • [ ] esaͷγεςϜߏ੒ (10෼) • [ ] esaͷػೳ͝ͱͷ࣮૷ํ๏ (15෼) • [ ] esaͷϢʔβʔαϙʔτ (5෼) • [ ] esaͱϞνϕʔγϣϯ (5෼) 13

Slide 14

Slide 14 text

࣮͸͜ͷൃද͸ Δͼ·0052߸ (2015-12) ͕ϕʔεͰ͢ 14 magazine.rubyist.net/?0052-esaio

Slide 15

Slide 15 text

esaͷγεςϜߏ੒ 15

Slide 16

Slide 16 text

جຊతͳઓུ • ࠷৽ͷRuby/RailsΛ࢖͏ • 2018/02/16࣌఺ͰRuby 2.5.0 / Rails 5.1.5 • ຖ೔ɺ൒ࣗಈͰBundle Update͢Δ • ܧଓతʹ΍ͬͨ΄͏͕݁Ռతʹָ • ։ൃͷϦζϜʹ΋ͳΔ 16

Slide 17

Slide 17 text

2014 ~ 2016 • Heroku (US region) • 2X dyno Λ 2~5ݸ • ໷ؒ΍ٳ೔ʹdynoΛগͳͯ͘͠અ໿ • ϦϦʔε͔Β2೥ऑͷؒΠϯϑϥʹ͍ͭͯ೰ ·͞ΕΔ͜ͱ͕গͳͯ͘ຊ౰ʹॿ͔ͬͨ 17

Slide 18

Slide 18 text

2014 ~ 2016 • Heroku (US region) • ຊ֨తʹར༻͞ΕΔʹͭΕɺϨΠςϯγ͕ ਏ͘ͳ͖ͬͯͨ • Enterpriseܖ໿͢Ε͹Tokyo region΋࢖͑ ͦ͏͕ͩͬͨɺྉۚతʹஅ೦ 18

Slide 19

Slide 19 text

ΠϯϑϥେҾͬӽ͠ 19 docs.esa.io/posts/179

Slide 20

Slide 20 text

Ҡߦޙͷߏ੒ 20

Slide 21

Slide 21 text

Ҡߦޙͷߏ੒ • AWS ECS (Tokyo region) • Railsίϯςφ x 4ɺSidekiqίϯςφ x 1 • db:migrate࣌ʹ͸ຖճ৽نʹίϯςφΛى ಈˠഇغ 21

Slide 22

Slide 22 text

Ҡߦޙͷߏ੒ • AWS ECS (Tokyo region) • ϖʔδͷදࣔ଎౓͕1/2 ~ 1/3ఔ౓·Ͱվળ • Ͱ͖Δ͚ͩHeroku࣌୅ͱಉ͡Α͏ͳ։ൃ͕ଓ͚ΒΕ ΔΑ͏ʹ޻෉ • masterϚʔδͰࣗಈσϓϩΠ • ίϯςφͷ਺͕ҰఆʹอͨΕΔ 22

Slide 23

Slide 23 text

֤ίϯςφʹ͍ͭͯ • Rails / Sidekiq ίϯςφ (2016/03 ~) • PlantUML ίϯςφ (2016/10 ~) • ܾࡁܥίϯςφ (2017/02 ~) 23

Slide 24

Slide 24 text

Rails / Sidekiq ίϯςφ • ී௨ͷRails / Sidekiq app • ݩʑHeroku্Ͱಈ͍͍ͯͨesa.ioͷຊମ • ಉ͡Docker ImageͰىಈΦϓγϣϯͰweb/ workerΛ੾Γସ͑ • ಈ͍͍ͯΔίϯςφ਺͸Rails: 4ɺSidekiq: 1 24

Slide 25

Slide 25 text

PlantUML ίϯςφ 25

Slide 26

Slide 26 text

PlantUML ίϯςφ 26 • PlantUML͸Java੡ • Javaͷαʔόͷϝϯς͸ͨ͘͠ͳ͍ɻɻɻ • JRuby + Sinatra + PumaͰ࣮૷ • ςΩετΛड͚औͬͯsvgΛฦ͚ͩ͢ • ։ൃ։͔࢝Β1೔ఔ౓ͰϦϦʔε

Slide 27

Slide 27 text

ܾࡁܥίϯςφ • ܾࡁ୅ߦαʔϏεΛWebPay͔ΒPAY.JPʹ੾Γସ ͑ΔλΠϛϯάͰΧʔυొ࿥ը໘ΛผγεςϜʹ ੾Γ෼͚ • ܾࡁ୅ߦαʔϏε͕ఏڙ͢ΔJSϥΠϒϥϦΛ࢖͏ ͜ͱͰɺݩʑesaͷαʔόʹΧʔυ৘ใ͕౉Βͳ͍ Α͏ʹͳ͍ͬͯΔ͕ɺผυϝΠϯɾผγεςϜԽ ͢Δ͜ͱʹΑͬͯߋʹηΩϡΞʹ͢Δ͜ͱ͕ૂ͍ 27

Slide 28

Slide 28 text

ܾࡁܥίϯςφ • Ruby + Sinatra + PumaͰ࣮૷ • ͳͥSinatra? • DBΞΫηε͕ͳ͍ • ը໘਺͕গͳ͍ 28

Slide 29

Slide 29 text

γεςϜߏ੒·ͱΊ • ॳखHeroku͸Twelve-Factor Appͷࢥ૝ʹೃછΉ ͜ͱ͕ग़དྷͨͱ͍͏఺Ͱ΋ྑ͔ͬͨ • ECS౳ίϯςφରԠͷϚωʔδυɾαʔϏεΛ࢖ ͏͜ͱͰɺHerokuΠϯϑϥ࡞ۀͷखؒΛݮΒ͢ • ίϯςφԽ͓ͯ͘͜͠ͱͰɺҟͳΔݴޠ΍ϑϨʔ ϜϫʔΫͷαϒγεςϜΛ௥Ճ͠΍͍͢ 29

Slide 30

Slide 30 text

30 12factor.net/ja/ (ࢀߟ) Twelve-Factor App

Slide 31

Slide 31 text

esaͷػೳ͝ͱͷ࣮૷ํ๏ 31

Slide 32

Slide 32 text

ΧςΰϦػೳ 32 • هࣄλΠτϧΛʮ/ ʯͰ۠੾ΔͱΧςΰϦʹͳ Δ • ΧςΰϦ͸HOMEը໘ͰυϦϧμ΢ϯͰ͖Δ

Slide 33

Slide 33 text

ΧςΰϦػೳ 33

Slide 34

Slide 34 text

ΧςΰϦػೳ • ܦ࿏ྻڍϞσϧͰ࣮૷ 34 DBUFHPSJFTςʔϒϧ JE QBUI GPP GPPCBS UJUMF GPPهࣄ GPPCBSهࣄ GPPCBSهࣄ QPTUTςʔϒϧ JE OBNF DBUFHPSZ@JE هࣄ هࣄ هࣄ

Slide 35

Slide 35 text

ΧςΰϦػೳ 35 DBUFHPSJFTςʔϒϧ JE QBUI GPP GPPCBS QPTUTςʔϒϧ JE OBNF DBUFHPSZ@JE هࣄ هࣄ هࣄ “foo/bar” ΧςΰϦ಺ͷهࣄݕࡧ: select * from posts join categories on categories.id = posts.category_id where categories.path like ‘foo/bar/%’

Slide 36

Slide 36 text

֎෦ެ։ػೳ • ೚ҙͷهࣄ΍εϥΠυΛνʔϜ֎ʹެ։Ͱ͖ Δػೳ • URLΛ஌͍ͬͯΕ͹ϩάΠϯෆཁͰӾཡՄೳ • GitHub pagesΛҙࣝͯ͠ɺesa-pages.ioͱ͍ ͏υϝΠϯ্Ͱڞ༗͞ΕΔ 36

Slide 37

Slide 37 text

֎෦ެ։ػೳ 37 esa-pages.io/p/sharing/105/posts/ 46/70c5c045110fa64018dd.html

Slide 38

Slide 38 text

֎෦ެ։ػೳ • هࣄɾεϥΠυΛHTMLม׵ޙʹS3ʹग़ྗ ͠ɺCloudFrontܦ༝Ͱ഑৴ • େྔͷΞΫηε͕͋ͬͯ΋esaຊମʹෛՙ͕ ֻ͔Βͳ͍Α͏ʹ • ݩهࣄΛߋ৽͢Ε͹S3্ͷهࣄ΋ࣗಈߋ৽ 38

Slide 39

Slide 39 text

ܾࡁ • ݄ॳʹɺલͷ݄ͷར༻ঢ়گʹԠͯ͡ΫϨδοτΧʔ υܾࡁ • ޙ෷͍ͳͷͰΩϟογϡϑϩʔ͸एׯ٘ਜ਼ʹͳ Δ͕ɺ՝ۚλΠϛϯάΛͻͱ݄͋ͨΓ1ճʹͯ͠ γεςϜͷγϯϓϧ͞ͱ҆຾ΛಘΔ • ҎલͷձࣾͰ೔࣍՝ۚόον͕͋ͬͯো֐ͷ ࣌ʹప໷ରԠͨ͠ࢥ͍ग़ɻɻɻ 39

Slide 40

Slide 40 text

ܾࡁ • ࣾ಺ʹෳ਺νʔϜ͕͋Δ৔߹͸ʮܾࡁͷ࿈݁ʯ ͕Մೳ • νʔϜ಺Ͱॏෳͨ͠Ϣʔβʔʹ͍ͭͯ͸1 νʔϜ෼ͷྉۚʹͳΔͷͰ͓ಘ 40 docs.esa.io/posts/190

Slide 41

Slide 41 text

ܾࡁ 41 • Q.ʮ੥ٻॻ෷͍͸ແ͍ΜͰ͔͢ʁʯ • A. ͢Έ·ͤΜɻࠓͷͱ͜Ζແ͍Ͱ͢ɻ

Slide 42

Slide 42 text

શจݕࡧ • ࠷ॳ͸Postgresql + RansackͰແཧ΍Γ࣮૷ • هࣄ͕૿͑Δʹैͬͯݕࡧਫ਼౓΍଎౓ʹෆຬ • ΠϯΫϦϝϯλϧݕࡧ͕͍ͨ͠ 42

Slide 43

Slide 43 text

શจݕࡧ 43 docs.esa.io/posts/198

Slide 44

Slide 44 text

શจݕࡧ • Elasticsearchͷಋೖ • ਫ਼౓্͕͕ͬͨ • ιʔτΦϓγϣϯ͕૿͑ͨ • ଎͘ͳͬͨ • ΠϯΫϦϝϯλϧݕࡧ΋Ͱ͖ΔΑ͏ʹ 44

Slide 45

Slide 45 text

શจݕࡧ • Best matchιʔτ • “͍͍ײ͡” ͷॱ൪Ͱݕࡧ݁ՌΛදࣔ • Elasticsearchͷfunction_score queryΛ׆ ༻ 45

Slide 46

Slide 46 text

શจݕࡧ • “͍͍ײ͡” ͷॱ൪ͱ͸ʁ • هࣄλΠτϧ΍ΧςΰϦʹϚονͨ͠΄͏͕ɺهࣄຊจʹϚο ν͢ΔΑΓείΞ͕ߴ͍ • ࠷ۙͷStarɾWatchɾCommentͷ਺͕ଟ͍΄͏͕είΞ͕ ߴ͍ • ΞʔΧΠϒ͞ΕͨهࣄͷείΞ͸ͱͯ΋௿͍ • etc 46

Slide 47

Slide 47 text

API • 2015/05ࠒ͔Βαϙʔτ • Doorkeeper gemΛ࢖࣮ͬͯ૷ • APIυΩϡϝϯτ: docs.esa.io/posts/102 • APIΛ࢖ͬͨαʔυύʔςΟπʔϧ΋๛෋ 47

Slide 48

Slide 48 text

αʔυύʔςΟπʔϧ 48 docs.esa.io/posts/158

Slide 49

Slide 49 text

ϩάΠϯ • ݱঢ়Google OAuth͚ͩ • ೋஈ֊ೝূͳͲ΋GoogleଆͰ୲อ • ϩάΠϯػೳΛͰ͖Δ͚࣮ͩ૷͠ͳ͍͜ͱ Ͱ։ൃίετΛԼ͛ͭͭηΩϡΞʹ͢Δૂ ͍ 49

Slide 50

Slide 50 text

ϩάΠϯ • ෳ਺ΞΧ΢ϯτಉ࣌ϩάΠϯ΋Մೳ 50 docs.esa.io/posts/210

Slide 51

Slide 51 text

ϩάΠϯ • Q. ʮGmailҎ֎ͷϝʔϧΞυϨεͱύεϫʔ υͰϩάΠϯͰ͖ΔΑ͏ʹͳΓ·ͤΜ͔ʁʯ • A. ͢Έ·ͤΜɻ·ͩͰ͖·ͤΜɻ • (কདྷతʹ͸ఏڙ͍ͨ͠) 51

Slide 52

Slide 52 text

esaͷϢʔβʔαϙʔτ 52

Slide 53

Slide 53 text

جຊతͳߟ͑ํ • զʑͱϢʔβʔ͕ڞʹ޾ͤʹͳΔํ๏Λ୳͢ • 5෼Ͱฦ৴͢Δ • (ӳจϝʔϧͷ௚༁Έ͍ͨͳจ໘ʹͳΔ) • ࣭໰ʹରͯ͠ɺʮ͸͍/͍͍͑ɻʯΑΓ΋ྑ͍ ฦࣄ͕͋Δ͸ͣ 53

Slide 54

Slide 54 text

ϑΟʔυόοΫϑΥʔϜ 54

Slide 55

Slide 55 text

ϑΟʔυόοΫϑΥʔϜ 55 Slack, GitHub, Gmailʹ௨஌͕ඈͿ

Slide 56

Slide 56 text

ϑΟʔυόοΫϑΥʔϜ 56 • GmailͰͷ΍ΓͱΓ͸GitHubͷIssueʹࣗಈͰ ಉظ͞ΕΔ github.com/fukayatsu/feedback-sync

Slide 57

Slide 57 text

TwitterͰͷϑΟʔυόοΫ • esaؔ࿈πΠʔτ΍@esa_io΁ͷreplyͳͲ͕ SlackʹྲྀΕΔΑ͏ʹͯ͋͠Δ • SlackͰEmoji reactionΛ͢Ε͹Twitter্Ͱ͓ ؾʹೖΓ͕Ͱ͖Δ 57 github.com/fukayatsu/esarch

Slide 58

Slide 58 text

ϑΟʔυόοΫۦಈ։ൃ • ʮ͜͜͸͜͏ͩͱخ͍͠ΜͰ͚͢Ͳʯ • ʮΑͦ͞͏Ͱ͢Ͷɻ΍ͬͯΈ·͢ʂʯ • (30෼ޙ)ʮϦϦʔε͠·ͨ͠ʂʯ • ʮΘʔ͍ʂʯ • …Έ͍ͨͳͷ͕ཧ૝ 58

Slide 59

Slide 59 text

ϑΟʔυόοΫۦಈ։ൃ • ར఺ • ΍ΔؾͷॠؒՐྗΛ։ൃʹ׆͔ͤΔ • ૣ͚Ε͹ૣ͍΄Ͳɺͼͬ͘Γͨ͠ΓتΜͩ Γͯ͠΋Β͑ΔͷͰɺ࣍ͷ։ൃͷϞνϕʔγϣ ϯʹͳΔ 59

Slide 60

Slide 60 text

esaͱϞνϕʔγϣϯ 60

Slide 61

Slide 61 text

Ϟνϕʔγϣϯ • Ϟνϕʔγϣϯࣗମ͸੍ޚͰ͖ͳ͍ • ੍ޚͰ͖ͳ͍΋ͷ͸ٕज़ͰͲ͏ʹ΋ͳΒͳ ͍? • esaͰ͸։ൃεέδϡʔϧΛ΄ͱΜͲ੾Βͣϊ ϧϚ΋ͳ͍ͷͰɺϞνϕʔγϣϯ͕௿Լ͢Δ ͱ։ൃ͕଺Δ 61

Slide 62

Slide 62 text

Ϟνϕʔγϣϯ • ϞνϕʔγϣϯΛੜΈग़͠͏Δ؀ڥ΍Πϕϯ τ(ΛੜΈग़͠͏ΔԿ͔…)Λ੍ޚ͢Δ͜ͱͰɺ ؒ઀తʹϞνϕʔγϣϯΛߴΊΔ౒ྗΛ͢Δ • “΍ΔؾΛग़͢” Ͱ͸ͳ͘ɺ “΍Δؾ͕ग़ͦ͏ ͳԿ͔” ʹ࠷ળΛਚ͘͢ 62

Slide 63

Slide 63 text

Ϟνϕʔγϣϯ͕ग़ͦ͏ͳԿ͔ • Ϣʔβʔ͞Μʹ௚઀Ձ஋Λಧ͚ΒΕ͍ͯΔ • Ϣʔβʔ͞Μ͔Β͋Γ͕ͱ͏ͱݴͬͯ΋Β͑ Δ • Ϣʔβʔ͞Μͷձ্͕ࣾख͍͘͘ • ৭ΜͳਓʹesaάοζΛָ͠ΜͰ΋Β͍͑ͯΔ 63

Slide 64

Slide 64 text

Ϟνϕʔγϣϯ͕ग़ͦ͏ͳԿ͔ • ࣗࣾαʔϏεͷऩӹ͚ͩͰձࣾΛӡӦͰ͖Δ • ඞཁे෼ͳڅ༩ΛಘΒΕΔ • Α͘৸Δ / ݈߁Ͱ͍Δ • ΍Γ͍ͨࣄΛ΍Γ͍ͨ࣌ʹ΍Δ 64

Slide 65

Slide 65 text

Α͍॥؀ 1. αʔϏεΛ࡞Δ 2. Ϣʔβʔ͞Μ͕࢖ͬͯ͘ΕΔ/تΜͰ͘ΕΔ 3. զʑͷϞνϕʔγϣϯ(ͱച্)্͕͕Δ 4. ߋʹྑ͍αʔϏεΛ࡞Δ 65

Slide 66

Slide 66 text

esaͱϞνϕʔγϣϯ • esaͷ։ൃʹͱͬͯϞνϕʔγϣϯ͸ඇৗʹॏ ཁ • ੍ޚͰ͖Δ෦෼ͱ੍ޚͰ͖ͳ͍෦෼ͱΛݟۃ Ίͯɺ੍ޚͰ͖Δ෦෼ʹ஫ྗ͢Δ • ྑ͍॥؀Λૉૣ͘ࡉ͔͘ճ͍ͯ͘͜͠ͱΛҙ ࣝ͢Δ 66

Slide 67

Slide 67 text

·ͱΊ 67

Slide 68

Slide 68 text

·ͱΊ • esaͷγεςϜ΍࣮૷ʹ͍ͭͯ͝঺հ͠·ͨ͠ • খ͘͞ϦϦʔεͯ͠ɺϢʔβʔ͞Μ͔ΒϑΟʔυόο Ϋ΍ϞνϕʔγϣϯΛ໯͍ͳ͕ΒαʔϏε΍ࣗ෼ ͨͪΛҭ͍ͯͯ͘ͷ͸ͱͯ΋ָ͍͜͠ͱͩͬͨ • ͦͷΑ͍॥؀Λճ͢͜ͱΛҙ͍ࣝͯͨ͠Β͍ͭ ͷؒʹ͔͜͜·Ͱདྷ͍ͯͨ 68

Slide 69

Slide 69 text

ࢀߟ 69

Slide 70

Slide 70 text

χʔόʔͷفΓ • ʮئΘ͘͹Θͨ͠ʹɺม͑Δ͜ͱͷͰ͖ͳ͍ ෺ࣄΛड͚ೖΕΔམͪண͖ͱɺม͑Δ͜ͱͷ Ͱ͖Δ෺ࣄΛม͑Δ༐ؾͱɺͦͷҧ͍Λৗʹ ݟ෼͚Δ஌ܙͱΛ͚ͣͨ͞·͑ʯ 70 ja.wikipedia.org/wiki/χʔόʔͷفΓ