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

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

271fad8d53cd1f12f2b4b6d38e3d7bd3?s=47 uzulla
July 15, 2021

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

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

271fad8d53cd1f12f2b4b6d38e3d7bd3?s=128

uzulla

July 15, 2021
Tweet

Transcript

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

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

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

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

  5. ࠷ॳʹ·ͱΊ

  6. • PHPόʔδϣϯΞοϓ͸ʮ࡞ۀʯͰ͋Δ • ෳࡶʹݟ͑Δ໰୊͸෼ղ͠୯७ʹɺ΍Γ͖ΕΔख๏Ͱ࣮ߦ͢Δ • ςετ͕ॆ࣮͍ͯ͠ͳ͚Ε͹ɺ৽چൺֱ͢ΔE2EςετΛਪ঑ • ࣮͸ίʔυमਖ਼͸೉ؔͰ͸ͳ͍ɺஈऔΓ͕8ׂɻຐ๏͸ͳ͍ • શһͰղܾ͢΂͖ࣄɺਏ͍࡞ۀͳͷͰपғ͸αϙʔτ͠Α͏

    • ࣄނ͸͓͜ΔɺͳʹΛ΍ͬͯ΋͓͜ΔɺݟۃΊ΍֮ޛ͕ඞཁ • ࠷ޙϚΠϯυ͕มΘΕ͹੒ޭɺVer UPΛ೔ৗʹ͢ΔɺૅΛங͘
  7. ͸͍

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

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

    ௥͍͖ͭͮΒ͞͸͞ΒʹՃ଎͢Δ
  10. PHP version, Age Night … • ͔ͩΒɺ͍·͙͋͢ͳͨ΋Version UP!! • ຊτʔΫ͸ɺ্͛ͯͳ͍ਓ͕ର৅Ͱ͢

    • ຊτʔΫ͸ɺPR TIMES಺ͷΤϯδχΞ͞Μ޲͚Ͱ͢ • (࣮ঢ়ͱϑΟοτͯ͠ͳ͍͔΋ɺྃ͝ঝ͍ͩ͘͞) • ࠓ೔ඈ͹ͨ͠ൣғ͸ฉ͍ͯ͘ΕͨΒݸผʹ͍͘ΒͰ΋΍Γ·͢ • (ྫతͳ΋ͷ͸Ұൠ࿦ͰɺPR TIMES͞Μͷݱঢ়Ͱ͸͋Γ·ͤΜ)
  11. ͜͜Ͱ͍͏ʮόʔδϣϯΞοϓʯͱ͸ʁ • ৭ʑͳͱ͜ΖͰޠΒΕΔʮPHPόʔδϣϯΞοϓʯ͸ ʮϦϑΝΫλϦϯάʯͱࠞಉ͞Ε͍ͯΔ • όʔδϣϯΞοϓ͸ϦϑΝΫλϦϯάͰ͸ͳ͍ • (ࠓճɺϦϑΝΫλϦϯάͷ࿩͸͠ͳ͍) • ϦϑΝΫλϦϯάʹ͍ۙࣄΛʮඞཁͳͷͰʯߦ͏৔໘͸͋Δ

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

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

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

  15. ΍Δؾ

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

    • ճ෮ͷඞཁɾෆඞཁ͸࿦͡ΔՁ஋ͳ͠ɺඞཁͰ͋Δ ·ͣ͸ڐ༰ɺ࣍ʹԠԉɺͦͯ͠ཧղͱࢧԉΛ͍ͯ͘͠
  17. ʮϨΨγʔγεςϜվળ΍Γͨ͘ͳ͍ʯ໰୊ • ʮҰ౓͔͠΍Βͳ͍ҙຯͷͳ͍࡞ۀʯ • NOɺผ࣮૷Ͱ΋ɺଞݴޠͰ΋·ͨ΍Γ·͢ • ʮษڧʹͳΒͳ͍ʯ • NOɺγεςϜ΍ઃܭʹৄ͘͠ͳΓ·͢ •

    ʮ৽͍ٕ͠ज़(?)Ͱ࣮૷ͨ͠΄͏͕௵͕͖͘͠ʯ • NOɺ৽͍ٕ͠ज़(?) ΋ɺ͜͏ͳΓ·͢ɻલ޲͖ʹଊ͑·͠ΐ
  18. ࣌ؒ

  19. આ໌ෆཁ͕ͩɺ࣌ؒ͸ඞཁ • ࣌ؒʹਓ݄㲈ػձଛࣦ ▶ ʮ࠷௿ݶʹ͠Α͏ʯ ▶ Ϧεέ ▶ அ೦ •

    ݟੵࠔ೉࡞ۀͳͷʹɺͳ͔ͥ୹࣌ؒͰݟੵ΋Γ͕ͪ ڍ͛۟ɺ୹ظͷεέδϡʔϧ͕૊·ΕΔ͜ͱ͕ଟ͍… • ʮ৽نͰ࡞ͬͨ΄͏͕޻਺͕ಡΊΔʯ ʮͦΕ͸ʰ৽نͰ࡞ͬͨܦݧʱ͕ଟ͍͚ͩͰ͸ʁʯ (·͋ɺຊ౰ʹ৽نͰ࡞ͬͨ΄͏͕ྑ͍৔߹΋͋Δ)
  20. Ұ൪༥௨͕͖͘ͷ͸େ఍࣌ؒ • ͕ͩɺແବʹ࣌ؒΛ৳͹ͯ͠΋μϨͯɺ݁Ռ͕θϩʹͳΔ ޮ཰͕ѱ͘ͱ΋ɺख໭Γ͕͋ͬͯ΋ɺଞΛϒϩοΫͯ͠΋ɺ খ͍͞าΈͰ΋ɺॏͶͯɺܧଓ͠ɺ΍Γ͖Δඞཁ͕͋Δ • ΍Γ͖Δඞཁ͕͋Δ (େࣄͳͷͰೋ౓ݴ͍·ͨ͠) • Ͱ͖Δͷ͸ʮҰ൪୹͍࣌ؒΛݟੵ΋ΔʯࣄͰ͸ͳ͘ɺ

    ʮ୹͘ͳΔΑ͏ʹࢼߦࡨޡ͢Δʯ͜ͱͰ͋Δ
  21. ౓ڳ

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

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

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

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

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

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

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

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

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

    ▶ 9ׂҎ্
  31. ͳͥʮͰ͖ͳ͍ʯ͔ΛࢲݟͰ૯࿦͢Δͱ • ʮେม͗͢Δ͔Βʯʮҙຯ͕ͳ͍͔Βʯ ▶ ࡞ۀ͢ΔਓࡐɺίετɺϞνϕʔγϣϯ͕֬อͰ͖ͳ͍ • ʮʰ΍ΓํʱΛ஌Βͳ͍͔Βʯ ▶ ʰਖ਼͍͠ʱख๏΍πʔϧͷଘࡏΛ৴͍ͯ͡Δ •

    ʮ৽نͰͭ͘Δ΄͏͕ྑ͍͔Βʯ ▶ ܦݧऀʹଟ͍ɻ৽نͷํ͕ݟੵ΋ΓΛ͠΍͍͢ͷ͸ͦ͏Ͱ͢ Ͷ
  32. ͜͜Ͱ͸ʮ΍ΓํΛ஌Βͳ͍ʯʹϑΥʔΧε͠·͢ • ͳʹͤɺલఏͱͯ͠ɺͦΕΛ΍Βͳ͍ͱ͍͚ͳ͍ΜͰͶʂ

  33. ໰୊Λղ͘ʹ͸ద੾ͳ՝୊ઃఆ͕ඞཁ • ʮ͜ΕΛόʔδϣϯΞοϓͯ͠ʯ ▶ ݟੵ΋Γࠔ೉ʹݟ͑Δ • ʮ͜ͷςετΛ௨ΔΑ͏ʹͯ͠ʯ ▶ Մೳʹݟ͑Δ •

    ͳͷͰɺςετʹམͱ͠ࠐΉ • ৽؀ڥͱچ؀ڥͷζϨ(ෆ۩߹)Λ໰୊ʹ͢Δ • ͦͷζϨͷϦετΛʮ࡞Δʯͷ͸Մೳͱ͍͑ΔͷͰ͸ͳ͍͔ʁ (໰୊ͷ෼ׂ)
  34. େมͦ͏͗͢Δʂ • ʢؾ࣋ͪ͸Θ͔Δʣ • ͔͠͠ɺʮΘ͔Δॴ·ͰɺϒϨΠΫμ΢ϯ͢Δʯͷ͸Ԧಓ • ղ๏͸̍ͭͰ͸ͳ͍͠ɺ୔ࢁ͋Δ • །Ұͷਖ਼ղ͸ͳ͍͕ɺࣄྫ΍৘ใ͸୳ͤ͹୔ࢁ͋Δ •

    ͲΜͳࣄͰ΋ɺલྫ͸ʮਖ਼ղʯͰ͸ͳ͍ • ͋͘·Ͱࢀߟʹͯ͠ɺ΍͍ͬͯ͘
  35. ʮ࣮ྫʂվળͷ༷ࢠʂʂʯ foreach($՝୊Ϧετ as $՝୊){ ʮ͜ͷػೳɾϑϩʔ͕ಈ͔ͳ͍ʯ ▶ ʢݪҼௐࠪͷ։࢝ʣ ʮ͜ͷURL͕ಈ͔ͳ͍ʯ ▶ ʮ͜ͷίʔυͷ͜ͷߦ͕ಈ͔ͳ͍ʯ

    ▶ ʮؔ਺͕ͳ͘ͳ͍ͬͯΔʯ ▶ ʢݪҼௐࠪͷୡ੒ʣ ʮΑ͠ʂ͠Β΂ͯॻ͖׵͑Α͏ʂʯ ▶ʢࢪࡦͷ։࢝ʣ ʮςετͯ͠͏͍ͨͧ͝ʂʯ⾣ ʢୡ੒ʣ } # ͜Εͷ܁Γฦ͠ɺ͜Ε͕ೖΕࢠʹͳΔ
  36. Ұൠతͳݱ৔ʹ͓͍ͯ • ݸʑͷ໰୊(मਖ਼࡞ۀ)͸ɺօ͞ΜղܾͰ͖Δ • ن໛΍ɺ೉͍͠໰୊΋͋Δ͚Ͳɺग़དྷͳ͍࿩Ͱ͸ͳ͍ (PHPಘҙʢࣗশʣͳͷͰख఻͍·͢) • ͔͠͠ɺͦ͜ʹͨͲΓண͘ͷ͕৭ʑ೉͍͠ΜͰ͢ΑͶ… • (ࣗ৴͕ͳ͍ʁΘ͔Βͳ͍ʁख఻͍·͢ɺͦͷͨΊʹདྷ·͠

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

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

  39. E2EςετʢEnd to End ςετʣ • ೖྗ(ϦΫΤετ)ʹର͠ɺظ଴௨Γͷग़ྗ(Ϩεϙϯε)͔ʁ • ৽؀ڥʹ࣮ߦͯ͠੒ޭɾࣦഊ͕Θ͔Δ (ͦͯ͠ɺݱߦʹ΋͔͚ΒΕΔ) •

    ʮόʔδϣϯΞοϓޙɺE2Eςετ͕௨Ε͹੒ޭʯͱݴ͑Δ • (…ཧ࿦্ͷཧ૝Ͱݴ͑͹ɻྫ֎΋͋Γ·͢) • ϒϥ΢βͰखಈͰ΋Մೳɺ೔ʑօ͞Μͯ͠Δͱࢥ͍·͢ɻ
  40. ͔݁͠͠߹ςετ͸ਏ͍ • मਖ਼ͨ͠Βຖճϑϧςετ͍͕ͨ͠ɺਓྗ͸େม • ▶ ςετ͸େมɺͰ͖Δ͚ͩࣗಈԽ͠Α͏ • ʮࣗಈԽͱ͍͑͹˓˓Λ͔͓ͭ͏ʂʯͷ᠘ • ҰͭͰ΋ଟ͘ͷςετΛ࡞Δ΂͖ͳͷʹ

    ʮςετॻ͘ͷ͕ ໘౗ େมʯ໰୊ • ▶ πʔϧͰղܾ͸͠ͳ͍(ܦݧ্ɺѱԽ͠΍͍͢)
  41. ॏཁͳͷͰೋճ͍͍·͢ • ςετ͕ͨ͘͞Μ͋Δ͜ͱ͕ॏཁ • ʮ͔͍͍ͬ͜πʔϧʯ͸ॏཁͰ͸ͳ͍ • ςετͷϞμϯ͞ɺ៉ྷ͞͸୹ظʹ͸ҙ͕ٛബ͍(ओ؍) • ʢ͔͍͍ͬ͜πʔϧ͕ศརͳ͜ͱ΋͋Δʣ •

    ʢଟ͘ͷ৔߹ʣʮReq/Res ͚ͩݕূͰ͖Ε͹ྑ͍ʯ • ׳ΕͨPHPͱλεΫϥϯφʔͰॻ͚Δ
  42. ͡Ό͋ૉ๿ͳπʔϧͱ͸ʁͷྫ • symfony/http-client + symfony/dom-crawler + phpunitҐͰ͍ ͍ • (HTMLͷ׬શҰக͸ແ஡ͳͷͰ)

    ϨεϙϯείʔυɺϔομʔɺDOM౳ͷ֬ೝ • ʮ࡞ۀʯͳͷͰɺʮ͔ͬ͜Α͍ʯඞཁ͸ͳ͍ ۃ࿦͍͑͹ɺcurlͱγΣϧεΫϦϓτ͍͍ͩͬͯ • (JS͕ͳ͍ͱಈ͔ͳ͍ʁ
  43. phpunit͕ͩɺϢχοτςετͰ͸ͳ͍ • phpunitΛλεΫϥϯφʔͱ͔ͯͭ͠͏(PhpStorm࿈ܞศར) • CI౳Ͱͷར༻ੑɾকདྷੑ͸Ұ൪ͷ໰୊Ͱ͸ͳ͍ ϦϑΝΫλϦϯάͰ͸ͳ͍ɺόʔδϣϯΞοϓͩ • ϩδοΫͷ݈શੑςετΛ͔͖͍ͨΘ͚Ͱ͸ͳ͍ • ͳͷͰɺ͜ͷʮςετʯ͸ɺΞϓϦͱผ(ͷrepo౳)Ͱྑ͍

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

  45. αϯϓϧ

  46. <?php /** @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); } } }
  47. <?php /** @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 { # ೔ຊޠͷςετ໊Λڐ͢ʢΤϯδχΞͷ฼ࠃޠʹ΋ΑΔʣ // => ࣍ϖʔδ΁ } }
  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]);
  49. # ͱΓ͋͑ͣจࣈྻͰ৭ʑ൑ఆ͢Δ $this->assertStringContainsString('html', $res->getContent()); # ࠷ޙ·Ͱग़ͯͦ͏ʁ $this->assertStringContainsStringIgnoringCase('</html>', $res->getContent()); # Display

    ErrorsΛर͏ʢௐ੔͕ඞཁͳࣄ΋ଟ͍ͷͰ֤ࣗద౰ʹʣ $this->assertDoesNotMatchRegularExpression( '/(Notice|Error|Warning):/u', $res->getContent() );
  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); }
  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
  52. جຊతͳࣄ͸͜ΕͰͲ͏ʹ͔ͳΓ·͢ • HTML͕࠷ޙ·ͰͰ͍ͯͯɺΤϥʔ͕ͳ͚Ε͹େମେৎ෉(?) • γφϦΦ໊͸೔ຊޠͰ΋ྑ͍ʢӳޠͰ΋ྑ͍ʣ • ͨͩɺ೔ຊޠͩͱ୹ͯ͘ࡁΉ…ֆจࣈ΋ྑ͍ • ࠓ͸ଟࠃ੶ͳݱ৔΋ଟ͍ͷͰɺௐ੔͠·͠ΐ͏ •

    Τϥʔϩά΋֬ೝ͠·͠ΐ͏ͶɺࣗಈԽͮ͠Β͍͚Ͳ (͜Ε͸ࠓճεΩοϓ)
  53. ͲΜͲΜΧελϜͯ͠΋ྑ͍ • TestCaseΫϥεΛϥοϓ͢ΔɺTraitʹ෼཭͢Δ ྫ: clientΛWrapͯ͠ɺStatus CodeνΣοΫͱ͔Λڞ௨Խ • ݱ৔ʹϚον͢Δলུه๏Λ૿΍͢ͱޮ཰্͕͕Γ·͢ɺ ʮෳࡶͰͳ͍ʯͳΒΑ͠ •

    URLϦετΛCSV΍Google Sheets͔ΒҾ͘ͳΜͯศར΋ΞϦ • Ϟμϯͳ੩తղੳ͕ޮ͘ίʔυʹ͢Ε͹ϦϑΝΫλ΋؆୯ʂ • ʮ͋ͨΒ͍͠PHPʯΛ࢖͏͜ͱͰؾ෼ΛΞή͍ͯ͘
  54. (࠶ܝࡌ)໘౗Ͱॻ͔ͳ͍ɺͦΕ͕Ұ൪΍͹͍ • ͱʹ͔͘؆୯ʹॻ͚ΔɺಡΊΔɺ௚ͤΔΑ͏ʹ • ৽ਓͰ΋ॻ͚Δ͘Β͍͕ͪΐ͏ͲΑ͍ͦ͠͏͢΂͖ • εςʔλείʔυݟΔ͚ͩͰ΋͍͍͔Βॻ͘ • HTMLଆʹɺςετͷͨΊʹηϨΫλϑϨϯυϦͳcss classΛ

    ͍ΕͨΓɺdata-test="hoge"ͱ͔͍Εͯ޻෉͢ΔؾʹͳΔ • (ʮN൪໨ͷϘλϯʯ໰୊͸ϞμϯπʔϧͰ΋͋Δ)
  55. ͯ͞ɺπʔϧ͸Α͍ͱͯ͠ɺͲ͏ςετέʔεॻ͔͘ʁ • ʮ׬ᘳͳέʔεʯΛ࡞Ζ͏ͱͯ͠ɺ ҰͭͷέʔεʹΉ΍Έʹ࣌ؒΛֻ͚Δͷ͸ͭΒ͍ • ฏͨ͘ݴ͑͹ࢼ͢URL͕ଟ͍΄ͲΑ͍ɺ͔͕ͨ஌Ε͍ͯΔ (…ࣄ͕ଟ͍ɺӡ͕ѱ͘ͳ͚Ε͹)

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

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

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

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

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

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

    • (ࢲ͸ࣗ࡞πʔϧͰετϦʔϜม׵͠·ͨ͠)
  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
  63. ૉࡐ(ੜϩά)͸઱౓΋ॏཁ • ݹ͍ϩάΑΓɺ࠷ۙͷϩάΛΈ·͠ΐ͏ • ʮԿϲ݄ʯΈΔ͔͸ݱ৔ʹΑΓ·͢ • (ແ͍ͳΒແ͍͠ɺࣺͯͯΔॴ΋ଟ͍͠) • ͔͠͠࠷௿Ͱ΋̎ϲ݄͸ඞཁɺͰ͖Ε͹̍೥ •

    (݄·ͨ͗Ͱൃੜ͢Δύλʔϯ΍όονͳͲ͋ΔͷͰ)
  64. ͦͷ্Ͱటष͍ਓྗ͕ॏཁ • ػցతʹ΍ͬͯ΋ॏཁͳURLΛऔΓ͜΅͠·͢ • ϩά͸ػցత߈ܸͳͲͰԚΕͯΔͷͰΫϨϯδϯά΋ॏཁͰ͢ • खಈςετ(QA)ͯ͠Δਓͱක͖ͭͰ֬ೝ͢Δ • ຊ෺ΛΑ͘ݟΔɺΑ͘৮Δ •

    ʮ΋ͱ΋ͱյΕͯͨʯʮͦΜͳػೳ͸ແ͍ʯ͜ͱ΋Α͋͘Δ • (͜ͷ͋ͨΓͰɺੵۃతͳνʔϜମ੍ɾԠԉ͕ͳ͍ͱΩπ͍)
  65. ूܭ͠Α͏ʂ • access.log.gz Λ֬อ͢Δʢ͜͜Ͱ͸֬อͨ͜͠ͱʹ͠·͢ʣ • alp (https://github.com/tkuchiki/alp) ʹύλʔϯ෇͖Ͱྲྀ͢ • ͜ΕͰύλʔϯήοτͩͥʂ

    • (alpͷDL΍LTSVग़ྗઃఆ͸ alpͷαΠτࢀর)
  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
  67. None
  68. • ࣾ಺Ͱ͸ڞ༗͓ͯ͠Γ·͢ͷͰɺ͝ཡ͍͚ͨͩ·͢ • (·ͩΫϨϯδϯάதͳͷͰɺ͙͢ʹࢀߟʹ͸ͳΓ·ͤΜ͕)

  69. ISUCONͷͱ͖ͷྫͰ͢

  70. gzipͷ··ѻ͏ • ϩάϑΝΠϧ͸ڊେɺgzipʢ.gzʣঢ়ଶͰ͔͋ͭ͏ͱָ • ϩάϑΝΠϧ͸̍ͭʹ͢Δඞཁͳ͍ɺ෼ׂͨ͠··ͰΑ͠ gzip -dc * |alp ޻෉ͯ͠xargs͔ͭ͑͹ฒྻʹ΋Ͱ͖ͳ͍͜ͱ΋ͳ͍

    • (࠶ܝ)ϞμϯʹBigQuery΍Athena…ͱ͍͍͍ܰͨ͘Ͱ͕͢ɺશһ ͕ແ৺ͰʮͰ͖Δʯʹ͸ૉ๿ͳํ͕ྑ͍ͷͰഎ৳ͼ͸μϝ
  71. લॲཧͷϑΟϧλ • headΛ͔ͭͬͯɺͩΜͩΜͱॲཧൣғ޿͛Δͱࢼߦࡨޡָ͕ • grep -vΛ͔ͭͬͯɺʮΰϛΛ͋Δఔ౓ࣺͯΔʯͱָ

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

    • ࠓճԠ౴଎౓͸ෆཁͳͷͰɺग़ྗΛઃఆ -o 2xx,3xx,4xx,5xx,method,uri
  73. • status:404ͷύλʔϯΛແࢹ͢Δͷ͸஫ҙ͕ඞཁɺͦ͏͍͏API ͔΋͠Εͳ͍͔Β • ઈରʹଘࡏ͠ͳ͍(ଘࡏ͠ͳ͍PhpMyAdmin΁ͷΞΫηεͱ͔…) ͸͍Βͳ͍ͷͰࣺͯΔ͕ɺ࠷ޙʹࣺͯͨ΄͏͕ྑ͍ • ॲཧʹ͸ɺ͘͢͝ʢ਺࣌ؒʙʣ͕͔͔࣌ؒΔͷͰڧ͍ܭࢉࢿݯ ͕ඞཁͰ͢ɻฒྻԽ΋͍ͨ͠ॴͰ͢ɺͨͩɺ࿩͕௕͘ͳΔͷͰ লུ

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

    ͕ม׵͞Ε͍ͯΔ͜ͱ΋͋ΔͷͰ஫ҙ(.httaccess΍httpdͷઃ ఆΛνΣοΫ͠·͠ΐ͏)
  75. ࿩໭) Ϧετ͕Ͱ͖ͨΒɺςετέʔεΛ࡞Δ • ͜ͷ࣌఺Ͱ͸GETܥ͚ͩͰΑ͍͔Βॻ͖͖Δ • ͳΜͷຐ๏΋ͳ͍ɺςετίʔυΛॻ͘(αϯϓϧ͸ผ్) • ޻෉͸Ͱ͖Δ͔΋͠Εͳ͍͕ɺͱʹ͔͘ແ৺Ͱ࡞Δ • (ςετͷςετɺݱߦʹྲྀͯ͠Fail͠ͳ͍͜ͱΛ֬ೝ͢Δ)

  76. Ͱ͖ͨΒͲΜͲΜྲྀͯ͠ͲΜͲΜ௚͢ • ςετ͕Ͱ͖ͨΒɺ؀ڥΛ͖ͨͨ·ͬͯ͘ݕূ͢Δ • मਖ਼ͨ͠Β·ͨୟ͘ • GETܥͳͷͰɺԕྀͳ͘ແݶʹୟ͘ • ΨϯΨϯ௚͢ •

    ͳΜ͔ϧʔϧ͕ͨΓͯͳ͚Ε͹ิॆ͢Δ • ·ͨյΕΔͷͰͳ͓͢ɺԆʑͱ܁Γฦ͢…
  77. POST͸ʁ • POSTܥΛ௚͢ͷ͸GETܥͷޙͰΑ͍ • ͳΜͳΒɺPOSTܥ͸൒෼ख࡞ۀͰ΋ྑ͍ʢن໛ʹΑΓ·͢ʣ • ಛʹ؅ཧը໘ͷࡉ͔ʔ͍৔ॴ͸໢ཏ͕ͭΒ͍ͷͰɺ ଟগࠩͬҾ͍ͯ΋ྑ͍ʢྑ͍ͷ͔ʁʣ • ͱ͸͍͑ϦΫΤετΛద੾ʹૹΕ͹ɺ

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

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

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

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

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

    • ͜ͷ͋ͨΓ͸ݱ৔ʹΑΓ·͢͠ɺ΍Γͳ͕Βߟ͑Δ
  83. • (mysql/)data ౳΋VolumeͰϚ΢ϯτͨ͠΄͏͕ૣ͍ ͋Δ͍͸ɺ಺෦Ͱ tar.gz Λղౚ͠ɺຖճ্ॻ͖͢Δɻ • σʔλϦηοτͷͨΊʹ࠶౓SQLΛྲྀ͢ΔΑΓɺ dataΛσΟϨΫτϦ͝ͱ্ॻ͖ͯ͠࠶ىಈ͕ૣ͍ •

    ͜Ε͸ͦͷଞͷσʔλ΋ಉ༷ɺॳظԽ͕ߴ଎ʹͰ͖Δํ͕ྑ͍ • (ͦͷͨΊʹ͸ɺσʔλΛ֎͔Βݟ͑ΔΑ͏ʹͨ͠΄͏͕ศརɺ ͨͩɺLinuxҎ֎͸஗͍ΜͩΑͳ…) • (͜ͷσʔλ͸gitʹ͍Εͳͯ͘΋ྑ͍ɺೖΕͯ΋͍͍͚Ͳ)
  84. ·ͣ͸ݱࡏͷ֬ೝͷͨΊʹʰݱߦʱΛ࡞Δʢਅ݋ʣ • ΤϥʔΛશ༗ޮɺ͔ͭදࣔʹ΋ͩͯ͠͠·͏ɺPHP͸ศར • ͢Δͱݩʑ͋Δʮແࢹ͍ͯ͠ΔΤϥʔʯ͕ग़Δ৔߹͕͋Δ • ͱ͍͏͔ɺेதീ۝ແࢹ͍ͯͨ͠Warning΍Notice΍Strict΍ Deprecated͕ͰΔ • ·ͣɺ͜ΕΛ௚͢

    • @Ͱ҆қʹΤϥʔΛѲΓͭͿͯ͠Δॴ΋ɺ౰વʂશ෦ʂ௚͢ʂ
  85. ʮ͸͍ɺ͜͜Ͱ͸࣏ͬͨ͜ͱʹ͠·͢Ͷʯ

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

    ॱ൪ʹ্͛ΔɻݩʑҰؾʹߦ͚ΔίʔυͳΒτϯτϯͱ͢͢Ί Δ
  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)
  88. վम࡞ۀ

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

  90. ࠷ॳʹ࢒೦ͳ͓஌Βͤ • ʮ͍͢͝πʔϧΛڭ͑ͯԼ͍͞ʂʯʮຊԻΛ͍͏ͱɺແ͍ʯ • ʮษڧ͠·͢ʂຊΛ͍ͩ͘͞ʂʯʮਖ਼௚ʹ͍͏ͱɺແ͍ʯ • ʮ΍ΓํΛڭ͑ͯԼ͍͞ʂʯʮͿͬͪΌ͚͍ͯ͏ͱɺແ͍ʯ • ͋ΔͳΒɺ୭΋ࠔͬͯͳ͍ΑͶɺϋϋϋʂʂʂʂ •

    (ੈʹ͋Δͷ͸ɺେ఍ΞϓϦઃܭͷϦϑΝΫλϦϯάͷຊͰ͢)
  91. ͦΕͰ΋੩తղੳπʔϧ͸͋Γ·͢ • ྫ(͜ΕҎ֎ʹ΋৭ʑ͋Δ): • PhpStorm • https://github.com/wapmorgan/PhpDeprecationDetector • https://github.com/phan/phan •

    https://github.com/phpstan/phpstan • ʮͲΕ͕ਖ਼ղͰ͔͢ʁʯ ʮݱ৔(ର৅ίʔυ)ʹΑΔɺਖ਼ղ͸ͳ͍ͷͰશ෦ࢼ͢ʯ
  92. • ʮͳΜ͔ɺPHP>=7.2ͬͯ͋Γ·͕͢ʁʯ ʮͦ͏ɺπʔϧ΋ݹ͍PHP੾ͬͯΔΜͩΑͶɺϋϋϋʯ • ݹ͍όʔδϣϯΛ࣋ͬͯ͘Δ͜ͱ͸Ͱ͖Δ ʢGitHub౳ʹײँʣ • ͳ͓ɺղੳπʔϧࣗମ͸࠷৽PHPͰಈ͔ͯ͠΋ྑ͍ ʢ͜ͱ͕ଟ͍͠ɺ࠷৽PHPͷ΄͏͕அવߴ଎ʹॲཧͰ͖Δʣ •

    ͨͩ͠ɺࢲ͸ͲΕ΋৴͓ͯ͡ΒͣɺࢀߟʹͱͲΊ͍ͯΔ
  93. ੩తղੳʹ͸ݶք͕͋Δ ݱ࣮ͷ໰୊͸ݕ஌͕ࠔ೉

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

    (ಡΜͰʮݟ͚ͭΒΕΔ༷ʹͳΔʯΘ͚Ͱ͸ͳ͍͕ ݟ͚ͭͨޙʹʮղΔʯͨΊʹ͸ͱͯ΋खॿ͚ʹ͸ͳΔ)
  96. ༨ஊɿڍಈͷ֬ೝʹ͸ xdebugʢσόοΨʣ • ͜Ε͸੩తղੳΑΓඞਢɺPhpStormͱ࿈ܞͤ͞·͠ΐ͏ • σόοΨ͕ݏ͍ͳਓ͸޷͖ʹͳͬͨ΄͏͕ྑ͍ • Ͳ͏ͯ͠΋ίʔυ͕ҙਤ͢Δڍಈ͕ཧղͰ͖ͳ͔ͬͨΓ ڍಈͷ͕ࠩͰΔͳΒɺεςοϓ࣮ߦ͔͠ͳ͍ •

    (print debug͸ʮۃكʹʯڍಈ͕มΘΔͷͰ͓קΊ͠·ͤΜ) • σόοΨͷͨΊʹࡾ߲ԋࢉࢠΛల։͢Δɺ౳ͷ޻෉͸͋Γ·͢ (յ͞ͳ͍Α͏ʹɺ৻ॏʹ…)
  97. ࿩Λ໭͢: ੩తղੳ͸ۜͷ஄ؙͨΓಘͳ͍ • DeprecatedΛ୳͢πʔϧ͸͋Δ͕ɺ׬ᘳͰ͸ͳ͍ • جຊతʹʮྑ͍ίʔυʯΛαδΣετ͢Δ΋ͷ͕ଟ͘ɺ ϨΨγʔίʔυʹ͔͚ΔͱɺແݶʹαδΣετ͞ΕͯṆΕΔ • ੲͷಈతʹincludeଟ༻౳͸ਪ࿦ग़དྷͣʹΤϥʔʹͳΔ ʮݟ͔ͭͬͨʂʯͱۦ͚دͬͯ΋ɺͦΕ͸ΤϥʔͰ͸ͳ͍

    (੩తղੳͷΤϥʔͱ͍͑Δʣ • (ۦ͚دͬͯϦϑΝΫλͯ͠͠·͏᠘ʹ͔͔Δਓ͕ଟ͍)
  98. ໃ६͢ΔΑ͏Ͱ͕͢πʔϧ͸࢖͑Δ • ʮ͓͔͘͜͜͠ͳ͍ʁʯͱݴΘΕΕ͹౰વḿΔ • ͔͠͠ɺमਖ਼͢΂͖͔͸੩తղੳπʔϧ͕ܾΊΔॴͰ͸ͳ͍ • ੩తղੳπʔϧͷܯࠂΛ௵͢ࣄ͕໨తͰ͸ͳ͍ • ͜͜Λؒҧ͑ͨΓɺ৴པ͗ͯ͢͠᠘ʹϋϚΔਓ͕ଟ͍ •

    ҆қͳAuto fixͳΜͯ΋ͬͯͷ΄͔ • (ͲͪΒ͔ͱ͍͑͹ʮͲ͜·Ͱແࢹͯ͠ྑ͍͔ʁʯͷํ͕ॏཁ)
  99. ʮπʔϧ͕ͳ͍ͳΜͯʂͲ͏͢Ε͹…ʂʂʯ • طଘͷڍಈ͕(PHP౳ͷ)όάલఏͷίʔυ΋كʹ͋Δ • (ಛʹจࣈྻݕূ΍഑ྻૢ࡞౳ͰΤϥʔΛ௚͢ͱյΕΔྫ) • օ͞Μɺ΋͏͓Θ͔ΓͰ͠ΐ͏͕… • ͦ͏ɺE2Eςετ͢Δ͔͋͠Γ·ͤΜͶʂ •

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

  101. ༨ஊɿPhpStormͰͷ੩తղੳͷ͔͚ํ • PhpStormͷCode inspection͸࢖͑ΔͬͪΌ࢖͑Δ • 1. PHPͷر๬͢ΔόʔδϣϯΛઃఆ͢Δ • 2. ϧʔϧΛΧελϜ͢Δ

    (HTML΍CSSͷΤϥʔΛΦϑʹ͢Δ) (৭ʑ͋ΔPHPͷ߲໨΋ؤுͬͯߟ͑ͯΦϯΦϑ͢Δ…) (໪࿦ɺ͜͜ʹ΋ʮਖ਼ղʯ͸ͳ͍) • 3. ͍͕͔͔࣌ؒͬͯ͢͝ɺେྔʹͰͯ͘Δ
  102. ͔͞Ͷ͍͍ͯ·͕͢ • ʰError਺ઍɺWarn਺ສɺޡݕ஌͋ΓʱͰ͋ͬͯ΋੩తղੳ͸ศ རͰ͢ɺඞܞͰ͢ • ͨͩɺखΛҾ͔Εͯݴͬͨઌ͸Τϥʔ͡Όͳ͔ͬͨΓόʔδϣ ϯΞοϓʹؔ܎ͳ͍ϦϑΝΫλϦϯάͩͬͨΓ͠·͢ • ͪͳΈʹʮϞμϯͳίʔυʯʹͳΔͱ੩తղੳ͕όοοΩόΩ ʹޮՌΛൃش͠ɺແݶͷϝϦοτ͕੒बͰ͖ɺΤϥʔ΋Auto

    fix ΋΄ͱΜͲؒҧ͍ͳ͘ͳΓ·͢ɻ ͔͠͠ϨΨγʔίʔυͰ͸ແཧͳΜͰ͢Αɺͼͬ͘Γ͠·͢
  103. ϋοϋοϋɺ͜Ε͕ຊ౰͔ͩΒࠔΔ ʢϨΨγʔγεςϜվળϚϯ΁ͷΤʔϧʣ ʮେৎ෉ɺσϓϩΠͪ͠Ό͑͹ ɹશһΛר͖ࠐΊΔͧʯ ʢͭ·Γͬ͞͞ͱ΍͚ͬͭͯ͠·͑ʣ

  104. ࣮ࡍͲ͏΍ͬͯίʔυΛ௚͍͔ͯ͘͠ʢ΍ͬͱʂʣ • ςετΛճ͢ ▶ ௚͢ ▶ ςετΛճ͢ ͜Εͷ܁Γฦ͠ʢ࠶ܝ ࡌʣ •

    खΛͱΊͳ͍ɺͲΜͲΜΞυϗοΫʹॻ͖௚͢ • ؾʹͳͬͨΒɺͱΓ͋͑ͣ ʮ// TODO ͕͜͜Ϡό͍ʯ ͱ͔ॻ͍ͯɺ͙͢ʹ๨Ε·͠ΐ͏ɻ • σάϨΛڪΕͯ͸ͳΒͳ͍ɺͦͷͨΊʹςετ͕͋Δ • ͨͩ͠ʮςετ͕յΕͳ͍ͳʁʯͱ͓΋ͬͨΒςετ΋ٙ͏ࣄ
  105. ίϛοτཻ౓ʹ͍ͭͯ • ςετΛճ͢౓ʹίϛοτ͢Δ͘Β͍ͰΑ͍ • ͢Δͱʮ֬ೝʯͱ͔͍͏ίϛοτ͕ͨ͘͞ΜͰ͖Δ • ͔͠͠೰ΜͰԕྀͯ͠ɺ΋Ͳͤͳ͍ͷ͕Ұ൪ͭΒ͍ • Ͳ͏ͤσάϨ΋ൃੜ͢Δ͠࡞ۀϒϥϯνͷϩά͸ఘΊΔ΂͖ •

    ͜ΜͳॴͰετϨεΛ૿΍͢΄͏͕ͭΒ͍ • Ͳ͏ͯ͠΋commit log͕ؾʹͳΔͳΒ git squash
  106. ϓϧϦΫʹ͍ͭͯ • ಛʹӨڹൣғ͕޿͍ʮڞ௨ίʔυʯΛ௚͢৔߹ ͬͪ͜Λ௚͢ͱɺ͕͋ͬͪյΕΔͱ͍͏͜ͱ͕͋Γ·͢ • ʮڞ௨ίʔυʯΛආ͚ͯͱΓ͔͔ͬͨ୺ͬ͜ͷίʔυ͕ ڞ௨ίʔυʹࠜͨ͟͠όάʹؔ࿈͢Δ͜ͱ΋ଟʑ͋Γ·͢ • ݁ہ௚͢ඞཁ͕͋ΓʮϓϧϦΫཻ౓ʯ͕໓஡ۤ஡ʹͳΓ·͢ •

    ͢ΔͱϨϏϡʔɺίϛϡχέʔγϣϯίετ͕૿େ͠·͢ • ʢ͜Ε͸ݱ৔ʹΑΓ·͢ɺͦ͏ͳΒͳ͍ίʔυ΋͋Δʣ
  107. • ͳͷͰʮͰ͖Δ͚ͩʯڞ௨ίʔυΛઌʹ௚ͨ͠΄͏͕ྑ͍ ͦͷͨΊ͚ͩʹɺ؆୯ͳϢχοτςετΛॻ͘৔߹΋͋Γ·͢ • ͔ͦ͠͠Ε͸ཧ૝࿦ͳͷͰɺ͏·͘ߦ͔ͳ͍ࣄͷํ͕ଟ͍ τοϓϖʔδͷখमਖ਼͕ɺDBपΓͷίʔυ·Ͱ͍͘͜ͱ͕͋Δ • ΍Γͳ͓͢΂͖͔ʁ͍΍ɺࢲ͸ׂΓ੾ͬͨ΄͏͕ྑ͍ͱࢥ͏ • The

    done is better than a perfect. • (͜Ε͸खൈ͖͠Ζɺͱ͍͏͜ͱͰ͸ͳ͘ɺ ʮඒ͠͞ʯͱ͔͸ϦϑΝΫλϑΣʔζʹ͠Ζͱ͍͏͜ͱͰ͢ʣ
  108. ༨ஊɿʮͳΜ͔ߥʑ͍͠ҙݟଟ͘ͳ͍ʁʯ • શ͕ͯॱௐεϚʔτʹͰ͖ΔͳΒɺ΋͏8ʹ·Ͱ্͍͛ͯΔ͸ͣ • όʔδϣϯΞοϓͬͯͷ͸ɺੑ࣭͕Ԍ্Ҋ݅ʹ͍ۙ • ͋͘·Ͱ͜Ε͸ʮࢲͷҙݟʯͳͷͰɺPR TIMES͞Μʹ͓͍ͯ͸ ৭ʑ·͋ௐ੔ͨ͠ΓͳΜͩΓ͢Δͱ͓΋͍·͢

  109. ࿩Λ໭ͯ͠: ϩάͷΤϥʔΛ௵͍ͯ͘͠ • (࠶ܝͰ͕͢) • ϩάΛE_ALLʹͯ͠ɺΤϥʔΛશ෦௚͍ͯ͘͠ Fatal, Error, Warn, Notice,

    Deprecated, Strict. • PHPͷΤϥʔ͸શͯҧ๏ ɺVerUPʹ΋΄΅༗֐ɺશ෦ରԠ͢Δ • ׂͱօ͞ΜΤϥʔແࢹ͕͕ͪͩ͠ɺແࢹͯ͠͸ͳΒͳ͍ɺ DeprecatedͳΜͯݟ͚ͭͨΒϥοΩʔνϟϯεͱݴ͑Δ • (ͳ͓ɺΞϓϦͷʰσόοάϩάʱ͸अຐͳͷͰΦϑ͠·͠ΐ
  110. ໪࿦ϥΠϒϥϦ΋յΕΔͷͰରԠ͢Δ • όʔδϣϯΛ্͛Δɺ୅ସΛ୳͢ɺແ͚Ε͹࡞Δ • ͋Δ͍͸ʮforkͯ͠ಈ͘Α͏ʹ͢ΔʯɺOSS࠷ߴʂ • (༗໊FWमਖ਼ΑΓɺΦϨΦϨ/ࣗࣾFWͷํ͕·ͩখܕͳ෼ָ) • Ϟσϧɺσʔλ૚पΓͩͱɺ͔ͳΓؾ߹͕͍Δ •

    ͜Ε͸ݱ৔ʹΑΓ·͢
  111. ࠩ͠ସ͑ʹඞཁͳϦϑΝΫλϦϯά͸ΏΔ͞ΕΔ͔ʁ • ʮϦϑΝΫλϦϯά͢Δͳʯʹҧ൓ͯ͠Α͍͔ʁ • ʢԾʹɺͲΕ΋PHP8·Ͱʮಈ͘ʯͱͯ͠…ʣ • Aʮ݁ߏϦϑΝΫλϦϯάͯ͠ɺ৽͍͠෺Λ࢖͏ʯ • Bʮमਖ਼ൣғ͕গͳ͍͕ɺগʑݹΊ͔͍͠෺Λ࢖͏ʯ •

    CʮϥΠϒϥϦΛWrapͯ͠ɺࠓͷϨΨγʔίʔυʹ߹Θͤ Δʯ
  112. յΕ͍ͯͳ͍͕͘͢͝ݹ͍ϥΠϒϥϦ͸ʁ • ݹͯ͘ɺ੩తղੳ͕ΤϥʔΛͩ͠·͍ͬͯͯ͘ɺηΩϡϦςΟ తʹ΋Α͘Θ͔Βͳͯ͘ɺ഑෍ݩ͕௵Ε͍ͯͯɺͰ΋ಈ͘ • ΋͏ਖ਼ղ͸Θ͔Γ·͢Ͷʁ • ͍·͸৮Βͳ͍ • ͦΕ͸όʔδϣϯΞοϓͱؔ܎͕ͳ͍

    • (ผͰࠩ͠ସ͑ͯɺrebase͢Δͱ͔͸͋ΔͰ͠ΐ͏͕)
  113. ։ൃϒϥϯνͷ৽نػೳͷ௥ैʹ͍ͭͯ • ͜Ε͸ݱ৔ʹΑΔͷ͕ͩ… • ৼΓग़͠ײ͕ͭΒ͍ΑͶɺΘ͔Δ • ϨΨγʔίʔυ෦෼ͷϦϑΝΫλ͚ͩ͸΍Ίͯ΋Β͏ • ʮਵ࣌Ϛʔδ͕Ͱ͖Δͱ͍͍Ͱ͢Ͷʯʢئ๬ʣ •

    ςετॻ͍ͯཉ͍͕͠ɺڠྗ౓ɺཧղ౓ɺमཏ৔౓ʹΑΔ • ·͋ɺఘΊ͕ॏཁɻऴΘΓΑ͚Ε͹શͯྑ͠
  114. େମͰ͖ͨΒ • ਓྗͰ΋͕Μ͹ͬͯνΣοΫ͢Δ • શһͰ΍ΔɺશһʹؔΘΒͤΔ • ͳʹͤɺμϝͩͬͨΒશһ͕ਏ͍ͧʁ • ςετൈ͚͕Έ͔ͭͬͨΒɺඞͣͦΕΛςετʹ௥Ճ͢Δ •

    ʮ΋͏σϓϩΠ͠Α͏Α…ʯϨϕϧ·Ͱ͏Μ͟ΓͰ͖ͨΒ…
  115. ʮδΣϩχϞʂʂʯ (σϓϩΠ͢Δ࣌ͷֻ͚੠) Jump in!!!!

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

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

    (͜͜Ͱࢄʑͳ໨ʹ͋͏ࣄ͕͋Γ·͕͢ɺؤுΖ͏)
  118. ʮਫ਼ਆ࿦͡ΌͶʔ͔ʂʯ • ೔ৗʹվળϑϩʔ͕ग़དྷΔ·Ͱ͸ ͜͏ͳΔͰ͠ΐ͏ • δϟϯϓͷͨͼʹHP͕࡟ΕΔͷͰɺ୔ࢁ͢ΔͱͭΒ͍ • ͔͠͠δϟϯϓ͠ͳ͍ͱઌʹਐΊͳ͍ • δϟϯϓͪ͠Ό͑͹ɺҊ֎Ͳ͏ʹ͔ͳΔ(ָ؍࿦)

    • ා͕ͬͯσϓϩΠ͠ͳ͍ͷ͕Ұ൪΍͹͍ͬͯ ͦΕΈΜͳݴͬͯΔ͔Β
  119. ଓ͘… • ʮ΍ͬͨͬʂୈҰ෦׬ʂʂʯ • ͔࣍͠͠ͷڧఢ͕ଈ࠲ʹొ৔͢Δ… • ʮԶ͸όʔδϣϯΞοϓͷಓΛ্Γ࢝Ίͨ͹͔Γͩͥ…ʂʯ • ׬…

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

  121. ಈ͍ͨޙʹɺ͋Βͨͳઓ͍͕࢝·Δʂ • "Include Oriented PHP"͔Β୤٫͠ɺOOPɺAutoloaderԽ • ίʔσΟϯάن໿ͷద༻ • ςϯϓϨʔτΤϯδϯ΍ϧʔλʔͷ࡮৽ •

    ʮຊ෺ͷςετʯ΍ʮຊ෺ͷ੩తղੳʯɺCIɺCDԽ • ڧఢʹΈ͑·͢ʁ͍΍͍΍ʮண࣮ʹ΍Δʯͱେࠩͳ͍Ͱ͢Α • ΍͍͖ͬͯ·͠ΐ͏
  122. ʮ;Ήɺ100000ϑΝΠϧ͔ɺ༗ݶ࣌ؒ಺ʹऴΘΔͳʯ • Keep Calm and Carry On. "ฏ੩Λอͪɺීஈͷੜ׆Λଓ͚Α" • ࣮ࡍɺ΍Ε͹ऴΘΔʢܦݧஊʣ

    ౤͛ग़ͤ͹ऴΘΒͳ͍ʢܦݧஊʣ • ೔ʑͷϧʔνϯϫʔΫ΁ͷམͱ͠ࠐΈ(ࢥ૝,ಓ۩,ମ੍)͕ॏཁ • ͦΕ͕ࣗ৴ͱɺ࡞ۀϋʔυϧΛԼ͛Δ͜ͱʹܨ͕Γ·͢ • ·͋ɺͦΕ͸ผͷ࿩ͳͷͰɺ·͍͔ͨͭ
  123. վળ͸ऴΘΒͳ͍ ະ׬ ͋Γ͕ͱ͏͍͟͝·ͨ͠

  124. ͦͷଞڭ܇

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

    ͨʯ͚ͩͰʮѱʯͰ͸ͳ͍ɻࠓ΍͍ͬͯΔ࡞ۀͷޮ཰͕ॏཁ Ͱɺ׆ൃͳ৘ใڞ༗΍࿈ଳײ֦େ౳ͷ໨తΛ๨Ε͵ࣄ
  126. ίʔυϑΥʔϚοτɺઌʹ͔͚Δ͔ޙʹ͔͚Δ͔ʁ • ͓͢͢Ί͸ઌɺͳͥͳΒյΕͯ΋͜Ε͔Βؾ෇͘͠ ϞμϯIDEͰࣗಈ੔ܗΛΦϑʹͯ͠ॻ͘ͷ͸݁ߏۤ௧ • ૷০ੑ͸ؾʹͨ͠Βෛ͚ɺ࣌୅͸ΦʔτϑΥʔϚοτ • 2εϖʔε΍ϋʔυλϒΠϯσϯτ͸4εϖʔεʹ ݹࣜΏ͔͍͠૷০ੑͷߴ͍ίϝϯτ͸γϯϓϧʹ /**\n*ͳͲͷߦζϨ͸ؾʹͳͬͨΒ௚͢

    ۭനʹΑΔ =(୅ೖ) ἧ͑౳͸ແࢹ͢Δ
  127. ͦͷଞɺTypo΍ݹ͍ه๏ɺදهΏΕʹ͍ͭͯ • ʮಈؒ͘͸௚͞ͳ͍ʯ(Ұ෦్தͰ௚͢ࣄʹ͸ͳΔ) • TRUE▶trueɺVar_Dump("")ɺarray()▶[]ɺ"$a"▶"{$a}" • <?ɺ຤ඌͷ?>ɺ&=ɺvarɺreturn (true)?true:false; • ߦͷ෯੍ݶʢ͜Ε͸ແݶʹ͓ͯ͘͜͠ͱΛקΊΔʣ

    • ੩తղੳ͕׬શʹޮ͘ϨϕϧʹͳͬͨΒ௚͢ • (ͦͷ͜Ζʹ͸Auto fixΛ࢖ͬͯ΋յΕͳ͘ͳΔͰ͠ΐ͏)
  128. ϨϏϡʔ΋ςετدΓͷࢹ఺Ͱ • όʔδϣϯΞοϓ͸࡞ۀͳͷͰʮྑ͍ॻ͖ํʯͰ೪Βͳ͍ ͨͱ͑͹ʮ͜ͷif͸੔ཧͯ͠ૣظϦλʔϯʯͱ͔͸ະདྷʹ΍Δ • ϨϏϡʔ͸ʮͬ͞͞ͱऴΘΒͤΔʯͷࢹ఺Ͱ๬Ή΂͖ • ໪࿦ɺજࡏόά΍Τϥʔॲཧෆ଍౳͸ࢦఠ͢Δ • ͦͷ্Ͱɺ༠ಋֶशΑΓʮऴΘΔʯ͕େࣄ

    ߟ͑ͤ͞ΔΑΓ࣮ྫॻ͍ͨ΄͏͕ྑ͍
  129. ࠷ॳʹ૟আ͢Δ • ૬खʹ͢ΔίʔυΛݮΒ͢ɺ͜Ε͸ຊ౰ʹഅࣛʹͳΒͳ͍ • ϩάௐࠪɾฉ͖ࠐΈௐࠪΛͨ͠Βɺ૯ίʔυྔ7ׂΛ઎ΊΔό ΧͰ͔͍ΤϯυϙΠϯτΛ·Δ͝ͱ௵ͯ͠ྑ͍έʔε΋͋ͬͨ • ͱͬͯ͋Δ͚ͩ Λ૬खʹ͢ΔόΧόΧ͠͞͸ຊ౰ʹͻͲ͍ •

    ʢͨͩʮ͜Ε͸ΰϛͰ͸ʁʯͱ͍ͬͯফͯ͠શ෦͕ͱ·ͬͨ αʔϏε΋஌͍ͬͯ·͢ʣ • ʮ͜Εɺ·͍ͩΓ·͢ʁফ͠·ͤΜʁʯ΋ॏཁͰ͢
  130. ϑΝΠϧΛফͯ͠Α͍͔҆৺͢ΔςΫ • ʮ͜ͷϑΝΠϧ͸ফͯ͠΋ྑ͍ഺʯͱ͓΋ͬͨΒɺͦͷίʔυ ʹΞΫηε͕͋ͬͨΒϩάΛग़͢Α͏ʹ͢Δͱྑ͍ɻϚʔΫ୅ ΘΓʹ΋ͳΔɻ • ྫ:error_log("Unexcepted use :".__FILE__, 3,

    "/tmp/log"); ʢϩάج൫ʹͳ͕͢ͷ͸OK͕ͩɺΤϥʔϩάͱ؆୯ʹ෼཭Ͱ͖ Δ͜ͱɻSlackʹྲྀ͢ͷ΋Goodʣ • ೲಘͨ͠ΒɺఆܕจͰ୳ͯ͠ফ͢ɻ
  131. ͨ·ʹ͋ΔɺγϦΞϥΠβඇޓ׵ • ԿΒ͔ͷσʔλɾΦϒδΣΫτΛจࣈྻͳͲʹʢͨͱ͑͹ JSONʣม׵ͯ͠อଘ͢Δ͜ͱ͕Α͋͘Δ͕ɺ͜ΕͷσγϦΞϥ Πζͷޓ׵ੑ͕ফ͑Δࣄ͕͋Δ • (ΫϥεΛमਖ਼ͨ͠ΒdeserializeͰ͖ͳ͘ͳΔࣄ͸Α͋͘Δʣ • serializeɺencode·ΘΓ͸ॏ఺తʹνΣοΫ͢Δ͜ͱ •

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

    ͜Ε·ͨඇৗʹਏ͍ɺ͕Μ͹Ζ͏
  133. Ϗοάʹ͍͔͘ɺࠁΉ͔ • ͲΕ͘Β͍ͷස౓ͰϝΠϯϒϥϯνͱϚʔδ΍ϦϕʔεΛ͢Δ ͔ • όʔδϣϯΞοϓʹؔͯ͠͸ɺ ࡉ͔͗͘͢͠ΔͱӬԕʹऴΘΒͳ͍͜ͱ͕͋Δ • ͋Δఔ౓͸ϏοάˍϑϦʔζΛ͓͢͢Ί͢Δ •

    ػೳ௥ՃΛ͢Δͳͱ͍͏͜ͱͰͳ͘ɺϝϦϋϦΛ͚ͭΔ • ϦϑΝΫλϦϯάϑΣʔζͰ͸ࠁΜͩ΄͏͕ྑ͍
  134. ϨΨγʔγεςϜվળ͸ϝϯλϧʹ஫ҙ • େମධՁ͞Εͳ͍͠ɺਐԽͷϒϩοΧʔʹͳΔࣄ΋ଟ͍ • σϓϩΠͰյͤ͹མͪࠐΉ͠ɺѱ͚Ε͹ެࣜँࡑʹͳΔ • ʮؾʹ͢Δͳʂʯͱ͔͍ΘΕͯ΋ ؾʹ͠ͳ͍ਓؒ͸·͍ͣͳ͍ • ͦΕ͸ී௨ͳͷͰɺਏ͘ͳͬͨΒએݴ͢ΔɺͲΜͲΜଉൈ͖͢

    Δ • ෆຬ͸ෛ࠴ಉ༷ɺͨ·Δલʹओுͯ͠ શһ Ͱॲཧ͢Δ
  135. ຊ౰ͷࢿ࢈͜ͱγφϦΦςετ • ϨΨγʔγεςϜվળͰ࣮ײ͢Δ • ͋ΒΏΔػೳ͸࠶࣮૷Ͱ͖Δ • ͋ΒΏΔػೳ͸ஔ׵Ͱ͖Δ • ͔͠͠ɺγφϦΦςετ͕ͳ͍ͱʮΘ͔Βͳ͍ʯ •

    όʔδϣϯ΍ɺϑϨʔϜϫʔΫͷ৽چ͸ϚδͰؔ܎ͳ͍ • ·ͣ͸ਖ਼ৗܥγφϦΦςετ͕όʔδϣϯΞοϓʹ͸ॏཁ