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

PHPバージョンアップけもの道

uzulla
July 15, 2021

 PHPバージョンアップけもの道

at "PHPバージョンアップ kickoff" 2021/07/15
https://breaktimes.connpass.com/event/218221/

uzulla

July 15, 2021
Tweet

More Decks by uzulla

Other Decks in Programming

Transcript

  1. ʮPHPɺόʔδϣϯΞοϓ͠φΠτʂʂʯ
    ஫ɿ15࣌͸னؒͰ͢

    View Slide

  2. PHPόʔδϣϯΞοϓ͚΋ͷಓ
    at PHPόʔδϣϯΞοϓ kickoff - 2021/07/15
    @uzulla

    View Slide

  3. ࣗݾ঺հ
    • uzullaʢ͏ͣΒʣ
    • PHP͕޷͖
    • ৽ن΋վम΋΍ΔPHPerͰ͢
    • var΍ɺ&=ʹ΋ରԠPHPerͰ͢

    View Slide

  4. ࠷ۙPR TIMES͞Μͷ͓ख఻͍ͯ͠·͢
    • CTOʮϨΨγʔରԠPHPerͰɺύοͱདྷΕΔਓ͕ଞʹࢥ͍͔ͭ
    ͳ͔ͬͨʯ
    • ࢲʮΘ͔ΔɺԶ΋஌Βͳ͍ʯ

    View Slide

  5. ࠷ॳʹ·ͱΊ

    View Slide

  6. • PHPόʔδϣϯΞοϓ͸ʮ࡞ۀʯͰ͋Δ
    • ෳࡶʹݟ͑Δ໰୊͸෼ղ͠୯७ʹɺ΍Γ͖ΕΔख๏Ͱ࣮ߦ͢Δ
    • ςετ͕ॆ࣮͍ͯ͠ͳ͚Ε͹ɺ৽چൺֱ͢ΔE2EςετΛਪ঑
    • ࣮͸ίʔυमਖ਼͸೉ؔͰ͸ͳ͍ɺஈऔΓ͕8ׂɻຐ๏͸ͳ͍
    • શһͰղܾ͢΂͖ࣄɺਏ͍࡞ۀͳͷͰपғ͸αϙʔτ͠Α͏
    • ࣄނ͸͓͜ΔɺͳʹΛ΍ͬͯ΋͓͜ΔɺݟۃΊ΍֮ޛ͕ඞཁ
    • ࠷ޙϚΠϯυ͕มΘΕ͹੒ޭɺVer UPΛ೔ৗʹ͢ΔɺૅΛங͘

    View Slide

  7. ͸͍

    View Slide

  8. Ͳ͏ͯ͠PHP(ϥϯλΠϜ)ΛόʔδϣϯΞοϓʁ
    • (ࢲײͰ͕͢…)
    • EOLͳͷͰ
    • PHPͷਐԽ͕࢖͑ͳ͍ͷͰ
    • ࠷ۙ͸ݴޠ΋ػೳ΋଎౓΋πʔϧ΋ஈҧ͍ʹྑ͘ͳͬͨͷʹ
    ͲΕ΋͜Ε΋࢖͑ͳ͍ɻͭΒ͍͠ɺؾ෼͕੝Γ্͕Βͳ͍

    View Slide

  9. ʮΈΜͳόʔδϣϯ্͛ͯΔͷ͔ʁʯ
    • ࢲײͰ͕͢…
    • PHPϝΠϯͷॴ͸v7.2ɺv7.4Ґʹ͸্͍͛ͯΔॴ͕ଟ͍
    (v8͸·ͩ͜Ε͔ΒͷΠϝʔδ)
    • Ұํv5.4ͷࠒʹPHPͷ੎͍Λ৴͡ΒΕͣɺఀ଺ͨ͠ݱ৔΋ଟ͍
    • v8.1΋ग़Δ͠ɺࠓ΋PHP͸Ճ଎౓తʹਐԽ͍ͯ͠Δɺ
    ௥͍͖ͭͮΒ͞͸͞ΒʹՃ଎͢Δ

    View Slide

  10. PHP version, Age Night …
    • ͔ͩΒɺ͍·͙͋͢ͳͨ΋Version UP!!
    • ຊτʔΫ͸ɺ্͛ͯͳ͍ਓ͕ର৅Ͱ͢
    • ຊτʔΫ͸ɺPR TIMES಺ͷΤϯδχΞ͞Μ޲͚Ͱ͢
    • (࣮ঢ়ͱϑΟοτͯ͠ͳ͍͔΋ɺྃ͝ঝ͍ͩ͘͞)
    • ࠓ೔ඈ͹ͨ͠ൣғ͸ฉ͍ͯ͘ΕͨΒݸผʹ͍͘ΒͰ΋΍Γ·͢
    • (ྫతͳ΋ͷ͸Ұൠ࿦ͰɺPR TIMES͞Μͷݱঢ়Ͱ͸͋Γ·ͤΜ)

    View Slide

  11. ͜͜Ͱ͍͏ʮόʔδϣϯΞοϓʯͱ͸ʁ
    • ৭ʑͳͱ͜ΖͰޠΒΕΔʮPHPόʔδϣϯΞοϓʯ͸
    ʮϦϑΝΫλϦϯάʯͱࠞಉ͞Ε͍ͯΔ
    • όʔδϣϯΞοϓ͸ϦϑΝΫλϦϯάͰ͸ͳ͍
    • (ࠓճɺϦϑΝΫλϦϯάͷ࿩͸͠ͳ͍)
    • ϦϑΝΫλϦϯάʹ͍ۙࣄΛʮඞཁͳͷͰʯߦ͏৔໘͸͋Δ

    View Slide

  12. PHPόʔδϣϯΞοϓ͸
    ϨΨγʔγεςϜվળͷҰ؀
    (͜͜Λؒҧ͑ͳ͍Α͏ʹؾΛ͚ͭͯ)
    (ͳ͓ɺϦϑΝΫλϦϯά΋
    ϨΨγʔγεςϜվળͷҰ؀)

    View Slide

  13. ࣮ફฤͷલʹ
    • ΞΠεϒϨΠΫతʹɺܞΘΔਓ΍ؔΘΔਓ͕΋ͭ΂͖৺ߏ͑౳…

    View Slide

  14. ඞཁͳ΋ͷ
    ΍Δؾ (Motivation)
    ࣌ؒ (Schedule)
    ౓ڳ (Brave heart)

    View Slide

  15. ΍Δؾ

    View Slide

  16. ΍Δؾ͜ͱϞνϕʔγϣϯ
    • ͜Ε͸ώοτϙΠϯτͰ͢ɺͳ͓਺஋͸ݟ͑ͳ͍
    • ʮઓ͏ͱݮΓ·͢ɺແཧ͢ΔͱθϩʹͳΓ·͢ʯ
    • େ͖͚Ε͹Ͳ͏ʹ͔ͳΔ΋ͷͰ͸ͳ͍͕ɺ
    গͳ͍ͱͲ͏ʹ΋ͳΒͳ͍ɻࣗݾɾपғͰͷ؅ཧ͕ඞཁ
    • ʮճ෮ͨ͠Γɺ૿΍ͤ·͢ʯ
    • ճ෮ͷඞཁɾෆඞཁ͸࿦͡ΔՁ஋ͳ͠ɺඞཁͰ͋Δ
    ·ͣ͸ڐ༰ɺ࣍ʹԠԉɺͦͯ͠ཧղͱࢧԉΛ͍ͯ͘͠

    View Slide

  17. ʮϨΨγʔγεςϜվળ΍Γͨ͘ͳ͍ʯ໰୊
    • ʮҰ౓͔͠΍Βͳ͍ҙຯͷͳ͍࡞ۀʯ
    • NOɺผ࣮૷Ͱ΋ɺଞݴޠͰ΋·ͨ΍Γ·͢
    • ʮษڧʹͳΒͳ͍ʯ
    • NOɺγεςϜ΍ઃܭʹৄ͘͠ͳΓ·͢
    • ʮ৽͍ٕ͠ज़(?)Ͱ࣮૷ͨ͠΄͏͕௵͕͖͘͠ʯ
    • NOɺ৽͍ٕ͠ज़(?) ΋ɺ͜͏ͳΓ·͢ɻલ޲͖ʹଊ͑·͠ΐ

    View Slide

  18. ࣌ؒ

    View Slide

  19. આ໌ෆཁ͕ͩɺ࣌ؒ͸ඞཁ
    • ࣌ؒʹਓ݄㲈ػձଛࣦ ▶ ʮ࠷௿ݶʹ͠Α͏ʯ ▶ Ϧεέ ▶ அ೦
    • ݟੵࠔ೉࡞ۀͳͷʹɺͳ͔ͥ୹࣌ؒͰݟੵ΋Γ͕ͪ
    ڍ͛۟ɺ୹ظͷεέδϡʔϧ͕૊·ΕΔ͜ͱ͕ଟ͍…
    • ʮ৽نͰ࡞ͬͨ΄͏͕޻਺͕ಡΊΔʯ
    ʮͦΕ͸ʰ৽نͰ࡞ͬͨܦݧʱ͕ଟ͍͚ͩͰ͸ʁʯ
    (·͋ɺຊ౰ʹ৽نͰ࡞ͬͨ΄͏͕ྑ͍৔߹΋͋Δ)

    View Slide

  20. Ұ൪༥௨͕͖͘ͷ͸େ఍࣌ؒ
    • ͕ͩɺແବʹ࣌ؒΛ৳͹ͯ͠΋μϨͯɺ݁Ռ͕θϩʹͳΔ
    ޮ཰͕ѱ͘ͱ΋ɺख໭Γ͕͋ͬͯ΋ɺଞΛϒϩοΫͯ͠΋ɺ
    খ͍͞าΈͰ΋ɺॏͶͯɺܧଓ͠ɺ΍Γ͖Δඞཁ͕͋Δ
    • ΍Γ͖Δඞཁ͕͋Δ (େࣄͳͷͰೋ౓ݴ͍·ͨ͠)
    • Ͱ͖Δͷ͸ʮҰ൪୹͍࣌ؒΛݟੵ΋ΔʯࣄͰ͸ͳ͘ɺ
    ʮ୹͘ͳΔΑ͏ʹࢼߦࡨޡ͢Δʯ͜ͱͰ͋Δ

    View Slide

  21. ౓ڳ

    View Slide

  22. ౓ڳͱ֮ޛ
    • όʔδϣϯΞοϓΛ͍ͨ͠ϓϩμΫτ͸ઈࢍՔಇத
    • ࢭ·ΔɺյΕΔαʔϏεɻอূ͸ෆՄೳ
    • खؒՋ͔͚ͯΧφϦΞσϓϩΠͱ͔͢Δͷ΋େม
    ʢ·͋ɺͪΌΜͱ͢Δ৔߹͸͢ΔΜ͚ͩͲʣ
    • ؾ͔ͮͳ͍σʔλഁଛ…΢ο಄͕…
    • ͕ͩڪΕ͍ͯͯ͸ਐΊͳ͍ɺʮશһʯʹ౓ڳͱ֮ޛ͕ඞཁ

    View Slide

  23. ʮࣦഊΛڐͤͬͯ࿩͔ʁ(স)ʯ
    • ͦ͏͡Όͳ͍ʂ΋͏ࣦഊͯ͠Δʂ໨Λ͞·ͯ͠ʂʂ
    • ʮ৮Β͵γεςϜʹͨͨΓͳ͠ʯͰɺࠓ͕ͨͨΓͰ͢Αʂ
    • ͭ·Γ͞Βʹࣦഊ͢Δ͚ͩͰ͢ʂ
    • (ؾ͕ࡁΉͳΒ)ଠཅͷ͍ͤʹͯ͠΋͍͍͔Β΍Δͧ
    • ౓ڳ΋ͬͯߦ͖·͠ΐ͏

    View Slide

  24. օ͞Μͷإ৭͕มΘͬͨॴͰ
    • (تΜͰΔਓ΋ɺ۩߹͕ѱ͘ͳͬͨਓ΋͍ΔͰ͠ΐ͏͕)
    • ࣮ફతͳ࿩ʹೖ͍ͬͯ͘·͑ʹ੎͍ྑ͘ݴ͍·ͨ͠
    • ϙΤϜ͸ऴΘΓɺ͔͜͜Β࣮ફʹೖ͍͖ͬͯ·͢

    View Slide

  25. ࣮ફͱ͍ͬͯ΋
    • ʮߴ౓ͳςΫχοΫʯͳ͜ͱ͸ݴ͍·ͤΜ
    • (ϋΠςΫΛ࢖͏ͳͱ͍͏ҙຯͰ͸ͳ͍)
    • ࠓճ͸ʮͰ͖ΔʯʹશৼΓ͠·͢
    • (ͦͷ্Ͱɺ͔ͭ͑ͨΒ࢖͍·͠ΐ͏)

    View Slide

  26. ໨࣍
    • ՝୊ઃఆ
    • E2Eςετ
    • αϯυϘοΫε
    • ϚΠάϨʔγϣϯ࡞ۀ
    • ೆແࡾσϓϩΠ

    View Slide

  27. PHPͷόʔδϣϯΞοϓͱ͸ʁ
    ※ʮϦϑΝΫλϦϯάʯͰ͸ͳ͍

    View Slide

  28. ՝୊ɿPHPͷόʔδϣϯΞοϓ
    ࢪࡦɿόʔδϣϯΛΞοϓ͢Δ

    View Slide

  29. ʁʁʁʁʁʁʁ
    (͝ଘ஌ͷ௨Γɺ୯ʹPHPϥϯλΠϜͷόʔδϣϯΛ্͛Δͱ99%յΕ·͢)

    View Slide

  30. ʮόʔδϣϯΞοϓͰ͖·͔͢ʁʯ
    • ϨΨγʔγεςϜͷݱ৔Ͱɺӡྑͬ͘͘͟͹ΒΜʹݱ৔ͷํͱ
    ձ࿩ͨ࣌͠ʹݟฉ͖ͨ͠ɺࢲͷ஌ΔҰൠతͳೝࣝ
    • ʮͰ͖ΔΑʯ ▶ ͘͝Θ͔ͣ
    • ʮͰ͖ͳ͍Αʯʮ΍Βͳ͍Αʯ ▶ 9ׂҎ্

    View Slide

  31. ͳͥʮͰ͖ͳ͍ʯ͔ΛࢲݟͰ૯࿦͢Δͱ
    • ʮେม͗͢Δ͔Βʯʮҙຯ͕ͳ͍͔Βʯ
    ▶ ࡞ۀ͢ΔਓࡐɺίετɺϞνϕʔγϣϯ͕֬อͰ͖ͳ͍
    • ʮʰ΍ΓํʱΛ஌Βͳ͍͔Βʯ
    ▶ ʰਖ਼͍͠ʱख๏΍πʔϧͷଘࡏΛ৴͍ͯ͡Δ
    • ʮ৽نͰͭ͘Δ΄͏͕ྑ͍͔Βʯ
    ▶ ܦݧऀʹଟ͍ɻ৽نͷํ͕ݟੵ΋ΓΛ͠΍͍͢ͷ͸ͦ͏Ͱ͢
    Ͷ

    View Slide

  32. ͜͜Ͱ͸ʮ΍ΓํΛ஌Βͳ͍ʯʹϑΥʔΧε͠·͢
    • ͳʹͤɺલఏͱͯ͠ɺͦΕΛ΍Βͳ͍ͱ͍͚ͳ͍ΜͰͶʂ

    View Slide

  33. ໰୊Λղ͘ʹ͸ద੾ͳ՝୊ઃఆ͕ඞཁ
    • ʮ͜ΕΛόʔδϣϯΞοϓͯ͠ʯ ▶ ݟੵ΋Γࠔ೉ʹݟ͑Δ
    • ʮ͜ͷςετΛ௨ΔΑ͏ʹͯ͠ʯ ▶ Մೳʹݟ͑Δ
    • ͳͷͰɺςετʹམͱ͠ࠐΉ
    • ৽؀ڥͱچ؀ڥͷζϨ(ෆ۩߹)Λ໰୊ʹ͢Δ
    • ͦͷζϨͷϦετΛʮ࡞Δʯͷ͸Մೳͱ͍͑ΔͷͰ͸ͳ͍͔ʁ
    (໰୊ͷ෼ׂ)

    View Slide

  34. େมͦ͏͗͢Δʂ
    • ʢؾ࣋ͪ͸Θ͔Δʣ
    • ͔͠͠ɺʮΘ͔Δॴ·ͰɺϒϨΠΫμ΢ϯ͢Δʯͷ͸Ԧಓ
    • ղ๏͸̍ͭͰ͸ͳ͍͠ɺ୔ࢁ͋Δ
    • །Ұͷਖ਼ղ͸ͳ͍͕ɺࣄྫ΍৘ใ͸୳ͤ͹୔ࢁ͋Δ
    • ͲΜͳࣄͰ΋ɺલྫ͸ʮਖ਼ղʯͰ͸ͳ͍
    • ͋͘·Ͱࢀߟʹͯ͠ɺ΍͍ͬͯ͘

    View Slide

  35. ʮ࣮ྫʂվળͷ༷ࢠʂʂʯ
    foreach($՝୊Ϧετ as $՝୊){
    ʮ͜ͷػೳɾϑϩʔ͕ಈ͔ͳ͍ʯ ▶ ʢݪҼௐࠪͷ։࢝ʣ
    ʮ͜ͷURL͕ಈ͔ͳ͍ʯ ▶
    ʮ͜ͷίʔυͷ͜ͷߦ͕ಈ͔ͳ͍ʯ ▶
    ʮؔ਺͕ͳ͘ͳ͍ͬͯΔʯ ▶ ʢݪҼௐࠪͷୡ੒ʣ
    ʮΑ͠ʂ͠Β΂ͯॻ͖׵͑Α͏ʂʯ ▶ʢࢪࡦͷ։࢝ʣ
    ʮςετͯ͠͏͍ͨͧ͝ʂʯ⾣ ʢୡ੒ʣ
    } # ͜Εͷ܁Γฦ͠ɺ͜Ε͕ೖΕࢠʹͳΔ

    View Slide

  36. Ұൠతͳݱ৔ʹ͓͍ͯ
    • ݸʑͷ໰୊(मਖ਼࡞ۀ)͸ɺօ͞ΜղܾͰ͖Δ
    • ن໛΍ɺ೉͍͠໰୊΋͋Δ͚Ͳɺग़དྷͳ͍࿩Ͱ͸ͳ͍
    (PHPಘҙʢࣗশʣͳͷͰख఻͍·͢)
    • ͔͠͠ɺͦ͜ʹͨͲΓண͘ͷ͕৭ʑ೉͍͠ΜͰ͢ΑͶ…
    • (ࣗ৴͕ͳ͍ʁΘ͔Βͳ͍ʁख఻͍·͢ɺͦͷͨΊʹདྷ·͠
    ͨ)

    View Slide

  37. Ͱ͸Ͳ͏΍ͬͯ΍͍͔ͬͯ͘ʁ
    (Ұൠ࿦Ͱ͢ɺPR TIMESʹ͓͍ͯʮ͜͏͢Δɾ͢΂͖ʯͱ͍͏࿩Ͱ͸ͳ͍)

    View Slide

  38. E2EςετʢEnd to End ςετʣ

    View Slide

  39. E2EςετʢEnd to End ςετʣ
    • ೖྗ(ϦΫΤετ)ʹର͠ɺظ଴௨Γͷग़ྗ(Ϩεϙϯε)͔ʁ
    • ৽؀ڥʹ࣮ߦͯ͠੒ޭɾࣦഊ͕Θ͔Δ
    (ͦͯ͠ɺݱߦʹ΋͔͚ΒΕΔ)
    • ʮόʔδϣϯΞοϓޙɺE2Eςετ͕௨Ε͹੒ޭʯͱݴ͑Δ
    • (…ཧ࿦্ͷཧ૝Ͱݴ͑͹ɻྫ֎΋͋Γ·͢)
    • ϒϥ΢βͰखಈͰ΋Մೳɺ೔ʑօ͞Μͯ͠Δͱࢥ͍·͢ɻ

    View Slide

  40. ͔݁͠͠߹ςετ͸ਏ͍
    • मਖ਼ͨ͠Βຖճϑϧςετ͍͕ͨ͠ɺਓྗ͸େม
    • ▶ ςετ͸େมɺͰ͖Δ͚ͩࣗಈԽ͠Α͏
    • ʮࣗಈԽͱ͍͑͹˓˓Λ͔͓ͭ͏ʂʯͷ᠘
    • ҰͭͰ΋ଟ͘ͷςετΛ࡞Δ΂͖ͳͷʹ
    ʮςετॻ͘ͷ͕ ໘౗ େมʯ໰୊
    • ▶ πʔϧͰղܾ͸͠ͳ͍(ܦݧ্ɺѱԽ͠΍͍͢)

    View Slide

  41. ॏཁͳͷͰೋճ͍͍·͢
    • ςετ͕ͨ͘͞Μ͋Δ͜ͱ͕ॏཁ
    • ʮ͔͍͍ͬ͜πʔϧʯ͸ॏཁͰ͸ͳ͍
    • ςετͷϞμϯ͞ɺ៉ྷ͞͸୹ظʹ͸ҙ͕ٛബ͍(ओ؍)
    • ʢ͔͍͍ͬ͜πʔϧ͕ศརͳ͜ͱ΋͋Δʣ
    • ʢଟ͘ͷ৔߹ʣʮReq/Res ͚ͩݕূͰ͖Ε͹ྑ͍ʯ
    • ׳ΕͨPHPͱλεΫϥϯφʔͰॻ͚Δ

    View Slide

  42. ͡Ό͋ૉ๿ͳπʔϧͱ͸ʁͷྫ
    • symfony/http-client + symfony/dom-crawler + phpunitҐͰ͍
    ͍
    • (HTMLͷ׬શҰக͸ແ஡ͳͷͰ)
    ϨεϙϯείʔυɺϔομʔɺDOM౳ͷ֬ೝ
    • ʮ࡞ۀʯͳͷͰɺʮ͔ͬ͜Α͍ʯඞཁ͸ͳ͍
    ۃ࿦͍͑͹ɺcurlͱγΣϧεΫϦϓτ͍͍ͩͬͯ
    • (JS͕ͳ͍ͱಈ͔ͳ͍ʁ

    View Slide

  43. phpunit͕ͩɺϢχοτςετͰ͸ͳ͍
    • phpunitΛλεΫϥϯφʔͱ͔ͯͭ͠͏(PhpStorm࿈ܞศར)
    • CI౳Ͱͷར༻ੑɾকདྷੑ͸Ұ൪ͷ໰୊Ͱ͸ͳ͍
    ϦϑΝΫλϦϯάͰ͸ͳ͍ɺόʔδϣϯΞοϓͩ
    • ϩδοΫͷ݈શੑςετΛ͔͖͍ͨΘ͚Ͱ͸ͳ͍
    • ͳͷͰɺ͜ͷʮςετʯ͸ɺΞϓϦͱผ(ͷrepo౳)Ͱྑ͍
    (ͱ͍͏͔ɺ෼͚ͳ͍ͱݹ͍PHPΛ࢖͏ࣄʹͳΔ…)

    View Slide

  44. ͳͥE2Eςετ༻πʔϧͰ͸ͳ͍ͷ͔
    • ϔουϨεϒϥ΢βΑΓɺ࣮ߦ଎౓͕଎͍
    (ڧ͍PCͰฒྻ౓Λ্͍͛ͯ͘ͱɺෛ͚Δࣄ͸͋Δ)
    • PHPΤϯδχΞͳΒɺ୯७ʹૣ͘ॻ͚Δ
    (ෆ׳ΕͳDSL౳ɺPHPҎ֎ͷݴޠΛ৮ΒͣʹࡁΉ)
    • DBΛཪଆ͔Β͞Θͬͯ౴͑߹Θͤ౳͕Մೳʂ
    ʢຊ൪ίʔυ͔Βྲྀ༻͢Δ͜ͱ͕Ͱ͖Δʣ

    View Slide

  45. αϯϓϧ

    View Slide

  46. /** @noinspection NonAsciiCharacters */
    /** @noinspection PhpUnhandledExceptionInspection */
    declare(strict_types=1);
    namespace MyTest\Scenario;
    use PHPUnit\Framework\TestCase;
    use Symfony\Component\DomCrawler\Crawler;
    use Symfony\Component\HttpClient\HttpClient;
    class TopPageTest extends TestCase
    {
    public function testτοϓϖʔδΛදࣔ(): void
    {
    // https://symfony.com/doc/current/http_client.html
    $c = HttpClient::create();
    $res = $c->request('GET', 'https://cfe.jp/');
    // check response header
    $this->assertEquals(200, $res->getStatusCode());
    $header = $res->getHeaders();
    $this->assertArrayHasKey('content-type', $header);
    $this->assertStringStartsWith('text/html', $header['content-type'][0]);
    $this->assertStringContainsString('html', $res->getContent());
    // DomCrawler
    $d = new Crawler($res->getContent());
    // check title
    $this->assertEquals("cfe.jp - uzulla", $d->filter('title')->text());
    // find with css selector
    $sns_link_list = $d->filter('body > ul:nth-child(4)');
    // find in found result
    $a_that_have_li = $sns_link_list->filter("li a");
    // check in loop
    foreach($a_that_have_li as $a){
    $this->assertStringStartsWith('https://', $a->attributes->getNamedItem('href')->nodeValue);
    }
    }
    }

    View Slide

  47. /** @noinspection NonAsciiCharacters */
    /** @noinspection PhpUnhandledExceptionInspection */
    declare(strict_types=1); # ͔ͤͬ͘ͳͷͰ৽͍͠PHPʹ߹Θ͍ͤͯ͘
    # ʮػೳʯͰ͸ͳ͘ɺʮURLʯ୯ҐͷςετͰ͋Δ
    namespace MyTest\Scenario;
    use PHPUnit\Framework\TestCase;
    use Symfony\Component\DomCrawler\Crawler;
    use Symfony\Component\HttpClient\HttpClient;
    class TopPageTest extends TestCase
    {
    public function testτοϓϖʔδΛදࣔ(): void
    { # ೔ຊޠͷςετ໊Λڐ͢ʢΤϯδχΞͷ฼ࠃޠʹ΋ΑΔʣ
    // => ࣍ϖʔδ΁
    }
    }

    View Slide

  48. // https://symfony.com/doc/current/http_client.html
    $c = HttpClient::create();
    # ϦΫΤετΛඈ͹͢
    $res = $c->request('GET', 'https://cfe.jp/');
    # ϨεϙϯεϔομΛ֬ೝ͢Δʢॏཁʣ
    $this->assertEquals(200, $res->getStatusCode());
    # ҎԼ͸HTMLͷྫͳͷͰɺapplication/jsonͳͲͷ৔߹͸·ͨม͑Δ
    $header = $res->getHeaders();
    $this->assertArrayHasKey('content-type', $header);
    $this->assertStringStartsWith('text/html', $header['content-type'][0]);

    View Slide

  49. # ͱΓ͋͑ͣจࣈྻͰ৭ʑ൑ఆ͢Δ
    $this->assertStringContainsString('html', $res->getContent());
    # ࠷ޙ·Ͱग़ͯͦ͏ʁ
    $this->assertStringContainsStringIgnoringCase('

    View Slide

  50. # HTMLΛύʔεͯ͠৭ʑ֬ೝ͢Δ
    $d = new Crawler($res->getContent());
    # λΠτϧͷ֬ೝ
    $this->assertEquals("cfe.jp - uzulla", $d->filter('title')->text());
    # XPathͰͳ͘ɺ׳ΕͨCSSηϨΫλ͕͔ͭ͑ΔΑ
    $sns_link_list = $d->filter('body > ul:nth-child(4)');
    # બ୒ͨ͠DomNodeList͔Β͞ΒʹߜΓࠐΊΔΑ
    $a_that_have_li = $sns_link_list->filter("li a");
    # ͪΐͬͱ΍΍͍͜͠Μ͚ͩͲɺࠓͲ͖ͷPHPͳΒิ׬Ͱ͖ΔΑ
    foreach($a_that_have_li as $a){
    $this->assertStringStartsWith('https://', $a->attributes->getNamedItem('href')->nodeValue);
    }

    View Slide

  51. $ composer test
    > vendor/bin/phpunit
    PHPUnit 9.5.6 by Sebastian Bergmann and contributors.
    . 1 / 1 (100%)
    Time: 00:00.202, Memory: 6.00 MB
    OK (1 test, 16 assertions)
    αϯϓϧίʔυɿ https://github.com/uzulla/mch

    View Slide

  52. جຊతͳࣄ͸͜ΕͰͲ͏ʹ͔ͳΓ·͢
    • HTML͕࠷ޙ·ͰͰ͍ͯͯɺΤϥʔ͕ͳ͚Ε͹େମେৎ෉(?)
    • γφϦΦ໊͸೔ຊޠͰ΋ྑ͍ʢӳޠͰ΋ྑ͍ʣ
    • ͨͩɺ೔ຊޠͩͱ୹ͯ͘ࡁΉ…ֆจࣈ΋ྑ͍
    • ࠓ͸ଟࠃ੶ͳݱ৔΋ଟ͍ͷͰɺௐ੔͠·͠ΐ͏
    • Τϥʔϩά΋֬ೝ͠·͠ΐ͏ͶɺࣗಈԽͮ͠Β͍͚Ͳ
    (͜Ε͸ࠓճεΩοϓ)

    View Slide

  53. ͲΜͲΜΧελϜͯ͠΋ྑ͍
    • TestCaseΫϥεΛϥοϓ͢ΔɺTraitʹ෼཭͢Δ
    ྫ: clientΛWrapͯ͠ɺStatus CodeνΣοΫͱ͔Λڞ௨Խ
    • ݱ৔ʹϚον͢Δলུه๏Λ૿΍͢ͱޮ཰্͕͕Γ·͢ɺ
    ʮෳࡶͰͳ͍ʯͳΒΑ͠
    • URLϦετΛCSV΍Google Sheets͔ΒҾ͘ͳΜͯศར΋ΞϦ
    • Ϟμϯͳ੩తղੳ͕ޮ͘ίʔυʹ͢Ε͹ϦϑΝΫλ΋؆୯ʂ
    • ʮ͋ͨΒ͍͠PHPʯΛ࢖͏͜ͱͰؾ෼ΛΞή͍ͯ͘

    View Slide

  54. (࠶ܝࡌ)໘౗Ͱॻ͔ͳ͍ɺͦΕ͕Ұ൪΍͹͍
    • ͱʹ͔͘؆୯ʹॻ͚ΔɺಡΊΔɺ௚ͤΔΑ͏ʹ
    • ৽ਓͰ΋ॻ͚Δ͘Β͍͕ͪΐ͏ͲΑ͍ͦ͠͏͢΂͖
    • εςʔλείʔυݟΔ͚ͩͰ΋͍͍͔Βॻ͘
    • HTMLଆʹɺςετͷͨΊʹηϨΫλϑϨϯυϦͳcss classΛ
    ͍ΕͨΓɺdata-test="hoge"ͱ͔͍Εͯ޻෉͢ΔؾʹͳΔ
    • (ʮN൪໨ͷϘλϯʯ໰୊͸ϞμϯπʔϧͰ΋͋Δ)

    View Slide

  55. ͯ͞ɺπʔϧ͸Α͍ͱͯ͠ɺͲ͏ςετέʔεॻ͔͘ʁ
    • ʮ׬ᘳͳέʔεʯΛ࡞Ζ͏ͱͯ͠ɺ
    ҰͭͷέʔεʹΉ΍Έʹ࣌ؒΛֻ͚Δͷ͸ͭΒ͍
    • ฏͨ͘ݴ͑͹ࢼ͢URL͕ଟ͍΄ͲΑ͍ɺ͔͕ͨ஌Ε͍ͯΔ
    (…ࣄ͕ଟ͍ɺӡ͕ѱ͘ͳ͚Ε͹)

    View Slide

  56. • ʮ৚݅໢ཏʯ(ೖྗ஋ͷଟ༷͞)͸͞΄ͲॏཁͰ͸ͳ͍
    • ڥք৚݅Ͱ͜ΘΕΔ͜ͱ͸(૝૾ΑΓ͸)গͳ͍͔ɺ
    ݟ͚ͭΔࣄࣗମ͕ࠔ೉
    • શମͷΤϯυϙΠϯτ(URL)ͷ໢ཏɺػೳͷ໢ཏ͕ॏཁɺ
    ඇޓ׵͸͋Δఔ౓ݻ·ͬͯଘࡏ͍ͯ͠Δࣄ͕ଟ͍

    View Slide

  57. • ΞΫηε͕গͳ͍URL͸೉͍͠ͷͰɺਓ͕ิ׬͍ͯ͘͠
    • QAͷਓͱऔΓܾΊ·͠ΐ͏
    • ΞΫηε͕θϩͳΒɺ௚͢લʹফ͢ݕ౼

    View Slide

  58. ͳͷͰɺςετͷURLύλʔϯऩू͕ॏཁ
    • Ͳ͏΍ͬͯʁ ▶ ຊ෺ͷϩάΛݟΔ
    • ΞΫηεϩάΛ੾ͬͨషͬͨ͠·͘Δ
    • ΞΫηεϩά͕ͳ͍ͳΒɺࠓ͙͢อଘΛ͸͡ΊΔ

    View Slide

  59. େྔͷੜϩάΛ੾ͬͨషͬͨͱ͸ʁ
    • ΞΫηεϩάͷूܭπʔϧ͸ੈͷதʹ͸݁ߏ͋Δ
    • ͨͩɺूܭɾάϧʔϓԽ͕ʮࣗࡏʹָʹʯͰ͖ͳ͍ͱͭΒ͍
    • ͓͢͢Ί͸ɺͳΜͱISUCONͰ΋͓ͳ͡Έͷ alp
    • ͔ΜͨΜʹάϧʔϓԽ͕Ͱ͖ΔͷͰେมศར
    • (·͋ɺࣗ෼Ͱπʔϧॻ͍ͯ΋͍͍ͱࢥ͍·͢)

    View Slide

  60. • ͪΐͬͱͨ͠ϏοάσʔλͳͷͰBigQuery΍ɺ
    S3ʹ͋͛ͯAthena౳Λߏஙͯ͠΋Α͍Ͱ͠ΐ͏
    • ͨͩɺͳΜ͔ͩΜͩ͜Ͷ͘Γճͯ͠ோΊͯճΔͷͰ
    ͋Δఔ౓͸ੜϩά͕͋Δํ͕ศརʢମݧஊʣ
    • (SQLͰਖ਼نදݱΛۦ࢖Ͱ͖Δਓ͸ɺͦΕͰ΋ྑ͍ͱࢥ͍·͢)

    View Slide

  61. LTSV
    • alpΛ࢖͏ͳΒ൒ࣗಈతʹͦ͏Ͱ͕͢ɺੜϩά͸औΓѻ͍͕໘౗
    ͳͷͰɺղੳʹ͸LTSVʹม׵͢Δ͜ͱΛڧ͘קΊ·͢
    • LTSV͸JSONΈ͍ͨͳ΋ͷͰʢࡶʣύʔε΋͠΍͍͢
    • ෆཁͳ৘ใ͸࠷ॳ͔Βࣺ͓͚ͯͯ·͢(ॏཁ)
    (ྫ: User-agentɺIPɺ౳)
    • (ࢲ͸ࣗ࡞πʔϧͰετϦʔϜม׵͠·ͨ͠)

    View Slide

  62. LTSVྫͰ͢
    time:2021-06-23T03:59:30+00:00 method:GET uri:/ status:200 size:12306 apptime:0.226 type:text/html
    time:2021-06-23T03:59:30+00:00 method:GET uri:/hoge status:404 size:306 apptime:0.226 type:text/html
    time:2021-06-23T03:59:30+00:00 method:POST uri:/api.php status:200 size:306 apptime:0.226 type:application/json
    time:2021-06-23T03:59:30+00:00 method:GET uri:/redirect?hoge status:302 size:0 apptime:1.226 type:text/html
    label:Value{\t}label:Value{\t}label:Value
    time ΞΫηε೔࣌
    method HTTP ϝιου
    uri ΞΫηεURLʢϗετ͸ͳ͍ʣ
    status εςʔλείʔυ
    type Content-Type

    View Slide

  63. ૉࡐ(ੜϩά)͸઱౓΋ॏཁ
    • ݹ͍ϩάΑΓɺ࠷ۙͷϩάΛΈ·͠ΐ͏
    • ʮԿϲ݄ʯΈΔ͔͸ݱ৔ʹΑΓ·͢
    • (ແ͍ͳΒແ͍͠ɺࣺͯͯΔॴ΋ଟ͍͠)
    • ͔͠͠࠷௿Ͱ΋̎ϲ݄͸ඞཁɺͰ͖Ε͹̍೥
    • (݄·ͨ͗Ͱൃੜ͢Δύλʔϯ΍όονͳͲ͋ΔͷͰ)

    View Slide

  64. ͦͷ্Ͱటष͍ਓྗ͕ॏཁ
    • ػցతʹ΍ͬͯ΋ॏཁͳURLΛऔΓ͜΅͠·͢
    • ϩά͸ػցత߈ܸͳͲͰԚΕͯΔͷͰΫϨϯδϯά΋ॏཁͰ͢
    • खಈςετ(QA)ͯ͠Δਓͱක͖ͭͰ֬ೝ͢Δ
    • ຊ෺ΛΑ͘ݟΔɺΑ͘৮Δ
    • ʮ΋ͱ΋ͱյΕͯͨʯʮͦΜͳػೳ͸ແ͍ʯ͜ͱ΋Α͋͘Δ
    • (͜ͷ͋ͨΓͰɺੵۃతͳνʔϜମ੍ɾԠԉ͕ͳ͍ͱΩπ͍)

    View Slide

  65. ूܭ͠Α͏ʂ
    • access.log.gz Λ֬อ͢Δʢ͜͜Ͱ͸֬อͨ͜͠ͱʹ͠·͢ʣ
    • alp (https://github.com/tkuchiki/alp) ʹύλʔϯ෇͖Ͱྲྀ͢
    • ͜ΕͰύλʔϯήοτͩͥʂ
    • (alpͷDL΍LTSVग़ྗઃఆ͸ alpͷαΠτࢀর)

    View Slide

  66. ࣮ߦྫ (௕͍)
    $ gzip -dc access.gz.* | head -10000 |grep -v "/ignore/pattern"| \
    alp ltsv -m "/i/.+,/static/.+,/assets/.+,/item/search/.+,/wordpress/.+,/item/tag/.+,
    /item/detail/.+,/cto/diary/.+,/img/.+,/news/page/.+,/rss/some_one/.+,
    /some_great_page/.+,/campaign_2021/.+,/html/.+,/api/hoge/.+,/ultra-nice-page/.+,
    /you-and-me-relation/.+,/apple-touch-icon.+,/wp-content/.+,/some-creative/.+,
    /company-map/.+,/mail/form/.+,/too-many/.+,/already/im-tired/.+,/but-on/going/.+,
    /nice_feature/(css|font|js)/.+,/too/old/pages/.+,/product/thumbnail/.+,/&unknown_something=.+,
    /wow/what-is-this-page/.+,/detail/get/.+,/we-must-go-php-8/plan/.+,/we-must-go-php-8/do/.+,
    /we-must-go-php-8/c-is-what/.+,/we-must-go-php-8/i-dont-know-i/.+,
    /already/dead/page/(css|font|js)/.+,/2001-future-travel/(css|font|js),/php4/(css|font|js),
    /php/5/.+,/php/(7|8)/.+,/php/6/.+,/controll/panel/(css|js),/admin/.+,/api/get-json.+,
    /api/post-json.+,/api/another-json.+,/articles/admin/.+,/articles/page/.+,/articles/tags/.+,
    /wp2/.*,/special-april-fool-page/.+,/_nuxt/.+,/wp-includes/.+,/x/.+,/index.php.+,/css/.+,
    /js/.+,/img/.+,"
    -o 2xx,3xx,4xx,5xx,method,uri --sort=uri |grep -v -e "/some/" -e "/attack" -e "/%20../../../pattern"
    > output.txt

    View Slide

  67. View Slide

  68. • ࣾ಺Ͱ͸ڞ༗͓ͯ͠Γ·͢ͷͰɺ͝ཡ͍͚ͨͩ·͢
    • (·ͩΫϨϯδϯάதͳͷͰɺ͙͢ʹࢀߟʹ͸ͳΓ·ͤΜ͕)

    View Slide

  69. ISUCONͷͱ͖ͷྫͰ͢

    View Slide

  70. gzipͷ··ѻ͏
    • ϩάϑΝΠϧ͸ڊେɺgzipʢ.gzʣঢ়ଶͰ͔͋ͭ͏ͱָ
    • ϩάϑΝΠϧ͸̍ͭʹ͢Δඞཁͳ͍ɺ෼ׂͨ͠··ͰΑ͠
    gzip -dc * |alp
    ޻෉ͯ͠xargs͔ͭ͑͹ฒྻʹ΋Ͱ͖ͳ͍͜ͱ΋ͳ͍
    • (࠶ܝ)ϞμϯʹBigQuery΍Athena…ͱ͍͍͍ܰͨ͘Ͱ͕͢ɺશһ
    ͕ແ৺ͰʮͰ͖Δʯʹ͸ૉ๿ͳํ͕ྑ͍ͷͰഎ৳ͼ͸μϝ

    View Slide

  71. લॲཧͷϑΟϧλ
    • headΛ͔ͭͬͯɺͩΜͩΜͱॲཧൣғ޿͛Δͱࢼߦࡨޡָ͕
    • grep -vΛ͔ͭͬͯɺʮΰϛΛ͋Δఔ౓ࣺͯΔʯͱָ

    View Slide

  72. alpͷίπ
    • headͰॲཧߦ਺Λ੍ݶͭͭ͠ύλʔϯΛάϧʔϓԽ͍ͯ͘͠
    -m "/controll/panel/(css|js),/assets/.+" ύλʔϯࢦఆ
    --sort=uri͢Δͱ·ͱ·ΔͷͰɺύλʔϯࢦఆָ࣌ʹͳΔ
    • ύλʔϯ͸͔ͳΓ૿͑ͯ΋alp͸଎͍͕ɺσϑΥϧτͰ͸5000௒
    ͑Δͱࢭ·Δ͠ɺੵۃతʹߜΖ͏
    • ࠓճԠ౴଎౓͸ෆཁͳͷͰɺग़ྗΛઃఆ
    -o 2xx,3xx,4xx,5xx,method,uri

    View Slide

  73. • status:404ͷύλʔϯΛແࢹ͢Δͷ͸஫ҙ͕ඞཁɺͦ͏͍͏API
    ͔΋͠Εͳ͍͔Β
    • ઈରʹଘࡏ͠ͳ͍(ଘࡏ͠ͳ͍PhpMyAdmin΁ͷΞΫηεͱ͔…)
    ͸͍Βͳ͍ͷͰࣺͯΔ͕ɺ࠷ޙʹࣺͯͨ΄͏͕ྑ͍
    • ॲཧʹ͸ɺ͘͢͝ʢ਺࣌ؒʙʣ͕͔͔࣌ؒΔͷͰڧ͍ܭࢉࢿݯ
    ͕ඞཁͰ͢ɻฒྻԽ΋͍ͨ͠ॴͰ͢ɺͨͩɺ࿩͕௕͘ͳΔͷͰ
    লུ
    (΍͸ΓBigQuery΍Athe(ུ))

    View Slide

  74. Ͱɺ࣮ࡍͷϑΝΠϧͱಥ͖߹Θͤ
    • ಥ͖߹Θͤͯɺʮແ͍ʯURI͸ফ͠ࠐΜͰ͍͘
    • ϑΝΠϧ͸͋Δ͕ΞΫηε͕ͳ͍ͳΒʮσουίʔυʯ͔΋ʁ
    • ফ͢͜ͱ͕ݕ౼Ͱ͖·͢Ͷʂ
    ʢͨͩ͠ɺຊ౰ʹফ͔͢͸৻ॏʹʣ
    • ͨͩɺ΄͔ͷίʔυ͔Βͷinclude͸ݩΑΓɺrewriteͳͲͰURL
    ͕ม׵͞Ε͍ͯΔ͜ͱ΋͋ΔͷͰ஫ҙ(.httaccess΍httpdͷઃ
    ఆΛνΣοΫ͠·͠ΐ͏)

    View Slide

  75. ࿩໭) Ϧετ͕Ͱ͖ͨΒɺςετέʔεΛ࡞Δ
    • ͜ͷ࣌఺Ͱ͸GETܥ͚ͩͰΑ͍͔Βॻ͖͖Δ
    • ͳΜͷຐ๏΋ͳ͍ɺςετίʔυΛॻ͘(αϯϓϧ͸ผ్)
    • ޻෉͸Ͱ͖Δ͔΋͠Εͳ͍͕ɺͱʹ͔͘ແ৺Ͱ࡞Δ
    • (ςετͷςετɺݱߦʹྲྀͯ͠Fail͠ͳ͍͜ͱΛ֬ೝ͢Δ)

    View Slide

  76. Ͱ͖ͨΒͲΜͲΜྲྀͯ͠ͲΜͲΜ௚͢
    • ςετ͕Ͱ͖ͨΒɺ؀ڥΛ͖ͨͨ·ͬͯ͘ݕূ͢Δ
    • मਖ਼ͨ͠Β·ͨୟ͘
    • GETܥͳͷͰɺԕྀͳ͘ແݶʹୟ͘
    • ΨϯΨϯ௚͢
    • ͳΜ͔ϧʔϧ͕ͨΓͯͳ͚Ε͹ิॆ͢Δ
    • ·ͨյΕΔͷͰͳ͓͢ɺԆʑͱ܁Γฦ͢…

    View Slide

  77. POST͸ʁ
    • POSTܥΛ௚͢ͷ͸GETܥͷޙͰΑ͍
    • ͳΜͳΒɺPOSTܥ͸൒෼ख࡞ۀͰ΋ྑ͍ʢن໛ʹΑΓ·͢ʣ
    • ಛʹ؅ཧը໘ͷࡉ͔ʔ͍৔ॴ͸໢ཏ͕ͭΒ͍ͷͰɺ
    ଟগࠩͬҾ͍ͯ΋ྑ͍ʢྑ͍ͷ͔ʁʣ
    • ͱ͸͍͑ϦΫΤετΛద੾ʹૹΕ͹ɺ
    POSTͱGET͸खؒͷࠩͳͷͰॻ͘ɺॻ͖·͘Δɻ
    • (CSRF tokenΈ͍ͨͳͷ͸΋͏ζϧͯ͠ݻఆ͠·͠ΐ͏)

    View Slide

  78. ͦͷ্Ͱʂ
    • ʮϩάΠϯͯ͠ॴఆͷJSμΠΞϩάΛΫϦοΫͯ͠
    ͜ͷૢ࡞Λͯ͠CookieΛҭͯͯϩάΞ΢τͯ͠໭ΔϘλϯʯ
    • Έ͍ͨͳಛघέʔεͷͨΊ͚ͩʹ
    ϔουϨεϒϥ΢βͳͲͷπʔϧΛʮ΍ͬͱʯಋೖ͢Δ
    • ͓͠ΌΕͳE2Eςετπʔϧ͸จݙ΋ଟ͍͠ɺ
    ͜͜·Ͱͷܦݧ͕͋Ε͹ɺͲ͏ʹ͔ͳΔ͸ͣͰ͢

    View Slide

  79. ͩ͜ΘΓͰखΛࢭΊͯ͸μϝ
    (ओ؍Ͱ͢)
    ಓ۩ΛબͿΑΓɺ׬ྃͤ͞Δɻ
    ʮऴΘΒͳ͍ʯͱ͍͏ѱເ͕͘ΔͷͰ

    View Slide

  80. ୟ͔ΕΔಓ۩
    ୟ͘ಓ۩ͷ࣍͸ɺୟ͔ΕΔಓ۩Ͱ͢
    (࣮ࡍ͸ୟ͘ಓ۩ͱ͋Δఔ౓ಉ࣌ʹ࡞Δͱྑ͍Ͱ͠ΐ͏)

    View Slide

  81. αϯυϘοΫεΛ࡞Δ
    • PHP͚ͩͰͳ͘ɺͰ͖Δ͚ͩϛυϧ΢ΣΞ΋૝ఆʹἧ͑Δ
    • ґଘ͢ΔϥΠϒϥϦʢcurlͱ͔libjepgͱ͔ʣ΋ؤுΔ
    • (ಉҰArchͷLinuxͳΒɺόΠφϦίϐʔ͢Δ౳΋͋Γ͏Δ)
    • σʔλ͸ඞཁͳൣғͰɺʮ͋Μ·Γେ͖͘ͳ͍Α͏ʹʯ͢Δ
    (ແ࿦ຊ൪ಉ༷͕޷·͍͕͠ɺςετ଎౓ʹӨڹ͕ग़΍͍͢͠ɺ
    ੾Γ෼͚΋͠ΜͲ͍)

    View Slide

  82. (؀ڥΛ)ԿͰͭ͘Δ͔ʁ
    • ·͋ɺDocker(-compose)͕ศརͳͷ͕ͩ…
    • ͋·Γʹ΋ݹ͍؀ڥͩͱɺී௨ͷVM͕ศརͳ৔߹΋͋Δ
    (ݹ͍σΟετϦϏϡʔγϣϯΛरͬͯ͘ΔͳͲ)
    • php.ini΍httpd.conf ౳΋मਖ਼͢Δࣄ͕ଟ͍ͷͰɺ
    ফ͑ΔͱࠔΔͷͰɺͦΕΒ΋Ϛ΢ϯτ͠git؅ཧ͕Nice
    • ͜ͷ͋ͨΓ͸ݱ৔ʹΑΓ·͢͠ɺ΍Γͳ͕Βߟ͑Δ

    View Slide

  83. • (mysql/)data ౳΋VolumeͰϚ΢ϯτͨ͠΄͏͕ૣ͍
    ͋Δ͍͸ɺ಺෦Ͱ tar.gz Λղౚ͠ɺຖճ্ॻ͖͢Δɻ
    • σʔλϦηοτͷͨΊʹ࠶౓SQLΛྲྀ͢ΔΑΓɺ
    dataΛσΟϨΫτϦ͝ͱ্ॻ͖ͯ͠࠶ىಈ͕ૣ͍
    • ͜Ε͸ͦͷଞͷσʔλ΋ಉ༷ɺॳظԽ͕ߴ଎ʹͰ͖Δํ͕ྑ͍
    • (ͦͷͨΊʹ͸ɺσʔλΛ֎͔Βݟ͑ΔΑ͏ʹͨ͠΄͏͕ศརɺ
    ͨͩɺLinuxҎ֎͸஗͍ΜͩΑͳ…)
    • (͜ͷσʔλ͸gitʹ͍Εͳͯ͘΋ྑ͍ɺೖΕͯ΋͍͍͚Ͳ)

    View Slide

  84. ·ͣ͸ݱࡏͷ֬ೝͷͨΊʹʰݱߦʱΛ࡞Δʢਅ݋ʣ
    • ΤϥʔΛશ༗ޮɺ͔ͭදࣔʹ΋ͩͯ͠͠·͏ɺPHP͸ศར
    • ͢Δͱݩʑ͋Δʮແࢹ͍ͯ͠ΔΤϥʔʯ͕ग़Δ৔߹͕͋Δ
    • ͱ͍͏͔ɺेதീ۝ແࢹ͍ͯͨ͠Warning΍Notice΍Strict΍
    Deprecated͕ͰΔ
    • ·ͣɺ͜ΕΛ௚͢
    • @Ͱ҆қʹΤϥʔΛѲΓͭͿͯ͠Δॴ΋ɺ౰વʂશ෦ʂ௚͢ʂ

    View Slide

  85. ʮ͸͍ɺ͜͜Ͱ͸࣏ͬͨ͜ͱʹ͠·͢Ͷʯ

    View Slide

  86. ΍ͬͱʮ৽؀ڥʯαϯυϘοΫεΛͭ͘Δ
    • ͜͜Β΁Μ͸ݱ৔ݱ৔͕͋ΔͷͰɺͲ͏͜͏͸ͳ͍
    • ϙʔτ൪߸͔IPΛม͑ͯɺલޙΛಉ࣌ʹ্͛ΒΕΔͱͳ͓ྑ͍
    • ࠷ॳ͔Βʮ࠷ऴ஍఺ʯͷPHPόʔδϣϯʹ͢Δͷ͸Ή͔͍ͣ͠
    • Ұؾʹ͋͛ͯɺڊେʹյΕΔͱɺ௚͢ͷʹফ໣ͯͭ͠Β͍
    • ॱ൪ʹ্͛ΔɻݩʑҰؾʹߦ͚ΔίʔυͳΒτϯτϯͱ͢͢Ί
    Δ

    View Slide

  87. (࠶ܝ)Ϗοάδϟϯϓ͸೉͍͠
    • v4΍v5.1.6͔Β௚઀v8.0͢ΔͳΜͯલ୅ະฉ(࡞Γ௚͠Ͱ͸ʁ)
    • શ͘ಈ͔ͳ͍··Nϲ݄͋Δ͍͸N೥ܦա͢Δ౳͸ਏ͍
    • ྫ: v5.1.6 ▶ v5.3.3 ▶ v5.4 ▶ v5.6 ▶ v7.1 ▶ v7.4 ▶ v8…
    • ϛυϧ΢ΣΞ΋্͍͛ͯ͘(ྫ: MySQL v5.1 ▶ v5.6 ▶ v8ͱ͔)
    • (Deprecatedίʔυ͔ΒDeprecatedίʔυʹ͢Δͷ͸ਏ͍ͷͰɺ
    ੩తղੳ͚ͩ͸7.4ઃఆͰ౎౓࣮ࢪ༷͠ࢠΛݟΔͷ͸Good)

    View Slide

  88. վम࡞ۀ

    View Slide

  89. ͋͞ɺϚΠάϨʔγϣϯ࡞ۀͩʂ
    (ଟগॱং͸લޙ͠·͕ͨ͠)
    ४උͷ࿩͹͔ͬΓͩͬͨ͠ɺ͍ͭʹ࡞ۀͩʂ

    View Slide

  90. ࠷ॳʹ࢒೦ͳ͓஌Βͤ
    • ʮ͍͢͝πʔϧΛڭ͑ͯԼ͍͞ʂʯʮຊԻΛ͍͏ͱɺແ͍ʯ
    • ʮษڧ͠·͢ʂຊΛ͍ͩ͘͞ʂʯʮਖ਼௚ʹ͍͏ͱɺແ͍ʯ
    • ʮ΍ΓํΛڭ͑ͯԼ͍͞ʂʯʮͿͬͪΌ͚͍ͯ͏ͱɺແ͍ʯ
    • ͋ΔͳΒɺ୭΋ࠔͬͯͳ͍ΑͶɺϋϋϋʂʂʂʂ
    • (ੈʹ͋Δͷ͸ɺେ఍ΞϓϦઃܭͷϦϑΝΫλϦϯάͷຊͰ͢)

    View Slide

  91. ͦΕͰ΋੩తղੳπʔϧ͸͋Γ·͢
    • ྫ(͜ΕҎ֎ʹ΋৭ʑ͋Δ):
    • PhpStorm
    • https://github.com/wapmorgan/PhpDeprecationDetector
    • https://github.com/phan/phan
    • https://github.com/phpstan/phpstan
    • ʮͲΕ͕ਖ਼ղͰ͔͢ʁʯ
    ʮݱ৔(ର৅ίʔυ)ʹΑΔɺਖ਼ղ͸ͳ͍ͷͰશ෦ࢼ͢ʯ

    View Slide

  92. • ʮͳΜ͔ɺPHP>=7.2ͬͯ͋Γ·͕͢ʁʯ
    ʮͦ͏ɺπʔϧ΋ݹ͍PHP੾ͬͯΔΜͩΑͶɺϋϋϋʯ
    • ݹ͍όʔδϣϯΛ࣋ͬͯ͘Δ͜ͱ͸Ͱ͖Δ
    ʢGitHub౳ʹײँʣ
    • ͳ͓ɺղੳπʔϧࣗମ͸࠷৽PHPͰಈ͔ͯ͠΋ྑ͍
    ʢ͜ͱ͕ଟ͍͠ɺ࠷৽PHPͷ΄͏͕அવߴ଎ʹॲཧͰ͖Δʣ
    • ͨͩ͠ɺࢲ͸ͲΕ΋৴͓ͯ͡ΒͣɺࢀߟʹͱͲΊ͍ͯΔ

    View Slide

  93. ੩తղੳʹ͸ݶք͕͋Δ
    ݱ࣮ͷ໰୊͸ݕ஌͕ࠔ೉

    View Slide

  94. View Slide

  95. ͋͘·Ͱެ͔ࣜΒҾͬு͖ͬͯͨྫͰ͢
    • ഑ྻॱংͷʮظ଴ʯΛཪ੾Δڍಈɺͨͱ͑͹ॱং͕มΘΔ
    • લड़͸ʮҧ๏Ͱ͸ͳ͍ʯͷͰ͔͔Βͳ͍(ͱࢥ͏ɺଟ෼)
    • PHP͸ஸೡͳͷͰ(?)ϚΠάϨʔγϣϯࢦಋʹ͸͋Δ
    • https://www.php.net/manual/ja/appendices.php
    • (ಡΜͰʮݟ͚ͭΒΕΔ༷ʹͳΔʯΘ͚Ͱ͸ͳ͍͕
    ݟ͚ͭͨޙʹʮղΔʯͨΊʹ͸ͱͯ΋खॿ͚ʹ͸ͳΔ)

    View Slide

  96. ༨ஊɿڍಈͷ֬ೝʹ͸ xdebugʢσόοΨʣ
    • ͜Ε͸੩తղੳΑΓඞਢɺPhpStormͱ࿈ܞͤ͞·͠ΐ͏
    • σόοΨ͕ݏ͍ͳਓ͸޷͖ʹͳͬͨ΄͏͕ྑ͍
    • Ͳ͏ͯ͠΋ίʔυ͕ҙਤ͢Δڍಈ͕ཧղͰ͖ͳ͔ͬͨΓ
    ڍಈͷ͕ࠩͰΔͳΒɺεςοϓ࣮ߦ͔͠ͳ͍
    • (print debug͸ʮۃكʹʯڍಈ͕มΘΔͷͰ͓קΊ͠·ͤΜ)
    • σόοΨͷͨΊʹࡾ߲ԋࢉࢠΛల։͢Δɺ౳ͷ޻෉͸͋Γ·͢
    (յ͞ͳ͍Α͏ʹɺ৻ॏʹ…)

    View Slide

  97. ࿩Λ໭͢: ੩తղੳ͸ۜͷ஄ؙͨΓಘͳ͍
    • DeprecatedΛ୳͢πʔϧ͸͋Δ͕ɺ׬ᘳͰ͸ͳ͍
    • جຊతʹʮྑ͍ίʔυʯΛαδΣετ͢Δ΋ͷ͕ଟ͘ɺ
    ϨΨγʔίʔυʹ͔͚ΔͱɺແݶʹαδΣετ͞ΕͯṆΕΔ
    • ੲͷಈతʹincludeଟ༻౳͸ਪ࿦ग़དྷͣʹΤϥʔʹͳΔ
    ʮݟ͔ͭͬͨʂʯͱۦ͚دͬͯ΋ɺͦΕ͸ΤϥʔͰ͸ͳ͍
    (੩తղੳͷΤϥʔͱ͍͑Δʣ
    • (ۦ͚دͬͯϦϑΝΫλͯ͠͠·͏᠘ʹ͔͔Δਓ͕ଟ͍)

    View Slide

  98. ໃ६͢ΔΑ͏Ͱ͕͢πʔϧ͸࢖͑Δ
    • ʮ͓͔͘͜͜͠ͳ͍ʁʯͱݴΘΕΕ͹౰વḿΔ
    • ͔͠͠ɺमਖ਼͢΂͖͔͸੩తղੳπʔϧ͕ܾΊΔॴͰ͸ͳ͍
    • ੩తղੳπʔϧͷܯࠂΛ௵͢ࣄ͕໨తͰ͸ͳ͍
    • ͜͜Λؒҧ͑ͨΓɺ৴པ͗ͯ͢͠᠘ʹϋϚΔਓ͕ଟ͍
    • ҆қͳAuto fixͳΜͯ΋ͬͯͷ΄͔
    • (ͲͪΒ͔ͱ͍͑͹ʮͲ͜·Ͱແࢹͯ͠ྑ͍͔ʁʯͷํ͕ॏཁ)

    View Slide

  99. ʮπʔϧ͕ͳ͍ͳΜͯʂͲ͏͢Ε͹…ʂʂʯ
    • طଘͷڍಈ͕(PHP౳ͷ)όάલఏͷίʔυ΋كʹ͋Δ
    • (ಛʹจࣈྻݕূ΍഑ྻૢ࡞౳ͰΤϥʔΛ௚͢ͱյΕΔྫ)
    • օ͞Μɺ΋͏͓Θ͔ΓͰ͠ΐ͏͕…
    • ͦ͏ɺE2Eςετ͢Δ͔͋͠Γ·ͤΜͶʂ
    • ؤுΓ·͠ΐ͏
    • ʢ͜Ε͸৑ஊͰͳ͘ɺ୯ͳΔࣄ࣮Ͱ͢ʣ

    View Slide

  100. !
    < ؤுͬͯςετ͠Α͏Ͷʂ
    (ʮPHPͷεϖγϟϦετͱݺ͹Εͯདྷͨਓ͕ؒ͜͏ൃݴͨ࣌͠ʯʹࢲ͕Α͘ݟΔݱ৔ͷօ͞Μͷإ)
    !"#$%&'()*+
    ʢܦݧ্ͨ͠Ͱɺຐ๏͸ͳ͍ΜͩͱԶ͸ݴ͍ͬͯ·͢ɺ͋Δ͍͸ຐ๏࢖͍ͷํΛޏͬͯ͘Εʣ

    View Slide

  101. ༨ஊɿPhpStormͰͷ੩తղੳͷ͔͚ํ
    • PhpStormͷCode inspection͸࢖͑ΔͬͪΌ࢖͑Δ
    • 1. PHPͷر๬͢ΔόʔδϣϯΛઃఆ͢Δ
    • 2. ϧʔϧΛΧελϜ͢Δ
    (HTML΍CSSͷΤϥʔΛΦϑʹ͢Δ)
    (৭ʑ͋ΔPHPͷ߲໨΋ؤுͬͯߟ͑ͯΦϯΦϑ͢Δ…)
    (໪࿦ɺ͜͜ʹ΋ʮਖ਼ղʯ͸ͳ͍)
    • 3. ͍͕͔͔࣌ؒͬͯ͢͝ɺେྔʹͰͯ͘Δ

    View Slide

  102. ͔͞Ͷ͍͍ͯ·͕͢
    • ʰError਺ઍɺWarn਺ສɺޡݕ஌͋ΓʱͰ͋ͬͯ΋੩తղੳ͸ศ
    རͰ͢ɺඞܞͰ͢
    • ͨͩɺखΛҾ͔Εͯݴͬͨઌ͸Τϥʔ͡Όͳ͔ͬͨΓόʔδϣ
    ϯΞοϓʹؔ܎ͳ͍ϦϑΝΫλϦϯάͩͬͨΓ͠·͢
    • ͪͳΈʹʮϞμϯͳίʔυʯʹͳΔͱ੩తղੳ͕όοοΩόΩ
    ʹޮՌΛൃش͠ɺແݶͷϝϦοτ͕੒बͰ͖ɺΤϥʔ΋Auto fix
    ΋΄ͱΜͲؒҧ͍ͳ͘ͳΓ·͢ɻ
    ͔͠͠ϨΨγʔίʔυͰ͸ແཧͳΜͰ͢Αɺͼͬ͘Γ͠·͢

    View Slide

  103. ϋοϋοϋɺ͜Ε͕ຊ౰͔ͩΒࠔΔ
    ʢϨΨγʔγεςϜվળϚϯ΁ͷΤʔϧʣ
    ʮେৎ෉ɺσϓϩΠͪ͠Ό͑͹
    ɹશһΛר͖ࠐΊΔͧʯ
    ʢͭ·Γͬ͞͞ͱ΍͚ͬͭͯ͠·͑ʣ

    View Slide

  104. ࣮ࡍͲ͏΍ͬͯίʔυΛ௚͍͔ͯ͘͠ʢ΍ͬͱʂʣ
    • ςετΛճ͢ ▶ ௚͢ ▶ ςετΛճ͢ ͜Εͷ܁Γฦ͠ʢ࠶ܝ
    ࡌʣ
    • खΛͱΊͳ͍ɺͲΜͲΜΞυϗοΫʹॻ͖௚͢
    • ؾʹͳͬͨΒɺͱΓ͋͑ͣ ʮ// TODO ͕͜͜Ϡό͍ʯ
    ͱ͔ॻ͍ͯɺ͙͢ʹ๨Ε·͠ΐ͏ɻ
    • σάϨΛڪΕͯ͸ͳΒͳ͍ɺͦͷͨΊʹςετ͕͋Δ
    • ͨͩ͠ʮςετ͕յΕͳ͍ͳʁʯͱ͓΋ͬͨΒςετ΋ٙ͏ࣄ

    View Slide

  105. ίϛοτཻ౓ʹ͍ͭͯ
    • ςετΛճ͢౓ʹίϛοτ͢Δ͘Β͍ͰΑ͍
    • ͢Δͱʮ֬ೝʯͱ͔͍͏ίϛοτ͕ͨ͘͞ΜͰ͖Δ
    • ͔͠͠೰ΜͰԕྀͯ͠ɺ΋Ͳͤͳ͍ͷ͕Ұ൪ͭΒ͍
    • Ͳ͏ͤσάϨ΋ൃੜ͢Δ͠࡞ۀϒϥϯνͷϩά͸ఘΊΔ΂͖
    • ͜ΜͳॴͰετϨεΛ૿΍͢΄͏͕ͭΒ͍
    • Ͳ͏ͯ͠΋commit log͕ؾʹͳΔͳΒ git squash

    View Slide

  106. ϓϧϦΫʹ͍ͭͯ
    • ಛʹӨڹൣғ͕޿͍ʮڞ௨ίʔυʯΛ௚͢৔߹
    ͬͪ͜Λ௚͢ͱɺ͕͋ͬͪյΕΔͱ͍͏͜ͱ͕͋Γ·͢
    • ʮڞ௨ίʔυʯΛආ͚ͯͱΓ͔͔ͬͨ୺ͬ͜ͷίʔυ͕
    ڞ௨ίʔυʹࠜͨ͟͠όάʹؔ࿈͢Δ͜ͱ΋ଟʑ͋Γ·͢
    • ݁ہ௚͢ඞཁ͕͋ΓʮϓϧϦΫཻ౓ʯ͕໓஡ۤ஡ʹͳΓ·͢
    • ͢ΔͱϨϏϡʔɺίϛϡχέʔγϣϯίετ͕૿େ͠·͢
    • ʢ͜Ε͸ݱ৔ʹΑΓ·͢ɺͦ͏ͳΒͳ͍ίʔυ΋͋Δʣ

    View Slide

  107. • ͳͷͰʮͰ͖Δ͚ͩʯڞ௨ίʔυΛઌʹ௚ͨ͠΄͏͕ྑ͍
    ͦͷͨΊ͚ͩʹɺ؆୯ͳϢχοτςετΛॻ͘৔߹΋͋Γ·͢
    • ͔ͦ͠͠Ε͸ཧ૝࿦ͳͷͰɺ͏·͘ߦ͔ͳ͍ࣄͷํ͕ଟ͍
    τοϓϖʔδͷখमਖ਼͕ɺDBपΓͷίʔυ·Ͱ͍͘͜ͱ͕͋Δ
    • ΍Γͳ͓͢΂͖͔ʁ͍΍ɺࢲ͸ׂΓ੾ͬͨ΄͏͕ྑ͍ͱࢥ͏
    • The done is better than a perfect.
    • (͜Ε͸खൈ͖͠Ζɺͱ͍͏͜ͱͰ͸ͳ͘ɺ
    ʮඒ͠͞ʯͱ͔͸ϦϑΝΫλϑΣʔζʹ͠Ζͱ͍͏͜ͱͰ͢ʣ

    View Slide

  108. ༨ஊɿʮͳΜ͔ߥʑ͍͠ҙݟଟ͘ͳ͍ʁʯ
    • શ͕ͯॱௐεϚʔτʹͰ͖ΔͳΒɺ΋͏8ʹ·Ͱ্͍͛ͯΔ͸ͣ
    • όʔδϣϯΞοϓͬͯͷ͸ɺੑ࣭͕Ԍ্Ҋ݅ʹ͍ۙ
    • ͋͘·Ͱ͜Ε͸ʮࢲͷҙݟʯͳͷͰɺPR TIMES͞Μʹ͓͍ͯ͸
    ৭ʑ·͋ௐ੔ͨ͠ΓͳΜͩΓ͢Δͱ͓΋͍·͢

    View Slide

  109. ࿩Λ໭ͯ͠: ϩάͷΤϥʔΛ௵͍ͯ͘͠
    • (࠶ܝͰ͕͢)
    • ϩάΛE_ALLʹͯ͠ɺΤϥʔΛશ෦௚͍ͯ͘͠
    Fatal, Error, Warn, Notice, Deprecated, Strict.
    • PHPͷΤϥʔ͸શͯҧ๏ ɺVerUPʹ΋΄΅༗֐ɺશ෦ରԠ͢Δ
    • ׂͱօ͞ΜΤϥʔແࢹ͕͕ͪͩ͠ɺແࢹͯ͠͸ͳΒͳ͍ɺ
    DeprecatedͳΜͯݟ͚ͭͨΒϥοΩʔνϟϯεͱݴ͑Δ
    • (ͳ͓ɺΞϓϦͷʰσόοάϩάʱ͸अຐͳͷͰΦϑ͠·͠ΐ

    View Slide

  110. ໪࿦ϥΠϒϥϦ΋յΕΔͷͰରԠ͢Δ
    • όʔδϣϯΛ্͛Δɺ୅ସΛ୳͢ɺແ͚Ε͹࡞Δ
    • ͋Δ͍͸ʮforkͯ͠ಈ͘Α͏ʹ͢ΔʯɺOSS࠷ߴʂ
    • (༗໊FWमਖ਼ΑΓɺΦϨΦϨ/ࣗࣾFWͷํ͕·ͩখܕͳ෼ָ)
    • Ϟσϧɺσʔλ૚पΓͩͱɺ͔ͳΓؾ߹͕͍Δ
    • ͜Ε͸ݱ৔ʹΑΓ·͢

    View Slide

  111. ࠩ͠ସ͑ʹඞཁͳϦϑΝΫλϦϯά͸ΏΔ͞ΕΔ͔ʁ
    • ʮϦϑΝΫλϦϯά͢Δͳʯʹҧ൓ͯ͠Α͍͔ʁ
    • ʢԾʹɺͲΕ΋PHP8·Ͱʮಈ͘ʯͱͯ͠…ʣ
    • Aʮ݁ߏϦϑΝΫλϦϯάͯ͠ɺ৽͍͠෺Λ࢖͏ʯ
    • Bʮमਖ਼ൣғ͕গͳ͍͕ɺগʑݹΊ͔͍͠෺Λ࢖͏ʯ
    • CʮϥΠϒϥϦΛWrapͯ͠ɺࠓͷϨΨγʔίʔυʹ߹Θͤ
    Δʯ

    View Slide

  112. յΕ͍ͯͳ͍͕͘͢͝ݹ͍ϥΠϒϥϦ͸ʁ
    • ݹͯ͘ɺ੩తղੳ͕ΤϥʔΛͩ͠·͍ͬͯͯ͘ɺηΩϡϦςΟ
    తʹ΋Α͘Θ͔Βͳͯ͘ɺ഑෍ݩ͕௵Ε͍ͯͯɺͰ΋ಈ͘
    • ΋͏ਖ਼ղ͸Θ͔Γ·͢Ͷʁ
    • ͍·͸৮Βͳ͍
    • ͦΕ͸όʔδϣϯΞοϓͱؔ܎͕ͳ͍
    • (ผͰࠩ͠ସ͑ͯɺrebase͢Δͱ͔͸͋ΔͰ͠ΐ͏͕)

    View Slide

  113. ։ൃϒϥϯνͷ৽نػೳͷ௥ैʹ͍ͭͯ
    • ͜Ε͸ݱ৔ʹΑΔͷ͕ͩ…
    • ৼΓग़͠ײ͕ͭΒ͍ΑͶɺΘ͔Δ
    • ϨΨγʔίʔυ෦෼ͷϦϑΝΫλ͚ͩ͸΍Ίͯ΋Β͏
    • ʮਵ࣌Ϛʔδ͕Ͱ͖Δͱ͍͍Ͱ͢Ͷʯʢئ๬ʣ
    • ςετॻ͍ͯཉ͍͕͠ɺڠྗ౓ɺཧղ౓ɺमཏ৔౓ʹΑΔ
    • ·͋ɺఘΊ͕ॏཁɻऴΘΓΑ͚Ε͹શͯྑ͠

    View Slide

  114. େମͰ͖ͨΒ
    • ਓྗͰ΋͕Μ͹ͬͯνΣοΫ͢Δ
    • શһͰ΍ΔɺશһʹؔΘΒͤΔ
    • ͳʹͤɺμϝͩͬͨΒશһ͕ਏ͍ͧʁ
    • ςετൈ͚͕Έ͔ͭͬͨΒɺඞͣͦΕΛςετʹ௥Ճ͢Δ
    • ʮ΋͏σϓϩΠ͠Α͏Α…ʯϨϕϧ·Ͱ͏Μ͟ΓͰ͖ͨΒ…

    View Slide

  115. ʮδΣϩχϞʂʂʯ
    (σϓϩΠ͢Δ࣌ͷֻ͚੠)
    Jump in!!!!

    View Slide

  116. • ౓ڳҰൃɺຊ൪ͷόʔδϣϯΛ্͛ͯσϓϩΠͯ͠ΈΔ
    • (ͪΌΜͱ͢ΔͳΒɺΧφϦΞσϓϩΠ͢Δ)
    • ΋͠ʮଟগͷෆ۩߹ʯͰಈ͘Έ͍ͨͳΒɺ
    (൑அ͕೉͍͕͠…)੎͍Ͱͦͷ··͍ͬͨ΄͏͕ྑ͍(ਅإ)
    • ͓஌Βͤʹܝࣔͭͭ͠ඞࢮʹ௚͢λʔϯͰ͢

    View Slide

  117. ຊ൪͸࠷ߴͷςετ؀ڥͳͷͰ
    • ແݶͷςετ͕ߦΘΕɺແݶͷόάϨϙ͕͖ͯخ͍͠(?)
    • ுΓ෇͖ͰPHPͷΤϥʔϩάΛݟΔ
    • ඞࢮʹ௚͢
    • ຊ൪͔ͩΒɺશһͰରԠ͠Α͏ʂʢসإʣ
    • (͜͜Ͱࢄʑͳ໨ʹ͋͏ࣄ͕͋Γ·͕͢ɺؤுΖ͏)

    View Slide

  118. ʮਫ਼ਆ࿦͡ΌͶʔ͔ʂʯ
    • ೔ৗʹվળϑϩʔ͕ग़དྷΔ·Ͱ͸ ͜͏ͳΔͰ͠ΐ͏
    • δϟϯϓͷͨͼʹHP͕࡟ΕΔͷͰɺ୔ࢁ͢ΔͱͭΒ͍
    • ͔͠͠δϟϯϓ͠ͳ͍ͱઌʹਐΊͳ͍
    • δϟϯϓͪ͠Ό͑͹ɺҊ֎Ͳ͏ʹ͔ͳΔ(ָ؍࿦)
    • ා͕ͬͯσϓϩΠ͠ͳ͍ͷ͕Ұ൪΍͹͍ͬͯ
    ͦΕΈΜͳݴͬͯΔ͔Β

    View Slide

  119. ଓ͘…
    • ʮ΍ͬͨͬʂୈҰ෦׬ʂʂʯ
    • ͔࣍͠͠ͷڧఢ͕ଈ࠲ʹొ৔͢Δ…
    • ʮԶ͸όʔδϣϯΞοϓͷಓΛ্Γ࢝Ίͨ͹͔Γͩͥ…ʂʯ
    • ׬…

    View Slide

  120. ׬Ͱ͸ͳ͍ʂ
    ͦ͏…όʔδϣϯΞοϓ͸ϨΨγʔγεςϜվળͷʮ४උʯʂ

    View Slide

  121. ಈ͍ͨޙʹɺ͋Βͨͳઓ͍͕࢝·Δʂ
    • "Include Oriented PHP"͔Β୤٫͠ɺOOPɺAutoloaderԽ
    • ίʔσΟϯάن໿ͷద༻
    • ςϯϓϨʔτΤϯδϯ΍ϧʔλʔͷ࡮৽
    • ʮຊ෺ͷςετʯ΍ʮຊ෺ͷ੩తղੳʯɺCIɺCDԽ
    • ڧఢʹΈ͑·͢ʁ͍΍͍΍ʮண࣮ʹ΍Δʯͱେࠩͳ͍Ͱ͢Α
    • ΍͍͖ͬͯ·͠ΐ͏

    View Slide

  122. ʮ;Ήɺ100000ϑΝΠϧ͔ɺ༗ݶ࣌ؒ಺ʹऴΘΔͳʯ
    • Keep Calm and Carry On.
    "ฏ੩Λอͪɺීஈͷੜ׆Λଓ͚Α"
    • ࣮ࡍɺ΍Ε͹ऴΘΔʢܦݧஊʣ
    ౤͛ग़ͤ͹ऴΘΒͳ͍ʢܦݧஊʣ
    • ೔ʑͷϧʔνϯϫʔΫ΁ͷམͱ͠ࠐΈ(ࢥ૝,ಓ۩,ମ੍)͕ॏཁ
    • ͦΕ͕ࣗ৴ͱɺ࡞ۀϋʔυϧΛԼ͛Δ͜ͱʹܨ͕Γ·͢
    • ·͋ɺͦΕ͸ผͷ࿩ͳͷͰɺ·͍͔ͨͭ

    View Slide

  123. վળ͸ऴΘΒͳ͍
    ະ׬
    ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide

  124. ͦͷଞڭ܇

    View Slide

  125. ੟Ҭͷͳ͍ࡶஊ͸ศརʢʁʣ
    • ʮ͜͜ͰࠔͬͯΔʯʮ͜͜ຊ౰ʹͭΒ͍ʯʮࠓͳΒ͜͏͢΂
    ͖ʯʮ୅ସϥΠϒϥϦ͕ͳ͍ʯʮ͏Μ͟Γ͖ͯͨ͠ʯ
    • ਏ͍࢓ࣄʹෆฏෆຬ͸౰વ͋Δɻ୯ͳΔෆຬ͸ͷΈ͜ΉɾཷΊ
    ࠐΉ͘Β͍ͳΒɺগʑΨεൈ͖Λͯ͠ؾ੖Β͠ʢʁʣΛͯ͠Ͱ
    ΋ਐΊͨ΄͏͕ྑ͍ɺࠔΓΛ཰௚ʹγΣΞͰ͖Δۭؾ͸ॏཁ
    • ͨͩɺطଘίʔυʹ͸ؒҧ͍ͳ͘Ձ஋͕͋Γʮ౰࣌ͦ͏ͩͬ
    ͨʯ͚ͩͰʮѱʯͰ͸ͳ͍ɻࠓ΍͍ͬͯΔ࡞ۀͷޮ཰͕ॏཁ
    Ͱɺ׆ൃͳ৘ใڞ༗΍࿈ଳײ֦େ౳ͷ໨తΛ๨Ε͵ࣄ

    View Slide

  126. ίʔυϑΥʔϚοτɺઌʹ͔͚Δ͔ޙʹ͔͚Δ͔ʁ
    • ͓͢͢Ί͸ઌɺͳͥͳΒյΕͯ΋͜Ε͔Βؾ෇͘͠
    ϞμϯIDEͰࣗಈ੔ܗΛΦϑʹͯ͠ॻ͘ͷ͸݁ߏۤ௧
    • ૷০ੑ͸ؾʹͨ͠Βෛ͚ɺ࣌୅͸ΦʔτϑΥʔϚοτ
    • 2εϖʔε΍ϋʔυλϒΠϯσϯτ͸4εϖʔεʹ
    ݹࣜΏ͔͍͠૷০ੑͷߴ͍ίϝϯτ͸γϯϓϧʹ
    /**\n*ͳͲͷߦζϨ͸ؾʹͳͬͨΒ௚͢
    ۭനʹΑΔ =(୅ೖ) ἧ͑౳͸ແࢹ͢Δ

    View Slide

  127. ͦͷଞɺTypo΍ݹ͍ه๏ɺදهΏΕʹ͍ͭͯ
    • ʮಈؒ͘͸௚͞ͳ͍ʯ(Ұ෦్தͰ௚͢ࣄʹ͸ͳΔ)
    • TRUE▶trueɺVar_Dump("")ɺarray()▶[]ɺ"$a"▶"{$a}"
    • ɺ&=ɺvarɺreturn (true)?true:false;
    • ߦͷ෯੍ݶʢ͜Ε͸ແݶʹ͓ͯ͘͜͠ͱΛקΊΔʣ
    • ੩తղੳ͕׬શʹޮ͘ϨϕϧʹͳͬͨΒ௚͢
    • (ͦͷ͜Ζʹ͸Auto fixΛ࢖ͬͯ΋յΕͳ͘ͳΔͰ͠ΐ͏)

    View Slide

  128. ϨϏϡʔ΋ςετدΓͷࢹ఺Ͱ
    • όʔδϣϯΞοϓ͸࡞ۀͳͷͰʮྑ͍ॻ͖ํʯͰ೪Βͳ͍
    ͨͱ͑͹ʮ͜ͷif͸੔ཧͯ͠ૣظϦλʔϯʯͱ͔͸ະདྷʹ΍Δ
    • ϨϏϡʔ͸ʮͬ͞͞ͱऴΘΒͤΔʯͷࢹ఺Ͱ๬Ή΂͖
    • ໪࿦ɺજࡏόά΍Τϥʔॲཧෆ଍౳͸ࢦఠ͢Δ
    • ͦͷ্Ͱɺ༠ಋֶशΑΓʮऴΘΔʯ͕େࣄ
    ߟ͑ͤ͞ΔΑΓ࣮ྫॻ͍ͨ΄͏͕ྑ͍

    View Slide

  129. ࠷ॳʹ૟আ͢Δ
    • ૬खʹ͢ΔίʔυΛݮΒ͢ɺ͜Ε͸ຊ౰ʹഅࣛʹͳΒͳ͍
    • ϩάௐࠪɾฉ͖ࠐΈௐࠪΛͨ͠Βɺ૯ίʔυྔ7ׂΛ઎ΊΔό
    ΧͰ͔͍ΤϯυϙΠϯτΛ·Δ͝ͱ௵ͯ͠ྑ͍έʔε΋͋ͬͨ
    • ͱͬͯ͋Δ͚ͩ Λ૬खʹ͢ΔόΧόΧ͠͞͸ຊ౰ʹͻͲ͍
    • ʢͨͩʮ͜Ε͸ΰϛͰ͸ʁʯͱ͍ͬͯফͯ͠શ෦͕ͱ·ͬͨ
    αʔϏε΋஌͍ͬͯ·͢ʣ
    • ʮ͜Εɺ·͍ͩΓ·͢ʁফ͠·ͤΜʁʯ΋ॏཁͰ͢

    View Slide

  130. ϑΝΠϧΛফͯ͠Α͍͔҆৺͢ΔςΫ
    • ʮ͜ͷϑΝΠϧ͸ফͯ͠΋ྑ͍ഺʯͱ͓΋ͬͨΒɺͦͷίʔυ
    ʹΞΫηε͕͋ͬͨΒϩάΛग़͢Α͏ʹ͢Δͱྑ͍ɻϚʔΫ୅
    ΘΓʹ΋ͳΔɻ
    • ྫ:error_log("Unexcepted use :".__FILE__, 3, "/tmp/log");
    ʢϩάج൫ʹͳ͕͢ͷ͸OK͕ͩɺΤϥʔϩάͱ؆୯ʹ෼཭Ͱ͖
    Δ͜ͱɻSlackʹྲྀ͢ͷ΋Goodʣ
    • ೲಘͨ͠ΒɺఆܕจͰ୳ͯ͠ফ͢ɻ

    View Slide

  131. ͨ·ʹ͋ΔɺγϦΞϥΠβඇޓ׵
    • ԿΒ͔ͷσʔλɾΦϒδΣΫτΛจࣈྻͳͲʹʢͨͱ͑͹
    JSONʣม׵ͯ͠อଘ͢Δ͜ͱ͕Α͋͘Δ͕ɺ͜ΕͷσγϦΞϥ
    Πζͷޓ׵ੑ͕ফ͑Δࣄ͕͋Δ
    • (ΫϥεΛमਖ਼ͨ͠ΒdeserializeͰ͖ͳ͘ͳΔࣄ͸Α͋͘Δʣ
    • serializeɺencode·ΘΓ͸ॏ఺తʹνΣοΫ͢Δ͜ͱ
    • ηογϣϯ౳͸ݩΑΓɺδϣϒΩϡʔɺDB౳ʹજΜͰ͍Δࣄ΋

    View Slide

  132. ʮյΕͨจࣈྻʯͳͲͷඇޓ׵
    • كʹɺ͍··ͰʮյΕͨσʔλͰ΋ૉ௨͍ͯͨ͠͠ʯ΋ͷ͕ಥ
    વڐ͞Εͳ͘ͳΔࣄ͕͋ΔɻϥΠϒϥϦͷόά͕ʮͳ͓ͬͪΌ
    ͏ʯ౳͕ݪҼ
    • σόοΨͰͳ͍ͱݪҼ͕Α͘Θ͔Βͳ͍ࣄ͕ଟ͍
    • ͞ΒʹكʹʮյΕ͍ͯΔͱσʔλΛࣺͯΔʯڍಈ΋͋Δ
    • ͜Ε·ͨඇৗʹਏ͍ɺ͕Μ͹Ζ͏

    View Slide

  133. Ϗοάʹ͍͔͘ɺࠁΉ͔
    • ͲΕ͘Β͍ͷස౓ͰϝΠϯϒϥϯνͱϚʔδ΍ϦϕʔεΛ͢Δ
    ͔
    • όʔδϣϯΞοϓʹؔͯ͠͸ɺ
    ࡉ͔͗͘͢͠ΔͱӬԕʹऴΘΒͳ͍͜ͱ͕͋Δ
    • ͋Δఔ౓͸ϏοάˍϑϦʔζΛ͓͢͢Ί͢Δ
    • ػೳ௥ՃΛ͢Δͳͱ͍͏͜ͱͰͳ͘ɺϝϦϋϦΛ͚ͭΔ
    • ϦϑΝΫλϦϯάϑΣʔζͰ͸ࠁΜͩ΄͏͕ྑ͍

    View Slide

  134. ϨΨγʔγεςϜվળ͸ϝϯλϧʹ஫ҙ
    • େମධՁ͞Εͳ͍͠ɺਐԽͷϒϩοΧʔʹͳΔࣄ΋ଟ͍
    • σϓϩΠͰյͤ͹མͪࠐΉ͠ɺѱ͚Ε͹ެࣜँࡑʹͳΔ
    • ʮؾʹ͢Δͳʂʯͱ͔͍ΘΕͯ΋ ؾʹ͠ͳ͍ਓؒ͸·͍ͣͳ͍
    • ͦΕ͸ී௨ͳͷͰɺਏ͘ͳͬͨΒએݴ͢ΔɺͲΜͲΜଉൈ͖͢
    Δ
    • ෆຬ͸ෛ࠴ಉ༷ɺͨ·Δલʹओுͯ͠ શһ Ͱॲཧ͢Δ

    View Slide

  135. ຊ౰ͷࢿ࢈͜ͱγφϦΦςετ
    • ϨΨγʔγεςϜվળͰ࣮ײ͢Δ
    • ͋ΒΏΔػೳ͸࠶࣮૷Ͱ͖Δ
    • ͋ΒΏΔػೳ͸ஔ׵Ͱ͖Δ
    • ͔͠͠ɺγφϦΦςετ͕ͳ͍ͱʮΘ͔Βͳ͍ʯ
    • όʔδϣϯ΍ɺϑϨʔϜϫʔΫͷ৽چ͸ϚδͰؔ܎ͳ͍
    • ·ͣ͸ਖ਼ৗܥγφϦΦςετ͕όʔδϣϯΞοϓʹ͸ॏཁ

    View Slide