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

概念から学ぶ正しくRESTfulなAPIとWP REST APIでの実例 #wb_rest

概念から学ぶ正しくRESTfulなAPIとWP REST APIでの実例 #wb_rest

2017.09.03 #wb_rest HANATANI Takuma #wbosaka #wbkyoto #wbnagano
9月のWordBenchの登壇スライドです。

A54b31d4ebbce222dff88a5c42bac033?s=128

Potato4d(Hanatani Takuma)

September 03, 2017
Tweet

Transcript

  1. ֓೦͔ΒֶͿਖ਼͘͠RESTfulͳ APIͱWP REST APIͰͷ࣮ྫ 2017.09.03 #wb_rest HANATANI Takuma #wbosaka #wbkyoto

    #wbnagano
  2. ࠓ೔͸RESTࡇΓ

  3. ͍··Ͱ͸୯ମͰಈ͘͜ͱΛલఏͱ͍ͯͨ͠ WordPress͕֎෦ʹ৘ใ͕ग़ͤ·͢

  4. ͦͯ͠WP REST APIʹΑͬͯͦͷ৘ใΛ ΍ΓͱΓ͢Δͱ෯͕޿͕Γ·͢Αʂ

  5. ͔֬ʹWordPressͷσʔλ͕ APIͱͯ͠ఏڙ͞ΕΔͱͰ͖ Δ͜ͱ͸૿͑Δ

  6. ࣮ࡍ͜͏͍͏׆༻ํ๏͕͋Γ·͢ʂ

  7. طʹࣄྫ͸୔ࢁ͋Δ

  8. ͦͷ্͜ͷAPI͸໊લͷ௨ΓRESTfulͰɺ Ϟμϯͳߏ੒Ͱ࢖͍΍ͯ͘͢ศརͰ͢Αʂ

  9. Ͱ΋͜ͷࠜఈͷRESTʹ͍ͭͯ ཧղ͍ͯ͠·͔͢ʁ

  10. POST͚ͩͰͳ͘PUT΍ DELETE͕࢖ΘΕ͍ͯͨΒ REST? ʁ

  11. URLͷܗ͕ࣜͦΕͬΆ͍ͷ͕ REST? ʁ

  12. JSON͕ଟ͍͚ΕͲJSONͩͬ ͨΒREST? ʁ

  13. REST͸ԿΛ΋ͬͯREST? ʁ

  14. ʮWP REST APIʯͱ͍͏Ϟϊ

  15. ͚ͩͰͳ͘

  16. RESTͱ͍͏֓೦Λ೺Ѳ͢Δ

  17. Կ͕REST͔Λ໌֬ʹ͠ɺ RESTful APIͷڞ௨఺ʹ͍ͭͯ ஌Δ

  18. ʮ࢖͏࣌ʯʮ࡞Δ࣌ʯ྆ํͷ ֶशίετΛେ෯ʹݮΒ͢

  19. ࠓ೔ͷΰʔϧ

  20. ΞδΣϯμ • RESTʹ͍ͭͯ • RESTͷجຊݪଇʹ͍ͭͯ • ͓͖͍֮͑ͯͨผʹREST͡Όͳ͍ϧʔϧ • RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ •

    WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ • ·ͱΊ
  21. ΞδΣϯμ • RESTʹ͍ͭͯ • RESTͷجຊݪଇʹ͍ͭͯ • ͓͖͍֮͑ͯͨผʹREST͡Όͳ͍ϧʔϧ • RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ •

    WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ • ·ͱΊ
  22. RESTʹ͍ͭͯ

  23. RESTͱ͸ʁ ݯྲྀʹ͍ͭͯ • 2000೥ʹఏএ͞Εͨ࿦จΛݯྲྀͱ͢ΔWeb։ൃʹ͓͚Δελ Πϧͷݺশ • ݱ୅తͳWeb։ൃɺಛʹAPI։ൃͷ෼໺Ͱओྲྀͱͳ͍ͬͯΔ • ࠓʹͳͬͯྲྀߦ͍ͬͯΔͷ͸ΞϓϦ։ൃɾSPA։ൃͳͲ͕੎ྗ ΛڧΊͨ͜ͱʹΑͬͯΫϥΠΞϯτɾαʔόʔϞσϧʹ͓͚

    ΔͦΕͧΕ͕໌֬ʹ෼཭͠͸͡ΊͨͳͲ͕ཧ༝ https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
  24. RESTͱ͸ʁ ஫ҙ఺ • RESTࣗମ͸࢓༷Ͱ΋ͳ͚Ε͹ΞʔΩςΫνϟͰ΋ͳ͘ɺطଘ ͷ֓೦ͷू·ΓͰ͋Δ • ҰԠ໌֬ͳఆٛ͸ଘࡏ͢Δ͕ɺ͋͘·Ͱ΋֓೦తͳ΋ͷͰ͋ Δ

  25. ΞδΣϯμ • RESTʹ͍ͭͯ • RESTͷجຊݪଇʹ͍ͭͯ • ͓͖͍֮͑ͯͨผʹREST͡Όͳ͍ϧʔϧ • RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ •

    WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ • ·ͱΊ
  26. RESTͷجຊݪଇʹ͍ͭͯ

  27. RESTͷجຊݪଇʹ͍ͭͯ ࠷௿ݶ೺Ѳ͓ͯ͘͠ͱྑ͍ݪଇ • εςʔτϨεͳΠϯλʔϑΣʔε • Ϧιʔεࢸ্ओٛʹΑΔҰҙͳࣝผࢠͷURIܗࣜͰͷఏڙ • Ϧιʔεʹରͯ͠ͷHTTPϝιουϕʔεͰͷૢ࡞ • ͦΕͧΕͷϦιʔε΁ͷΞΫηεઌͷϦϯΫͷఆٛ

  28. RESTͷجຊݪଇʹ͍ͭͯ εςʔτϨε • શͯͷHTTPϦΫΤετʹ͓͍ͯͦͷ௨৴ʹඞཁͳ৘ใ͕શͯ ؚ·Ε͍ͯΔ • ͢΂ͯͷ௨৴͸ಠཱ͓ͯ͠ΓɺͦΕͧΕ͕લޙͷίϯςΩε τʹ͍ͭͯ೺Ѳ͍ͯ͠Δඞཁ͕ͳ͍

  29. RESTͷجຊݪଇʹ͍ͭͯ Ϧιʔεओٛ • REST͸શͯͷΞΫηεͷ໨తޠΛϦιʔεͱͯ͠ఆ͍ٛͯ͠ Δ( `posts`, `users` ͳͲ) • RESTʹ͓͍ͯ͸ɺ͜ΕΒͷϦιʔεશͯ͸ඞͣҰҙͳࣝผࢠ

    Λ࣋ͪɺΞΫηε͕ՄೳͰ͋Δ(ྫ: /posts/1 )
  30. RESTͷجຊݪଇʹ͍ͭͯ HTTPϝιουϕʔεͰͷΞΫηε • RESTͷϦιʔε΁ͷૢ࡞͸ϙϐϡϥʔ͔ͭ࠷খݶͷ໋ྩηοτʹ Αͬͯදݱ͞ΕΔ • ΑΓ࣮૷ʹ͍ۙݺশͰHTTPͷ GET , POST

    , PUT , DELETE ͷ4छΛ ར༻͢Δ • ͜Ε͸ඞͣ͠΋CRUDͱରԠ͢Δ΋ͷͰ͸ͳ͍ • ͱ͸͍͑WordPressͷΑ͏ͳൺֱతϦϨʔγϣϯ͕؆ܿͳγεςϜʹ ͓͍ͯ͸CRUDͱͷϚοϐϯάͱͳΓ͕ͪ
  31. RESTͷجຊݪଇʹ͍ͭͯ Ϧιʔε΁ͷϋΠύʔϦϯΫ • ϦιʔεͷΞΫηε࣌ɺΞϓϦέʔγϣϯʹؔ͢Δ৘ใ΍ঢ় ଶͷมԽʹ͍ͭͯͷϦϯΫΛఏڙ͢Δ • ͋ΔಛఆͷϦιʔε΁ΞΫηε͢ΔࡍɺͦͷϦιʔε΁ͱؔ ࿈͢ΔϦιʔε΁ͱΞΫηε͢Δ࣌ʹ͸୯७ʹͦͷϨεϙϯ εʹؚ·ΕΔϦϯΫΛḷΔ͚ͩͰྑ͍ •

    ݪཧओٛͱͯ͠͸ɺಛఆͷΤϯυϙΠϯτʹΞΫηεͨ࣌͠ ఺ͰؔΘΔϦιʔε͕શͯӾཡͰ͖Δ
  32. ΞδΣϯμ • RESTʹ͍ͭͯ • RESTͷجຊݪଇʹ͍ͭͯ • ͓͖͍֮͑ͯͨผʹREST͡Όͳ͍ϧʔϧ • RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ •

    WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ • ·ͱΊ
  33. ͓͖͍֮͑ͯͨ ผʹREST͡Όͳ͍ϧʔϧ

  34. REST͡Όͳ͍ϧʔϧ ͜ΕΒ͸RESTͷඞਢཁ݅Ͱ͸ͳ͍ • JSON͕ඞਢͰ͸ͳ͍ • HTTPͷεςʔλείʔυΛ༗ޮ׆༻͢Δ͜ͱ΋ඞਢͰ͸ͳ͍ • Bearerೝূ΋ඞਢͰ͸ͳ͍ • Ϧιʔε͕ෳ਺ܗͰ͋Δ͜ͱ΋ಛʹඞਢͰ͸ͳ͍

    • όʔδϣχϯά΋ඞਢͰ͸ͳ͍
  35. REST͡Όͳ͍ϧʔϧ JSON͕ඞਢͰ͸ͳ͍ • JSON͸RESTͷඞਢཁ݅Ͱ͸ͳ͍ • ͳΜͰ΋JSONͱͯ͠ఏڙ͞Ε͍ͯΔͨΊޡղ͕ͪ͠ • ݱʹɺRESTͷఏএऀ͕ޙʹ͍͋͛ͯΔʮRESTͷ੒ख़౓ʯͷ αϯϓϧ͸XMLͰهड़͞Ε͍ͯΔ https://www.infoq.com/jp/news/2010/03/RESTLevels

  36. REST͡Όͳ͍ϧʔϧ HTTPͷεςʔλείʔυΛ࠷େݶ׆༻͢Δඞཁ͸ͳ͍ • RESTࣗମ͕HTTPͷຊདྷͷػೳΛ࠷େݶ׆༻͢ΔΑ͏ʹ࡞Β Ε͍ͯΔͷͰؒҧ͍Ͱ͸ͳ͍ • ͱ͸͍͑͜Εࣗମ͸ඞͣ͠΋ར༻͠ͳ͚Ε͹ͳΒͳ͍Θ͚Ͱ ͸ͳ͍ • ϓϥάϚςΟοΫͳ࿩ͱͯ͠͸ਖ਼͍͠

  37. REST͡Όͳ͍ϧʔϧ Bearerೝূ΋ඞਢͰ͸ͳ͍ • OAuth / BearerͰͷೝূʹΑͬͯRESTful APIͷೝূ͸ߦΘΕ ͕ͪͰ͸͋Δ͕ɺBearerࣗମ͸ඞਢͰ͸ͳ͍ • ͦ΋ͦ΋

    Authorization ϔομʔΛ෇༩͍ͯ͠Δ͜ͱ͸εςʔ τϨεͷ৚͔݅Βҳ୤͍ͯ͠ΔͷͰ͸ʁ • ͜Ε΋ϓϥάϚςΟοΫͳ࿩ͱͯ͠͸ਖ਼͍͠
  38. REST͡Όͳ͍ϧʔϧ Ϧιʔε͕ෳ਺ܗͰ͋Δ͜ͱ΋ඞਢͰ͸ͳ͍ • ಛʹඞਢͰ͸ͳ͍ • ωοτ্ʹ͸Α͘ʮRESTfulͳAPIͷ։ൃͰ͸શͯෳ਺ܗʹ͠ ·͠ΐ͏ʯͱ͋Δ͕ͦΕࣗମ͸ϕετϓϥΫςΟεͰ͋Δ • ϓϥάϚςΟοΫͳ࿩ͱͯ͠͸ਖ਼͍͠

  39. REST͡Όͳ͍ϧʔϧ όʔδϣχϯά΋ඞਢͰ͸ͳ͍ • `/api/v1/` ͷΑ͏ͳߏ੒΋Α͘ݟΔ͕ඞਢͰ͸ͳ͍ • རศੑΛߟ͑Δͱ໪࿦͋ͬͨ΄͏͕ྑ͍͜ͱ͸ؒҧ͍ͳ͍ • ϓϥάϚςΟοΫͳ࿩ͱͯ͠͸ਖ਼͍͠

  40. ΞδΣϯμ • RESTʹ͍ͭͯ • RESTͷجຊݪଇʹ͍ͭͯ • ͓͖͍֮͑ͯͨผʹREST͡Όͳ͍ϧʔϧ • RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ •

    WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ • ·ͱΊ
  41. RESTݪཧओٛΛ؏͘৔߹ͷ ͭΒ͞

  42. RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ ೝূͲ͏͢ΔͶΜ໰୊ • Cookie΍ηογϣϯʹΑͬͯϦΫΤετ಺Ͱԣஅతͳίϯς Ωετ͕ੜ·Εͨ࣌఺ͰεςʔτϨεͰ͸ͳ͍ • ਖ਼͘͠εςʔτϨεͰ͋ΔͨΊʹ͸ೝূΛίϯςΩετʹґ ଘ͠ͳ͍ܗʹ͢Δඞཁ͕͋Δ • Authorization

    ϔομʔΛར༻ͯ͠ Bearer ೝূ͕ϝδϟʔͰ ͋Δ͕ɺ͜Εࣗ਎΋ೝূΛඞཁͱ͍ͯ͠Δ
  43. RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ /search?q= Ͳ͏͢ΔͶΜ໰୊ • RESTʹ͓͍ͯɺURIͷର৅ͱͳΔ΋ͷ͸શͯϦιʔεͱͳΔͨ Ίɺ͜Ε͸໨తޠͱͳΔ໊ࢺͰ͋Δ΂͖Ͱ͋Δ • ͦͷதͰݕࡧΛදݱ͢Δ৔߹ɺ `search` ͱ͍͏୯ޠ͸ಉࢤͰ͋

    ΔͨΊෆ੔߹͕ੜ͡Δ • Ұͭʹ /users?q= ͱ͍͏ղܾํ๏ΛͱΔ͜ͱ΋ՄೳͰ͋Δ͕ɺ ҰํͰ /users ͷऔಘʹ͔͔Δίετ΍࣮૷্ͷ໰୊΋େ͖͍
  44. RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ ͜ΕΒʹ͍ͭͯͷղܾํ๏ • جຊతʹ͸ REST ͸ API ͷݪଇͱͳΔ֓೦Ͱ͋ΔҎ্ͷҙຯ ͸࣋ͨͳ͍ͷͰɺʮRESTͬΆ͘ʯར༻ऀ͕ѻ͍΍͍͢ܗͰఏ ڙ͢Δ͜ͱ͕ཧ૝

    • ࠷ऴతʹAPIΛར༻͢Δ΋ͷ͸ API ϢʔβʔͱͳΔਓؒͳͷ Ͱਓؒʹѻ͍΍͍͢ܗͰ࡞Δ΄͏͕ྑ͍
  45. Qiita API͸ ඇ REST Ͱ͸͋Δ͕ൺֱత REST ʹ͍ۙ I/F Λఏڙ͍ͯ͠Δ

  46. Qiita API͸ ඇ REST Ͱ͸͋Δ͕ൺֱత REST ʹ͍ۙ I/F Λఏڙ͍ͯ͠Δ

  47. esa API ΋ ඇ REST Ͱ͸͋Δ͕ൺֱత REST ʹ͍ۙ I/F Λఏڙ͍ͯ͠Δ

  48. esa API ΋ ඇ REST Ͱ͸͋Δ͕ൺֱత REST ʹ͍ۙ I/F Λఏڙ͍ͯ͠Δ

  49. ΞδΣϯμ • RESTʹ͍ͭͯ • RESTͷجຊݪଇʹ͍ͭͯ • ͓͖͍֮͑ͯͨผʹREST͡Όͳ͍ϧʔϧ • RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ •

    WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ • ·ͱΊ
  50. WP REST APIʹ͓͚Δ RESTͱͷ෇͖߹͍ํ

  51. WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ WP REST API͸ՄೳͳݶΓRESTͷ֓೦Λ९क͍ͯ͠Δ • WP REST API͸RESTfulͰ͋Δ͜ͱΛࢸ্ͱͯ͠࡞੒͞Ε͍ͯ

    Δ • WP REST API͸ɺRESTͰ͸ରॲ͖͠Εͳ͍໰୊ʹ͍ͭͯɺՄ ೳͳݶΓRESTΛ९क͢ΔΑ͏ਐΊ͍ͯΔ • ͱ͸͍࣮͑ࡍ໰୊ͱͯ͠ෆՄೳͳͱ͜Ζʹଥڠ͸͋Δ
  52. WP REST APIͷREST९कʹ͍ͭͯͷઆ໌

  53. WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ جຊతͳར༻ʹ͍ͭͯ • WP REST API͸ɺWordPress͕΋ͭ๲େͳϦιʔεʹ͍ͭͯ جຊతͳૢ࡞ΛRESTʹԊͬͨܗͰఏڙ͍ͯ͠Δ •

    ྫ͑͹ɺ [GET] /posts ʹͯ ౤ߘͷҰཡͷऔಘΛɺ [GET] / posts/<id> ʹͯ୯Ұͷ౤ߘͷऔಘΛɺ [POST] /posts ʹͯ ౤ߘͷ࡞੒Λߦ͏͜ͱ͕Մೳɻ • ͜ΕΒ͕ΧςΰϦɾϢʔβʔɾݻఆϖʔδͳͲͦΕͧΕʹର ͯ͠ఏڙ͞Ε͍ͯΔ
  54. WP REST APIͷجຊతͳϦΫΤετʹ͍ͭͯͷpayload, response

  55. WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ Searchʹ͍ͭͯ • WordPressͰ͸RESTʹ͙ͦΘͳ͍ /search ܥͷΤϯυϙΠ ϯτͰ͸ͳ͘ɺ /posts

    ΁ͷ֦ுͱ͍͏ܗͰߦ͍ͬͯΔ • /posts?search= ͱ͍͏ܗࣜʹͯݕࡧ͕Մೳͱͳ͍ͬͯΔ • ͜Εࣗମ͸Ϧιʔεͱਖ਼͘͠Ϛον͓ͯ͠Γɺ͔ͭGETʹͯ ϦιʔεͷมԽ͕ߦΘΕͳ͍ͷͰਖ਼͍͠ͱ͍͑Δ
  56. WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ ೝূʹ͍ͭͯ • WP REST APIͰ͸ɺೝূΛ OAuth, Basic,

    ͦͯ͠CookieͰ ߦ͍ͬͯΔ
  57. WP REST APIʹ͓͚Δೝূํ๏ͷछผʹ͍ͭͯ

  58. WP REST APIʹ͓͚Δೝূํ๏ͷछผʹ͍ͭͯ

  59. WP REST APIʹ͓͚Δೝূํ๏ͷछผʹ͍ͭͯ

  60. WP REST APIʹ͓͚Δೝূํ๏ͷछผʹ͍ͭͯ

  61. WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ ೝূʹ͍ͭͯ • WP REST APIͰ͸ɺೝূΛ OAuth, Basic,

    ͦͯ͠CookieͰߦͬ ͍ͯΔ • ໪࿦Cookieʹ͍ͭͯ͸εςʔτϨεͱ͸ݴ͍೉্͍ɺଞͷೝ ূ΋௨৴ʹίϯςΩετΛඞཁͱ͢Δ • WordPressͱ͍͏Ϧιʔεͷ࡞੒ʹ੍ݶΛ՝͢ͱ͍͏Ϟνϕʔ γϣϯʹ͓͍ͯؒҧ͍Ͱ͸ͳ͍ʢؾ͕͢Δʣ • ݱ୅ʹ͓͍ͯ͸͜͜ʹର͢Δਖ਼͍͠ιϦϡʔγϣϯ͸ͳ͍
  62. ΞδΣϯμ • RESTʹ͍ͭͯ • RESTͷجຊݪଇʹ͍ͭͯ • ͓͖͍֮͑ͯͨผʹREST͡Όͳ͍ϧʔϧ • RESTݪཧओٛΛ؏͘৔߹ͷͭΒ͞ •

    WP REST APIʹ͓͚ΔRESTͱͷ෇͖߹͍ํ • ·ͱΊ
  63. ·ͱΊ

  64. ·ͱΊ ᶃ RESTͷجຊ • REST͸͍·͔Β15೥Ҏ্લʹఏএ͞ΕͨWeb։ൃͷઃܭελΠϧ Ͱ͋Δ • RESTͷେ͖ͳಛ௃ͱͯ͠ɺҎԼͷ༷ͳ΋ͷ͕͋Δ • GET,

    POST, PUT, DELETEΛར༻ͨ͠Ϧιʔεૢ࡞͕ఏڙ͞Ε͍ͯΔ • εςʔτϨεͰ͋Δ͜ͱʹΑΔѻ͍΍͍͢I/F͕ఏڙ͞Ε͍ͯΔ • ϦιʔεओٛͰ͋Δ͜ͱʹΑΓURIʹͯશ͕ͯ໌ࣔ͞Ε͍ͯΔ
  65. ·ͱΊ ᶄ ͭΒ͞ • REST͸कΓ͗͢ΔͱͭΒ͍ • ਖ਼͍͠RESTfulઃܭ͸ਖ਼͍͠WebαʔϏεɾWebαΠτͷઃ ܭͰ͋Δͱ͸ݶΒͳ͍ • ࠷ऴతʹ͸ར༻͢Δଆͷ໨ઢʹཱͬͯߏங͢Δ͜ͱ͕ॏཁ

  66. ·ͱΊ ᶅ WordPress • WP REST API͸RESTͷجຊ෦෼͸क͍ͬͯΔͷͰRESTͷΠ ϝʔδ௨Γʹୟ͘ͱେ఍ͷૢ࡞͸ظ଴௨Γʹಈ͘ • جຊʹ஧࣮ͳ࡞ΓͰ͸͋ΔͷͰɺRESTʹֶ͍ͭͯͿʹ͸ஸ౓

    ྑ͍ࢿྉͱͳ͍ͬͯΔ • ͱ͸͍͑Ұ෦CookieೝূͳͲଥڠ͕͋ΔͨΊશ͕ͯRESTful ͔ͱݴΘΕΔͱͦ͏Ͱ͸ͳ͍
  67. ͓ΘΓʹ

  68. ·ͱΊ • RESTͷجຊతͳಛ௃͸ϞμϯͳWebαʔϏεͰ͸RESTͰͳ ͘ͱ΋࠾༻͞Ε͍ͯΔ • RESTͷجຊΛ͓֮͑ͯ͘ͱ༷ʑͳαʔϏεΛར༻͢Δࡍͷֶ शίετͷ௿ݮʹܨ͕Δ • ͱ͸͍͑࡞੒͢Δ৔߹͸ݻࣥ͗͢͠ͳ͍Α͏ʹ͠·͠ΐ͏

  69. ๨Ε͍ͯ·͕ͨ͠

  70. ࣗݾ঺հ Ֆ୩୓ຏ a.k.a @potato4d • དྷ೥੒ਓ͠·͢ • େࡕੜ·Εେࡕҭͪौ୩ࡏॅ • ීஈ͸ϑϩϯτΤϯυΤϯδχΞ

    • ͱ͖Ͳ͖PHPͱ͔ॻ͍ͯ·͢ • PHPΧϯϑΝϨϯε2017Ͱొஃ͢Δͷ ͰԠԉ͍ͯͩ͘͠͞