Webٕज़ͷجຊ 6ճKeisuke KAMIYA
View Slide
ࠓճͷςʔϚ
Chapter 5WebΞϓϦέʔγϣϯͷجຊ
࣍1. WebΞϓϦέʔγϣϯͷ3ߏ2. MVCϞσϧ3. Webαʔό4. ΞϓϦέʔγϣϯαʔό5. σʔλϕʔεཧγεςϜ6. Ωϟογϡαʔό7. Ajax8. Web API9. CGI10.αʔόؒͷ࿈ܞ※͕͢͞ʹ͔ΔͰ͠ΐͬͯॴΧοτͯ͠·͢
࣍1. WebΞϓϦέʔγϣϯͷ3ߏ2. MVCϞσϧ3. Webαʔό4. ΞϓϦέʔγϣϯαʔό5. σʔλϕʔεཧγεςϜ6. Ωϟογϡαʔό7. Ajax8. Web API9. CGI10.αʔόؒͷ࿈ܞ
WebΞϓϦέʔγϣϯͷ3ߏ• WebΞϓϦέʔγϣϯ ωοτϫʔΫΛհͯ͠Webϒϥβ্Ͱಈ࡞͢ΔΞϓϦέʔγϣϯ• WebΞϓϦέʔγϣϯ, 3ߏͰӡ༻͞Ε͍ͯΔࣄ͕ଟ͍‣ ϓϨθϯςʔγϣϯ(Webαʔό)‣ ΞϓϦέʔγϣϯ(APαʔό)‣ σʔλ(DBαʔό)
WebΞϓϦέʔγϣϯͷ3ߏWebγεςϜΞϓϦέʔγϣϯ σʔλϓϨθϯςʔγϣϯWebϒϥβ(ΫϥΠΞϯτεΫϦϓτ)(Webαʔό) (APαʔό) (DBαʔό)Ϣʔβʔͷදࣔ Ϣʔβʔ͔Βͷૢ࡞ड8FCαʔό͔Βͷ໋ྩ࣮ߦ ը໘ͷੜσʔλͷநग़ߋ৽ ิؒ
WebΞϓϦέʔγϣϯͷ3ߏ• 3ΞʔΩςΫνϟͰߏ͢Δར 1ͭͷαʔόͰશͯΛ͏ΑΓ, ෛՙࢄ(εέʔϧΞτ)͍͢͠‣ εέʔϧΞτ ಉ͡ػೳΛఏڙ͢ΔαʔόΛෳ༻ҙͯ͠, ϦΫΤετΛదʹৼΓ͚ΔΑ͏ͳߏ
WebΞϓϦέʔγϣϯͷ3ߏWebγεςϜ8FCαʔό "1αʔό %#αʔόͭͷαʔόʹશͯΛஔͨ͠߹WebαʔόɿϦΫΤετʹൺྫͯ͠ෛՙ͕૿ՃAPαʔόɿॲཧ͕ෳࡶʹͳΔͱෛՙ͕૿ՃDBαʔόɿσʔλྔ͕ଟ͍ͱෛՙ͕૿Ճ
WebΞϓϦέʔγϣϯͷ3ߏWebγεςϜ8FCαʔό "1αʔό %#αʔόΞʔΩςΫνϟͷ߹ͦΕͧΕͷαʔό͕ಠཱͯ͠ಈ࡞͍ͯ͠Δ→ͦΕͧΕΛϦΫΤετঢ়گʹԠͯ͡૿ݮՄೳʹྫ) ϦΫΤετ͕ଟ͘ͳͬͨΒWebαʔόΛεέʔϧͤ͞Δ
WebΞϓϦέʔγϣϯͷ3ߏWebγεςϜΞʔΩςΫνϟͷ߹Webαʔό APαʔό DBαʔόϦΫΤετ
WebΞϓϦέʔγϣϯͷ3ߏWebγεςϜΞʔΩςΫνϟͷ߹Webαʔό APαʔό DBαʔόϦΫΤετWebαʔό͕མͪΔͱԠͰ͖ͳ͘ͳΔ
WebΞϓϦέʔγϣϯͷ3ߏWebγεςϜΞʔΩςΫνϟͷ߹Webαʔό APαʔό DBαʔόϦΫΤετϦΫΤετΛॲཧ͢ΔͨΊʹWebαʔόΛ૿͢
WebΞϓϦέʔγϣϯͷ3ߏ• 3ΞʔΩςΫνϟͰ͋Ε, WebαʔόͱAPαʔόͱDBαʔό͕ಠཱ͍ͯ͠ΔͨΊ, ͦΕͧΕͷͷௐʢεέʔϧΞτʣ͕Γ͍͢‣ 1ͭͷϚγϯʹશͯͷαʔόΛཱͯͯ͠·͏ͱ, WebαʔόΛ૿ͨͯ͘͠, ୯ମͰ૿͢͜ͱ͕ෆՄೳ‣ Ұൠʹ, DBαʔόͷεέʔϧΞτ͍͠- աڈʹॻ͍ͨεϥΠυʹ৭ʑ͔͍ͯ͋ΔΑ
WebΞϓϦέʔγϣϯͷ3ߏ• ͦΕͧΕͷ͕ಠཱ͍ͯ͠ΔͷͰ, վमൣғΛ੍ݶ͢Δ͜ͱ͕ՄೳWebγεςϜΞϓϦέʔγϣϯ σʔλϓϨθϯςʔγϣϯWebϒϥβ(ΫϥΠΞϯτεΫϦϓτ)(Webαʔό) (APαʔό) (DBαʔό)ϨΠΞτΛมߋ͚ͨ͠Ε 8FCαʔόͷΈ͍͡Εྑ͍
WebΞϓϦέʔγϣϯͷ3ߏ• ΞϓϦέʔγϣϯͷنʹΑͬͯ, దͳΞʔΩςΫνϟΛ࠾༻͢Δ͖• େنͳαʔϏεͰ༗ޮ͕ͩ, ݸਓతͳখ͞ͳͷͰ3ΞʔΩςΫνϟΛ࠾༻͢Δͷ͕ϕετͱݶΒͳ͍‣ αʔό͕3͋Δͱ͍͏͜ͱ, 3ͭͷཧίετ͕͔͔Δͱ͍͏͜ͱʹͳΔWebΞϓϦέʔγϣϯͷ3ߏ ऴྃ
MVCϞσϧ• MVCϞσϧ WebΞϓϦέʔγϣϯͷσβΠϯύλʔϯͷҰछ‣ M(Model) σʔλʹؔ͢ΔॲཧΛߦ͏‣ V(View) Ϣʔβʔͷग़ྗॲཧ‣ C(Controller) Ϣʔβʔ͔ΒͷϦΫΤετΛड͚ͯ, ModelViewॲཧΛৼΓ͚Δ
MVCϞσϧ$POUSPMMFS7JFX .PEFMॲཧ໋ྩσʔλͷද໋ࣔྩྃԠදࣔσʔλσʔλͷॲཧ໋ྩྃԠσʔλཁٻը໘දࣔσʔλॲཧ໋ྩͷྲྀΕσʔλද໋ࣔྩͷྲྀΕ7JFXͱ.PEFMʹࢦࣔग़ྗ දࣔΛ୲ σʔλॲཧ
MVCϞσϧ• ͜ͷΑ͏ʹ͢Δͱ, MVCϞσϧͬͯ3ΞʔΩςΫνϟͱࠞಉ͢Δਓ͕͍Δ‣ 3ΞʔΩςΫνϟͱMVCҟͳΔ֓೦‣ ߏͱ͍͏ͷ, ྡΓ߹ͬͨಉ࢜ͰͷΈΓऔΓΛ͢Δ- ϓϨθϯςʔγϣϯͱσʔλΓऔΓ͠ͳ͍‣ MVCϞσϧͷ߹, ͯ͢ͷʹ͕ؔ͋Δ
MVCϞσϧWebγεςϜΞϓϦέʔγϣϯ σʔλϓϨθϯςʔγϣϯWebϒϥβ(ΫϥΠΞϯτεΫϦϓτ)(Webαʔό) (APαʔό) (DBαʔό)ControllerViewModelΞϓϦέʔγϣϯ
MVCϞσϧ• MVCϞσϧͷར‣ 3ΞʔΩςΫνϟʔಉ༷ʹ, ։ൃվमͷൣғ͕໌֬ʹͳΔ- ֤ཁૉ͕ผΕ࣮ͯ͞Ε͍ͯΔͨΊ, ଞͷՕॴͷӨڹ͕গͳ͍- Օॴͷಛఆ͕ൺֱత༰қMVCϞσϧ ऴྃ
Webαʔό• Webαʔό WebΫϥΠΞϯτ͔ΒͷϦΫΤετΛड͚औΔαʔόWebϒϥβ(ΫϥΠΞϯτεΫϦϓτ)(Webαʔό) (APαʔό) (DBαʔό)↑͜͜
Webαʔό• ϦΫΤετͷ༰ʹΑͬͯॲཧΛม͑Δ‣ css, js͕ϦΫΤετ͞Εͨ߹ʢ੩తϑΝΠϧʣ Webαʔό͕ϑΝΠϧΛฦ͢‣ ಈతॲཧ͕ඞཁͳͷ APαʔόʹॲཧΛґཔ͢ΔWebαʔό APαʔόϦΫΤετ ಈతॲཧͷґཔಈతϖʔδͷసૹίϯςϯπͷసૹ੩తϑΝΠϧ͜͜Ͱฦ͢
Webαʔό• WebαʔόϦΫΤετΛड͚͚ͭΔ૭ޱ‣ Webαʔό͕ࢮ͵ͱαʔϏε͕ఀࢭͯ͠͠·͏• ͜ͷΑ͏ͳࣗମΛආ͚ΔͨΊ, ௨ৗWebαʔόΛෳ༻ҙͯ͠ԽΛߦ͍ͬͯΔ‣ 1ͩͱ1ࢭ·ΔͱશͯऴΘΓ͕ͩ, Կ͔Քಇ͍ͯ͠ΕͳΜͱ͔αʔϏεΛܧଓͰ͖Δ
WebαʔόAPαʔόαʔό͕ނোͯ͠ผͷαʔόΛͬͯαʔϏεܧଓWebαʔόΫϥΠΞϯτͨͩ͠, WebαʔόͦΕͧΕಉ͡ίϯςϯπΛ͍࣋ͬͯΔඞཁ͕͋ΔଓෆՄ
Webαʔό• ར༻ऀ͕ଟ͚Εଟ͍΄ͲϦΫΤετ૿Ճ‣ ར༻ऀ͕ଟͯ͘Ϩεϙϯεͨ͘͘͠ͳ͍• ݱঢ়Webαʔό͕ͲͷΑ͏ͳঢ়ଶͰ͋Δ͔Λਪଌͤͣʹܭଌ͢Δ͖‣ I/O͕ϘτϧωοΫͳͷ͔CPUͳͷ͔- Don't guess! Measure!- "premature optimization is the root of all evil." (ૣ͗͢Δ࠷దԽॾѱͷࠜݯ)
Webαʔό• WebαʔόΛεέʔϧΞτ͢Δࡍ, શͯͷWebαʔόʹಉ͡ίϯςϯπΛஔ͘ඞཁ͕͋Δ• ผʹϑΝΠϧ༻ͷαʔόΛ༻ҙ͢Δํ๏͋Δ‣ ίϯςϯπͷಉظෆཁʹͳΔ͕, αʔόؒͷ௨৴͕ൃੜ͠Ϩεϙϯε͕Լ͢ΔϑΝΠϧΛஔ͍ͨαʔόΦʔόʔϔου͕ൃੜWebαʔόWebαʔόWebαʔό ऴྃ
ΞϓϦέʔγϣϯαʔό• ΞϓϦέʔγϣϯαʔό(APαʔό) ࣮ࡍͷWebΞϓϦέʔγϣϯͷॲཧΛߦ͏ϓϩάϥϜWebϒϥβ(ΫϥΠΞϯτεΫϦϓτ)(Webαʔό) (APαʔό) (DBαʔό)↑͜͜
ΞϓϦέʔγϣϯαʔό• Webαʔό͔Βసૹ͞Ε͖ͯͨσʔλΛجʹ, σʔλϕʔεͷݕࡧՃΛߦ͍ԠΛฦ͢‣ 3ΞʔΩςΫνϟʹ͓͚ΔΞϓϦέʔγϣϯʹҐஔ͢Δαʔό‣ ϓϨθϯςʔγϣϯͱσʔλͱͷհ‣ CPUෛՙ͕ߴ͘ͳΓ͕ͪ
ΞϓϦέʔγϣϯαʔόʢηογϣϯཧػೳʣ• Ҏલʹͨ͠ηογϣϯͷཧΛߦ͍ͬͯΔ‣ ؔ࿈ͷ͋Δ1࿈ͷॲཧͷ։͔࢝Βऴྃ·Ͱͷશظؒૹ৴ଆ ड৴ଆΛબͿOKങ͍͔͝ʹೖΕΔOKങ͍͔͝ͷதΛ֬ೝOKܾࡁOKηογϣϯ
ʢ෮शʣηογϣϯ• ෳͷΫϥΠΞϯτ͔ΒΞΫηε͞ΕΔWebαʔό, ηογϣϯΛͲͷΑ͏ʹཧ͢Δͷ͔ʁ‣ CookieΛ༻͍ͯηογϣϯΛཧ͢Δ‣ Cookie͕͑ͳ͍߹URLʹؚΊΔͱ͖͋Δ͕, ηΩϡϦςΟͷ໘͔Βਪ͞Εͳ͍ํ๏Ͱ͋Δ• ηογϣϯཧʹ͓͍ͯ, WebϒϥβΛࣝผ͢ΔͨΊͷࣝผࢠ(id)ΛηογϣϯIDͱݺͿ‣ ηογϣϯIDWebαʔόͰੜ͞Ε, CookieʹؚΊͯWebϒϥβʹૹ৴͞ΕΔ
ʢ෮शʣηογϣϯ4*%BBBBBB4*%CCCCCCwebαʔόwebϒϥβBwebϒϥβAηογϣϯ*% Ϣʔβʔ ϩάΠϯ ങ͍͔͝BBBBBB TBUP 536&ΞλʔºγϟπºCCCCCC HVFTU '"-4& γϡʔζºදɿWebαʔό͕อଘ͍ͯ͠Δηογϣϯσʔλ
ʢ෮शʣηογϣϯ• ηογϣϯIDΛड͚औͬͯҎ߱, ϦΫΤετϔομʹηογϣϯIDΛؚΊͯૹ৴͢Δ͜ͱͰ, WebαʔόͱͷηογϣϯΛҡ࣋͢Δ͜ͱ͕ग़དྷΔ.• ʮങ͍͔͝ʹͳʹΛ͍Ε͔ͨʯͱݴͬͨใ, ηογϣϯIDͱඥ͍ͯʮηογϣϯσʔλʯͱͯ͠αʔόʹอଘ͞ΕΔ.
ʢ෮शʣηογϣϯwebαʔόwebϒϥβASet-Cookie:SID=aaaaaaCookie:SID=aaaaaaCookieʹؚΊͯ͢ϦϯΫͷURLʹؚΊΔwebαʔόwebϒϥβAhttp://example.com/cart?SID=aaaaaaͱ͍͏ϦϯΫ͖ͷWebϖʔδΛૹ৴ϦϯΫ͕ΫϦοΫ͞ΕΔͱ, ηογϣϯID͖ͰWebαʔόϦΫΤετ͕ૹ৴͞ΕΔhttp://example.com/cart?SID=aaaaaaηογϣϯIDΛURLͷύϥϝʔλͱͯ͠ૹ৴
ΞϓϦέʔγϣϯαʔόʢηογϣϯཧػೳʣ• HTTPεςʔτϨεͳϓϩτίϧͳͷͰ, ηογϣϯͳͲΛΘͳ͍ͱεςʔτϑϧͳॲཧΛߦ͑ͳ͍• APαʔό͕ηογϣϯIDΛൃߦ͠, ͦΕΛجʹΫϥΠΞϯτͱΓऔΓ͢Δ͜ͱͰ1ͭͷηογϣϯͱͯ͠ཧ
ΞϓϦέʔγϣϯαʔόʢτϥϯβΫγϣϯཧػೳʣ• τϥϯβΫγϣϯ ηογϣϯதͰߦΘΕΔؔ࿈ͨ͠Ұ࿈ͷ࡞ۀ‣ ෳͷॲཧͷ1ͭ1ͭHTTPϦΫΤετͰΓཱ͍ͬͯΔͨΊ, ͜ΕΒΛ1ͭͷτϥϯβΫγϣϯͱͯ͠·ͱΊ͍ͯΔ
ΞϓϦέʔγϣϯαʔόʢτϥϯβΫγϣϯཧػೳʣᶃϩάΠϯᶄີࣨใͷ֬ೝᶅ٬ࣨΛ෦ݮΒ͢ᶆۭࣨʹ༧ऀใΛՃᶇ༧ͷཱᶈϩάΞτᶆͷΈࣦഊͯ͠ଞͯ͢ਖ਼ৗʹऴྃͨ͠ͱͯ͠ ॓ധࢪઃͷ༧࡞ۀͱͯ͠ޭͨ͠ͱ͍͑ͳ͍1τϥϯβΫγϣϯ1τϥϯβΫγϣϯ4τϥϯβΫγϣϯᶈͷΈͷࣦഊͰ͋Ε ϩάΞτॲཧࣦഊ͕ͩͦͷલͷ࡞ۀͰ͋Δ॓ധࢪઃͷ༧࡞ۀޭ͍ͯ͠ΔτϥϯβΫγϣϯͷྫΞϓϦέʔγϣϯαʔό ऴྃ
σʔλϕʔεཧγεςϜ• σʔλϕʔεཧγεςϜ(DBMS) WebΞϓϦέʔγϣϯͷσʔλΛอଘ͢ΔσʔλετΞ. ͱ͘ʹ, ؔσʔλϕʔεͰRDBMS(RelationalDataBase Management System)͕༻͍ΒΕΔ‣ ϑϦʔͷRDBMS͍͔ͭ͋͘Δ- MySQL- SQLite- PostgreSQL etc..MySQLΛྫʹॲཧͷྲྀΕΛݟͯΈΔ
σʔλϕʔεཧγεςϜ• MySQLͷΈ1. SQLจΛύʔε͢Δ σʔλΛऔಘ͢Δͷ͔, ૠೖ͢Δͷ͔ͳͲ2. ΦϓςΟϚΠβʹ͔͚Δ ݁߹ͷॱংΛߟྀͯ͠࠷దԽ͢Δ3. ετϨʔδΤϯδϯʹ͛ΔʢσʔλʹΞΫηεʣ ࣮ࡍͷσʔλ͕֨ೲ͞Ε͍ͯΔॴʹΞΫηε
σʔλϕʔεཧγεςϜίωΫγϣϯεϨουίωΫγϣϯεϨουίωΫγϣϯεϨουύʔαɾΦϓςΟϚΠβɾΞΫηεཧͳͲετϨʔδΤϯδϯ"1*.Z*4". *OOP%# .Z42-ͳͲͷετϨʔδΤϯδϯετϨʔδϑΝΠϧΫϥΠΞϯτ͔ΒͷϦΫΤετMySQL SELECT * FROM …
σʔλϕʔεཧγεςϜ• ετϨʔδΤϯδϯʹෳଘࡏ͢Δ‣ InnoDB ݱࡏMySQLͷσϑΥϧτετϨʔδΤϯδϯ‣ MyISAM ͔ͭͯMySQLͷσϑΥϧτͩͬͨ‣ MEMORY ϝϞϦ্ʹσʔλΛετΞ͢ΔʢͷͰشൃੑʣ‣ Blackhole ҰσʔλΛه͠ͳ͍ʢ͚Ͳϩά͢ʣ
σʔλϕʔεཧγεςϜ• ࡢͷΘ͔Βͳ͍ͳ͊ͬͯͣͬͱͭͿ͍ͯͨ
σʔλϕʔεཧγεςϜ• ͭͿ͍ͨΒฦ৴͕དྷͨ(Blackholeͷ͍ํ)
σʔλϕʔεཧγεςϜ• ϦΞϧλΠϜੑ͕ཉ͍࣌͠ͷߏ
σʔλϕʔεཧγεςϜ• ৭ʑ͋ΔͷͰڵຯ͋ͬͨΒௐͯΈͯ‣ MyISAM‣ InnoDB‣ MEMORY‣ Federated‣ BLACKHOLE‣ ARCHIVE‣ MySQL Cluster(NDB)
σʔλϕʔεཧγεςϜ• ίϛϡχςΟΤϯδϯ‣ Tritonn‣ SPIDER‣ Q4M‣ PBXT‣ Percona XtraDB‣ KickFire‣ InfiniDB
σʔλϕʔεཧγεςϜ• DBαʔό RDBMSΛࡌͨ͠αʔόʢσʔλετΞʣ‣ σʔλϕʔεΞϓϦέʔγϣϯͷใΛอ͍࣋ͯ͠ΔͨΊ, ৴པੑੑΛߟྀͨ͠ߏʹ͢Δඞཁ͕͋Δ- I/Oෛՙ͕ߴΊʹͳΔߟྀ͠ͳ͍ͱ͍͚ͳ͍‣ DBαʔόͷεέʔϧΞτ͍͠…
σʔλϕʔεཧγεςϜʢԽʣ• อ࣋͢Δσʔλͷอશඇৗʹॏཁ‣ ௨ৗDBαʔόԽߏΛऔΔ• ͔͠͠, DBαʔόͷԽߏ͍͠‣ ෳͰߏͨ͠߹, ෳͰσʔλΛڞ༗͓ͯ͘͠ඞཁ͕͋Δ‣ ͨͩ͠සൟʹσʔλͷߋ৽͕ى͜ΔͨΊ, ͲͷΑ͏ʹڞ༗Λ͢Δ͔͕ॏཁ
σʔλϕʔεཧγεςϜʢԽʣ• Խͷํ๏ෳ͋Δ‣ ϛϥʔϦϯά‣ ϨϓϦέʔγϣϯ‣ γΣΞʔυσΟεΫ
σʔλϕʔεཧγεςϜʢԽʣ• ϛϥʔϦϯά ߋ৽໋ྩΛड͚ͨRDBMS͕ෳͷσʔλϕʔεʹରͯ͠ಉ࣌ʹಉ͡ߋ৽Λߦ͏• ϨϓϦέʔγϣϯ ߋ৽໋ྩΛड͚ͨRDBMS͕ෳͷσʔλϕʔεʹରͯ͠ಉ͡ߋ৽Λߦ͏. λΠϛϯάಉ࣌ͱݶΒͳ͍• γΣΞʔυσΟεΫ σʔλϕʔεΛڞ༻ͷετϨʔδʹ࣋ͪ, ෳͷDBαʔό͔ΒͦΕΛߋ৽͢Δ
σʔλϕʔεཧγεςϜʢԽʣwebαʔό APαʔό ϓϦϯγύϧʢਖ਼ʣϛϥʔʢ෭ʣߋ৽໋ྩߋ৽໋ྩฏৗ࣌ϓϦϯγύϧʹ໋ྩΛૹΓ োൃੜ࣌ʹϛϥʔʹ໋ྩΛૹΔϓϦϯγύϧ͕ߋ৽໋ྩΛड͚Δͱ ϛϥʔʹߋ৽໋ྩΛసૹ͢Δϛϥʔ%#.4ߋ৽໋ྩΛड͚ ϛϥʔͷσʔλϕʔεߋ৽Λߦͳ͏ฏৗ࣌ͷॲཧΛߦͳ͏ػثɿਖ਼ܥো࣌ʹਖ਼ܥʹΘͬͯॲཧΛߦ͏ػثɿ෭ܥorػܥϛϥʔϦϯά
σʔλϕʔεཧγεςϜʢԽʣwebαʔό APαʔό Ϛελʢਖ਼ʣεϨʔϒʢ෭ʣߋ৽໋ྩฏৗ࣌Ϛελʹ໋ྩΛૹΓ োൃੜ࣌ʹεϨʔϒʹ໋ྩΛૹΔߋ৽ͷ໋ྩϚελʹͷΈૹΒΕΔߋ৽͢Δͱ εϨʔϒʹ ߋ৽ϩάϑΝΠϧ͕ૹΒΕΔߋ৽ϩάͷ༰Λجʹ εϨʔϒͷσʔλϕʔεͷߋ৽ΛҙͷλΠϛϯάͰߦ͏Master-Slaveߏͷ߹, ߋ৽ʹಉظ/ඇಉظ͕ଘࡏ͢Δ.ϨϓϦέʔγϣϯ
σʔλϕʔεཧγεςϜʢԽʣwebαʔό APαʔό ϚελʢBlackholeʣεϨʔϒʢInnoDBʣόΠφϦϩάߋ৽໋ྩϚελͷετϨʔδΤϯδϯΛBlackhole͢Δ͜ͱͰ,INSERT͕ଟ͍Α͏ͳαʔϏεʹ࠷దԽ͢Δ͜ͱϨϓϦέʔγϣϯ
σʔλϕʔεཧγεςϜʢԽʣwebαʔό APαʔό DBMSϛϥʔʢ෭ʣߋ৽໋ྩߋ৽໋ྩ໋ྩͲͷ%#.4Ͱྑ͍γΣΞʔυσΟεΫͷ%#.4ʹਖ਼෭ͷ֓೦ͳ͍γΣΞʔυσΟεΫDBMSσʔλετϨʔδσʔλϕʔεԽ͞Εͳ͍ͷͰରোੑͷڧ͍ΛબͿDBMS ऴྃ
Ωϟογϡαʔό• ϦΫΤετ͕૿͑Δͱ, ίϯςϯπͷಡΈग़͠(I/O)ॲཧ͕ແࢹͰ͖ͳ͍Ϩϕϧʹͳͬͯ͘Δ‣ ϨεϙϯελΠϜͷԼΛট͘• ίϯςϯπΛΩϟογϡͤ͞Δ͜ͱͰ, සͷߴ͍ͷαΠζ͕େ͖͍ͷʹؔͯ͠ߴʹϨεϙϯεΛฦ͢͜ͱ͕ग़དྷΔ‣ Ωϟογϡαʔόʔ͕ͦͷׂΛ୲͏
Ωϟογϡαʔό• Ωϟογϡ ϦΫΤετʹର͢ΔϨεϙϯεͷهԱ‣ ίϯςϯπΩϟογϡ จॻը૾, ಈըͱ͍ͬͨίϯςϯπͷΩϟογϡ‣ ΫΤϦΩϟογϡ DBMSͷσʔλݕࡧཁٻʢΫΤϦʣͷ݁ՌͷΩϟογϡ
ΩϟογϡαʔόίϯςϯπΩϟογϡαʔόWebαʔόهԱͯ͠ͳ͍ϦΫΤετͦͷཁٻΛ8FCαʔόʹసૹ͢ΔهԱ͍ͯ͠ΔϦΫΤετ͕དྷͨ߹ 8FCαʔόͷΘΓʹϨεϙϯεΛฦ͢ϦΫΤετͱ8FCαʔόͷϨεϙϯεͷΈ߹ΘͤΛهԱ͓ͯ͘͠ϒϥβίϯςϯπΩϟογϡαʔό
ΩϟογϡαʔόهԱ͍ͯ͠ͳ͍ΫΤϦͷ߹ͦͷ··%#.4ʹసૹ"1αʔό͔Βͷσʔλݕࡧཁٻͱ%#.4ͷϨεϙϯεͷΈ߹ΘͤΛΩϟογϡΫΤϦΩϟογϡαʔόWebαʔό APαʔόΫΤϦΩϟογϡαʔόʔDBαʔόWebγεςϜ
ΩϟογϡαʔόʢΩϟογϡͷ༗ޮظݶʣ• ΩϟογϡΛಘΔͨΊʹඞཁͳٕज़• ͔͠͠, ίϯςϯπ͕Ξοϓσʔτ͞Εͨ߹, Ωϟογϡͷ༗ޮظݶ͕͍ͱ͍ͭ·ͰͷچϑΝΠϧ͕৴͞Εͯ͠·͏‣ ༗ޮظݶΛదʹઃఆ͢Δ͜ͱͰ, ҰఆִؒͰΩϟογϡ༰ΛΞοϓσʔτ͢Δඞཁ͕͋Δ‣ ͦͷͨΊͷHTTP ETag
ΩϟογϡαʔόʢCDNʣ• ಥવͰ͕͢, ϓϩάϥϚ͕Δ͖ϨΠςϯγͰ͢Ҿ༻ɿhttps://speakerdeck.com/fujiwara3/isucon-summer-school-1
ΩϟογϡαʔόʢCDNʣ• CDN(Contents Delivery Network) ੈք֤ʹஔ͞ΕͨΩϟογϡαʔόͷू߹ମ‣ ຊ͔Β৴͢Δͷʹຊʹ͚ͩΩϟογϡαʔόΛஔ͍͍ͯͯ, ࠃ֎͔ΒͷΞΫηε͘ͳΔ‣ ੈքதʹΩϟογϡαʔόΛࢄͯ͠ஔ͢Δ͜ͱͰ, Ͳ͔͜ΒΞΫηεͯ͋͠Δఔߴʹ
ΩϟογϡαʔόʢCDNʣ• CDNͷ༗໊ͳαʔϏε‣ CloudFront(Amazon)‣ CloudFlare‣ AkamaiCloudFrontͷωοτϫʔΫʢҾ༻ɿhttps://aws.amazon.com/jp/cloudfront/details/ʣ
ΩϟογϡαʔόʢCDNʣ• ΞΫηε͢ΔͱࣗʹҰ൪͍ۙCDN͔Βμϯϩʔυ͢Δ͜ͱͰߴʹͳΔ• ͜ͷลͷલεϥΠυʹॻ͍ͨ https://speakerdeck.com/bath_poo_/introduction-to-large-scale-web-service-15CDN ऴྃ
Ajax• ಉظ௨৴ ΫϥΠΞϯτͱαʔό͕ަޓʹ௨৴Λߦ͍, ಉௐͯ͠௨৴Λߦ͏͜ͱ‣ ಡΈࠐΈ͕ऴΘΔ·ͰଞͷॲཧΛߦ͑ͳ͍ʢͭ͜ͱ͔͠Ͱ͖ͳ͍ʣ
Ajax• Ajax(Asynchronous JavaScript + XML) ΫϥΠΞϯτͷJavaScript͕Webαʔόͱ௨৴Λߦ͍, σʔλΛऔಘͯ͠ඳը͢ΔඇಉظॲཧͷΠϯλϑΣʔε‣ ͍͍ͪͪϖʔδΛϦϩʔυ͠ͳͯ͘, มߋ͍ͨ͠෦͚ͩΛAjaxΛͬͯ࠶ඳը͢Δ͜ͱ͕Ͱ͖Δ
AjaxϦΫΤετߋ৽ʹඞཁͳσʔλͱϦΫΤετΛૹ৴ϨεϙϯεͪͷؒଞͷՕॴͷදࣔߋ৽Ϣʔβʔͷૢ࡞ड͕ՄೳHTMLશମͷ࡞ΑΓॲཧ͕গͳΊϨεϙϯεHTMLશମΛฦ͢ΑΓαΠζখ͞Ί
Ajax• Ajaxʹ༻͞Ε͍ͯΔٕज़‣ HTML WebϖʔδΛهड़͢ΔͨΊͷݴޠ‣ JavaScript JavaScriptͷXMLHttpRequestΦϒδΣΫτΛ༻‣ DHTML ΫϥΠΞϯτεΫϦϓτͰϖʔδΛಈతʹมߋ͢ΔΣϒٕज़Λࢦ͢ந֓೦‣ DOM HTMLXMLΛѻ͏ͨΊͷAPIAjax ऴྃ
Web API• WebAPI(Web Application Program Interface) WebΛ௨ͯ͡ϓϩάϥϜ͕αʔϏεΛར༻͢ΔͨΊͷΠϯλʔϑΣʔεར༻ঢ়گ WebAPIͷURLσʔλΛૹ৴ॲཧ݁ՌWebAPIͷURLσʔλΛૹ৴ॲཧ݁ՌWebαʔό8FC"1*APαʔό
Web API• Web APIͷྫ‣ ҢͱܦΛૹ৴͢Δͱ, ରԠ͢Δॴͷఱؾ༧ใ͕ฦ৴͞ΕΔఱؾ༧ใAPI(Weather Hacksͱ͔)‣ ϩάΠϯใͱจষΛૹ৴͢Ε, จষΛϙετ͢Δ͜ͱ͕ग़དྷΔ(Twitterͱ͔)‣ σʔλΛૹΔͱੳͨ݁͠ՌΛฦͯ͘͠ΕΔ(WatsonAPI)
Web API• Web APIͷΓऔΓʹ༷ʑͳํ๏͕ΘΕΔ‣ XML-RPCʢϓϩτίϧʣ XMLͰූ߸Խͯ͠ॲཧͷ࣮ߦΛཁٻ͢Δ‣ SOAPʢϓϩτίϧʣ XML-RPCΛ֦ுͨ͠ߴػೳͳϓϩτίϧ‣ RESTʢઃܭࢥʣ Web্ͷϦιʔεΛҰҙͳURLͰදͯ͠, ༻͢ΔϝιουʹΑͬͯڍಈΛม͑ΔΞϨʢલʹͬͨʣ
Web API(XML-RPCͷྫ)examples.getStateName40XML-RPCϦΫΤετXML-RPCϨεϙϯεSouth Dakota
Web API(SOAPͷྫ)SOAPϦΫΤετSOAPϨεϙϯε827635Toptimate 3-Piece Set8276353-Piece luggage set. Black Polyester.100.50true
Web API(RESTͷࢥ(෮श))• RESTful(REpresentational State Transfer) 4ͭͷݪଇ͔ΒͳΔγϯϓϧͳઃܭͷ͜ͱ1. εςʔτϨε ΓऔΓ1ճ͝ͱʹ݁. ଞͷΓऔΓʹӨڹ͠ͳ͍.2. ΞυϨεՄಡੑ ͯ͢ͷϦιʔε͕ҰҙͳURIͷߏจͰදݱՄೳ3. ౷ҰΠϯλʔϑΣʔε HTTPϝιουͷར༻͕౷Ұ͞Ε͍ͯΔ4. ଓੑ ΓऔΓ͞ΕΔใʹϦϯΫΛؚΊΔࣄ͕Ͱ͖Δ
CGI• CGI(Common Gateway Interface) ΫϥΠΞϯτ͔ΒͷཁٻʹԠͯ͡αʔόʔαΠυεΫϦϓτΛىಈ͢ΔͨΊͷΈ‣ ϦΫΤετʹԠͯ͡༧Ί༻ҙ͞Ε͍ͯΔϓϩάϥϜΛ࣮ߦ͠, ͦͷ࣮ߦ݁ՌΛฦ͢
CGI8FCαʔόίϯςϯπ$(*ϓϩάϥϜಡΈࠐΈϓϩάϥϜͷىಈ࣮ߦ݁ՌϦΫΤετϨεϙϯεw $(*ͷϦΫΤετ $(*ϓϩάϥϜͷಈ࡞݁Ռw ͦΕҎ֎ 63-ʹରԠ͢ΔίϯςϯπΛฦ৴DHJCJOϑΥϧμ֎ͷϑΝΠϧ ֦ுࢠ͕DHJͰͳ͍ϑΝΠϧDHJCJOϑΥϧμʹ͋Δ֦ுࢠ͕DHJͰ͋ΔϑΝΠϧΛ$(*ϓϩάϥϜͱΈͳ͢%JSFDUPSZDHJCJO0QUJPOT&YFD$(* "EE)BOEMFSDHJTDSJQUDHJ%JSFDUPSZDHJCJOϑΥϧμʹ͋Δ֦ுࢠ͕DHJͰ͋ΔϑΝΠϧ
CGI• ΫϥΠΞϯτ͕ΤϯυϙΠϯτ(CGIͷURL)ʹΞΫηε͢Δ͜ͱͰରͷϓϩάϥϜ͕ىಈ͢Δ• ϓϩάϥϜʹσʔλΛ͢͜ͱ͕ग़དྷΔ‣ ίϚϯυϥΠϯҾ͠ URLͷඌʹ?Λ͚ͯσʔλΛ+۠ΓͰՃ͢Δํ๏‣ ύε͠ URLͷޙΖʹʮ/ʯͰ۠ͬͯσʔλΛฒΔํ๏‣ GET, POSTϝιουΛ͏
CGI8FCαʔό $(*ϓϩάϥϜσʔλΛͯ͠ϓϩάϥϜͷىಈhttp://example.com/program.cgi?σʔλ1+σʔλ2ίϚϯυϥΠϯҾ͠8FCαʔό $(*ϓϩάϥϜσʔλΛͯ͠ϓϩάϥϜͷىಈhttp://example.com/program.cgi/σʔλ1/σʔλ2ύε͠ىಈ࣌ʹσʔλΛอ͍࣋ͯ͠Δىಈޙʹ1"5)@*/'0͔Βऔಘ
CGI8FCαʔό $(*ϓϩάϥϜσʔλΛͯ͠ϓϩάϥϜͷىಈhttp://example.com/program.cgi?σʔλ໊1=σʔλ1GETϝιου8FCαʔό $(*ϓϩάϥϜσʔλΛͯ͠ϓϩάϥϜͷىಈhttp://example.com/program.cgi/POSTϝιουىಈޙ ม26&3:@453*/( ͔ΒσʔλΛऔಘىಈޙผʹૹΒΕ͖ͯͨ σʔλΛಡΈࠐΉ TUEJO
αʔόؒͷ࿈ܞ• CGIΛར༻ͤͣʹαʔόʔαΠυεΫϦϓτΛىಈ͢Δ߹, ֤αʔόαʔόʹΫϥΠΞϯτʹͳΓ͏Δ‣ Webαʔό͕APαʔόʹσʔλͷॲཧΛґཔ‣ APαʔό͕αʔόʔαΠυεΫϦϓτΛ࣮ߦWebαʔό APαʔό DBαʔόαʔόΫϥΠΞϯταʔόΫϥΠΞϯταʔόαʔϏεཁٻσʔλॲཧґཔσʔλݕࡧɾߋ৽
αʔόؒͷ࿈ܞ• αʔόಉ࢜ͷ௨৴ʹ͓͍ͯ, ϦΫΤετΛૹ৴͢Δଆ͕ΫϥΠΞϯτ, ϨεϙϯεΛฦ͢ଆ͕αʔό‣ APαʔόDBαʔόʹରͯ͠༧Ίઃఆͨ͠ϙʔτΛࢦఆ͠௨৴‣ ಉ͡αʔόʔͰ͋Ε127.0.0.1(localhost)
αʔόؒͷ࿈ܞػث͕ҟͳΔ߹Webαʔόip-addr : 127.18.1.100172.18.1.150ͷ8009ϙʔτʹଓAPαʔόip-addr : 127.18.1.150port : 8009ػث͕ҟͳΔ߹Webαʔό127.18.1.100ͷ8009ϙʔτʹଓAPαʔόport : 8009ip-addr : 127.18.1.100localhostͷ8009ϙʔτʹଓ
αʔόؒͷ࿈ܞʢར༻͢Δϓϩτίϧʣ• WebαʔόͱAPαʔόͷ࿈ܞʹΘΕΔن֨‣ HTTP‣ AJP(Apache Jserv Protocol) ApacheͱTomcat(JSPͷ࣮ߦίϯςφʣͷ࿈ܞʹΘΕ͍ͯΔ‣ WebSocket ΫϥΠΞϯτͱαʔόؒͰ1ଓΛཱ֬ͨ͠ޙ, σʔλͷΓऔΓΛιέοτ௨৴Ͱߦ͏ͷʢϦΞϧλΠϜੑ͕ߴ͍ʣ
αʔόؒͷ࿈ܞʢར༻͢Δϓϩτίϧʣ• APαʔόͱDBαʔόͲ͏͢Δͷ͔‣ ODBC(Open DataBase Connectivity) DBMSຖͷҧ͍Λٵऩ͠, ڞ௨ͷίʔυͰσʔλϕʔεʹΞΫηε͢ΔͨΊͷن֨- ODBCυϥΠόΛ͏͜ͱͰ࣮ݱ0%#$υϥΠόAPαʔό DBαʔόODBCυϥΠόΛར༻༷ͯ͠ʑͳ DBMSͷಠࣗن֨ʹରԠಠࣗϓϩτίϧͰ௨৴
ࢀߟαΠτ
ࢀߟαΠτ• MySQLೖɹϨϓϦέʔγϣϯฤ https://qiita.com/Tocyuki/items/c224cef57493f536a94• Ajax Introduction https://www.w3schools.com/js/js_ajax_intro.asp• AjaxͷհʢݹΊʣ https://www.ibm.com/developerworks/jp/web/library/wa-ajaxintro1.html• XML-RPC https://ja.wikipedia.org/wiki/XML-RPC• SOAP https://ja.wikipedia.org/wiki/SOAP_(%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)
ࢀߟαΠτ• MySQL ӡ༻+ཧ τϥϒϧγϡʔςΟϯάΨΠυ http://gihyo.jp/book/2010/978-4-7741-4294-4• ήʔϜΤϯδχΞͷͨΊͷσʔλϕʔεઃܭ https://www.slideshare.net/sairoutine/ss-62485460