Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

࠷ॳʹ·ͱΊ

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

͸͍

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

΍Δؾ

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

࣌ؒ

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

౓ڳ

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

αϯϓϧ

Slide 46

Slide 46 text

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); } } }

Slide 47

Slide 47 text

࣍ϖʔδ΁ } }

Slide 48

Slide 48 text

// 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]);

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

# 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); }

Slide 51

Slide 51 text

$ 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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

࣮ߦྫ (௕͍) $ 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

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

ISUCONͷͱ͖ͷྫͰ͢

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

(࠶ܝ)Ϗοάδϟϯϓ͸೉͍͠ • 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)

Slide 88

Slide 88 text

վम࡞ۀ

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

ͦͷଞڭ܇

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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

Slide 135

Slide 135 text

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