Slide 1

Slide 1 text

੩తղੳͷҭͯํ PHPerKaigi 2020 Yuichi Sugiyama @oogFranz

Slide 2

Slide 2 text

Whoami • ਿࢁ ༞Ұ @oogFranz • αΠϘ΢ζ5೥໨ΤϯδχΞ • ෳۀδϟζϛϡʔδγϟϯ@MASHݭָஂ • Spotify, Apple MusicͳͲͰ഑৴தʂ

Slide 3

Slide 3 text

αΠϘ΢ζ Garoon • େن໛޲͚ͷάϧʔϓ΢ΣΞ • ੜ࢈ੑɾνʔϜϫʔΫ޲্ͷࢧԉ

Slide 4

Slide 4 text

αΠϘ΢ζ Garoon • PHPͱMySQLͰͰ͖ͯΔWebΞϓϦέʔγϣϯ • ։ൃ18೥໨ • PHP͸ 4͔Β7.2ʹ • PHPͷίʔυ͸180ສߦ͘Β͍

Slide 5

Slide 5 text

αΠϘ΢ζ Garoon • PHPͱMySQLͰͰ͖ͯΔWebΞϓϦέʔγϣϯ • ։ൃ18೥໨ • PHP͸ 4͔Β7.2ʹ • PHPͷίʔυ͸180ສߦ͘Β͍ ͳ͔ͳ͔ϨΨγʔʂ

Slide 6

Slide 6 text

ϨΨγʔίʔυΛ៉ྷʹͯ͠΍Δʂ ·ͣ͸طଘ࣮૷ΛΑ͘ಡΜͰΈΑ͏ʂ ϨΨγʔʹཱͪ޲͔͓͏ʂ

Slide 7

Slide 7 text

খੴʹͭ·ͣ͘ PHPDoc͕ͳͯ͘
 ίʔυ͕௥͑ͳ͍ɻɻɻ ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ
 ͦ΋ͦ΋୭΋ݺͼग़ͯ͠ͳ͍ɻɻɻʁ ͜͜ͷίʔυTypo͹͔ͬΓɻɻɻ

Slide 8

Slide 8 text

খੴʹͭ·ͣ͘ PHPDoc͕ͳͯ͘
 ίʔυ͕௥͑ͳ͍ɻɻɻ ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ
 ͦ΋ͦ΋୭΋ݺͼग़ͯ͠ͳ͍ɻɻɻʁ ͜͜ͷίʔυTypo͹͔ͬΓɻɻɻ ຊ࣭తͳ໰୊ʢઃܭͳͲʣʹͨͲΓண͘લʹɺ
 খ͞ͳ໰୊͕ؾʹͳͬͯίʔυϦʔσΟϯά͕ਐ·ͳ͍

Slide 9

Slide 9 text

খੴʹͭ·ͣ͘ PHPDoc͕ͳͯ͘
 ίʔυ͕௥͑ͳ͍ɻɻɻ ͜͜ͷίʔυͣͬͱಡΜͰ͚ͨͲɺ
 ͦ΋ͦ΋୭΋ݺͼग़ͯ͠ͳ͍ɻɻɻʁ ͜͜ͷίʔυTypo͹͔ͬΓɻɻɻ ·ͣ͸খੴΛআڈ͢Δɻ
 ੩తղੳπʔϧΛೖΕΑ͏ʂ

Slide 10

Slide 10 text

੩తղੳͱ͸ʁ • ίʔυΛ࣮ߦͤͣʹߦ͏ݕূ • ಈతղੳɿUnit TestɺϚχϡΞϧςετ • ςετ͕ͳ͍ϨΨγʔϓϩμΫτͰ΋ಋೖՄೳ

Slide 11

Slide 11 text

Phan • https://github.com/phan/phan • PHPDocͰܕਪ࿦΋͢Δ੩తղੳπʔϧ • Etsyࣾͷ։ൃ͕ݩ • ※PHPStan΍PHPMDͱͷൺֱ͸ࠓճ͸͠·ͤΜ

Slide 12

Slide 12 text

΍ͬͯΈͨ

Slide 13

Slide 13 text

ਘৗ͡Όͳ͍issue਺

Slide 14

Slide 14 text

ਘৗ͡Όͳ͍issue਺ ղੳ݁ՌΛॖখදࣔͨ͠΋ͷʢҰ෦ʣ

Slide 15

Slide 15 text

ਘৗ͡Όͳ͍issue਺ • ͦΕ·Ͱ੩తղੳͰอޢ͞Ε͍ͯͳ͍ίʔυ͸
 جຊతʹແ਺ͷissue͕ใࠂ͞ΕΔ • ·ͱ΋ʹऔΓ߹͏ͱ৺͕ંΕΔ • Τϥʔͷใࠂ͕গͳͯ͘΋·ͣ͸CIʹೖΕ͍ͨ

Slide 16

Slide 16 text

ਘৗ͡Όͳ͍issue਺ • ͦΕ·Ͱ੩తղੳͰอޢ͞Ε͍ͯͳ͍ίʔυ͸
 جຊతʹແ਺ͷissue͕ใࠂ͞ΕΔ • ·ͱ΋ʹऔΓ߹͏ͱ৺͕ંΕΔ • Τϥʔͷใࠂ͕গͳͯ͘΋·ͣ͸CIʹೖΕ͍ͨ ग़ͯΔJTTVFͷछྨ͝ͱʹରॲͯ͠
 ͻͱ·ͣ$*Λಋೖ͢Δ

Slide 17

Slide 17 text

Phanͷ৔߹ʢconfig.phpʣ

Slide 18

Slide 18 text

Phanͷ৔߹ʢconfig.phpʣ TVQQSFTT@JTTVF@UZQFT ཈੍͍ͨ͠*TTVF5ZQFΛ
 ྻڍ͢Δ

Slide 19

Slide 19 text

• Phanͷ࣮ߦ݁Ռ͔Βੜ੒Ͱ͖Δ suppress_issue_types $cat analysis.txt | cut -f 2 -d ' '|\ sort -u | sed "s/^/'/g" | sed "s/$/',/g"

Slide 20

Slide 20 text

• Phanͷ࣮ߦ݁Ռ͔Βੜ੒Ͱ͖Δ suppress_issue_types $cat analysis.txt | cut -f 2 -d ' '|\ sort -u | sed "s/^/'/g" | sed "s/$/',/g" $*͕ಋೖͰ͖ͨʂ

Slide 21

Slide 21 text

• Phanͷ࣮ߦ݁Ռ͔Βੜ੒Ͱ͖Δ suppress_issue_types $cat analysis.txt | cut -f 2 -d ' '|\ sort -u | sed "s/^/'/g" | sed "s/$/',/g" ͕ɺ΄΅Τϥʔใࠂ͸͞Εͳ͍ɻɻɻ

Slide 22

Slide 22 text

• Phanͷ࣮ߦ݁Ռ͔Βੜ੒Ͱ͖Δ suppress_issue_types $cat analysis.txt | cut -f 2 -d ' '|\ sort -u | sed "s/^/'/g" | sed "s/$/',/g" ͔͜͜Β੩తղੳΛҭͯΑ͏ʂ

Slide 23

Slide 23 text

੩తղੳͷҭͯํ

Slide 24

Slide 24 text

੩తղੳΛҭͯΔϧʔϓ ௚͢Issue TypeΛ
 ܾΊΔ ͥΜͿ௚͢ CIʹ൓ө͢Δ ʢsuppress_issue_types͔Βͳ͘͢ʣ

Slide 25

Slide 25 text

੩తղੳΛҭͯΔϧʔϓ ௚͢Issue TypeΛ
 ܾΊΔ ͥΜͿ௚͢ CIʹ൓ө͢Δ ʢsuppress_issue_types͔Βͳ͘͢ʣ ΍Έ͘΋ʹରॲͩ͢͠ͱͭΒ͍ͷͰɺ
 ҭ͕͍ͯͷ͋Δ*TTVF5ZQFΛޮ཰Α͘୳͍ͯ͜͠͏

Slide 26

Slide 26 text

ҭ͕͍ͯͷ͋ΔIssue TypeΛ୳࣠͢ ΤϥʔͷՄೳੑ͕ߴ͍͔ ϦεΫ ίετ ؆୯ʹ௚ͤΔ͔

Slide 27

Slide 27 text

ҭ͕͍ͯͷ͋ΔIssue TypeΛ୳࣠͢ ΤϥʔͷՄೳੑ͕ߴ͍͔ ϦεΫ ίετ ؆୯ʹ௚ͤΔ͔

Slide 28

Slide 28 text

ϦεΫ: ΤϥʔͷՄೳੑ͕ߴ͍͔ • ࠓ͸ۮવಈ͍͍ͯΔ • ݺͼग़͠ํʹΑͬͯ͸࣮ߦ࣌ΤϥʔʹͳΔ • ࣅͨΑ͏ͳίʔυ͕૿͑Δલʹஅͪ੾Γ͍ͨ • ΤϥʔϨϕϧΛઃఆͯ͠੩తղੳ͢Δ

Slide 29

Slide 29 text

Phanͷ৔߹ʢconfig.phpʣ

Slide 30

Slide 30 text

Phanͷ৔߹ʢconfig.phpʣ NJOJNVN@TFWFSJUZ ൃੜͤ͞ΔΤϥʔϨϕϧͷઃఆ

Slide 31

Slide 31 text

Phanͷ৔߹ʢconfig.phpʣ ҰԠஈ֊͕ͩɺ࣮࣭ Issue::SEVERITY_LOW; Issue::SEVERITY_NORMAL; Issue::SEVERITY_CRITICAL; ͷ̏ஈ֊ NJOJNVN@TFWFSJUZ ൃੜͤ͞ΔΤϥʔϨϕϧͷઃఆ

Slide 32

Slide 32 text

PhpStormͷ৔߹: Inspect Code • PhpStorm https://www.jetbrains.com/ja-jp/phpstorm/ • ΈΜͳେ޷͖PHPͷIDE • ϓϩδΣΫτ಺ͷҟৗίʔυΛ
 ϑΝΠϧΛ։͚ͩ͘Ͱݕग़ͯ͘͠ΕΔʂ • ϓϩδΣΫτશମͷInspectionϨϙʔτΛ
 ग़ྗͰ͖Δ

Slide 33

Slide 33 text

Inspect Code • Find Action (Ctrl + Shift + A, ⌘+⇧+A )ʹ
 “Inspect”ͱೖΕͯΈΔ

Slide 34

Slide 34 text

• ॏཁ౓ผʹInspection ݁Ռ͕ग़ྗ͞ΕΔ Inspect Code

Slide 35

Slide 35 text

খωλ • Inspection͕࣮ߦͰ͖ͳ͍ͱ͖͸ϝϞϦΛ଍͢ • Help -> Change Memory Setting͔ΒมߋͰ͖Δ

Slide 36

Slide 36 text

ҭ͕͍ͯͷ͋ΔIssue TypeΛ୳࣠͢ ΤϥʔͷՄೳੑ͕ߴ͍͔ ϦεΫ ίετ ؆୯ʹ௚ͤΔ͔

Slide 37

Slide 37 text

ίετ: ؆୯ʹ௚ͤΔ͔ • ָʹमਖ਼Ͱ͖Δ͜ͱ͔Β࢝ΊΑ͏ • ਺ͷগͳ͍Issue TypeΛ୳͢ • ػցతʹमਖ਼Ͱ͖ΔIssueΛ୳͢ • ෆཁίʔυ࡟আ

Slide 38

Slide 38 text

• Phanͷ࣮ߦ݁Ռ͔Βݟસ͏ • PhanͷWikiʹ͋ΔίϚϯυ ਺ͷগͳ͍Issue Type https://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base $cat analysis.txt | cut -d ' ' -f2 |\ sort | uniq -c | sort -n -r

Slide 39

Slide 39 text

• Phanͷ࣮ߦ݁Ռ͔Βݟસ͏ • PhanͷWikiʹ΋ॻ͍ͯ͋ΔίϚϯυ ਺ͷগͳ͍Issue Type https://github.com/phan/phan/wiki/Tutorial-for-Analyzing-a-Large-Sloppy-Code-Base $cat analysis.txt | cut -d ' ' -f2 |\ sort | uniq -c | sort -n -r ؤுΕ͹௚ͤͦ͏

Slide 40

Slide 40 text

਺ͷଟ͍Issue Type • 1ߦमਖ਼͢Δ͚ͩͰɺ਺ඦͷIssueΛ
 ফ͢͜ͱ͕Ͱ͖Δ৔߹΋͋Δ • PHPDoc͕͓͔͍͠ͱ͔

Slide 41

Slide 41 text

਺ͷଟ͍Issue Type • 1ߦमਖ਼͢Δ͚ͩͰɺ਺ඦͷIssueΛ
 ফ͢͜ͱ͕Ͱ͖Δ৔߹΋͋Δ • PHPDoc͕͓͔͍͠ͱ͔ /** * @return Barɺ઀ଓʹࣦഊͨ͠৔߹͸false */ public function foo() { ɹ… }

Slide 42

Slide 42 text

਺ͷଟ͍Issue Type • 1ߦमਖ਼͢Δ͚ͩͰɺ਺ඦͷIssueΛ
 ফ͢͜ͱ͕Ͱ͖Δ৔߹΋͋Δ • PHPDoc͕͓͔͍͠ͱ͔ /** * @return Barɺ઀ଓʹࣦഊͨ͠৔߹͸false */ public function foo() { ɹ… } ϊΠζʹͳΔͷͰαΫοͱ௚ͦ͏

Slide 43

Slide 43 text

ػցతʹमਖ਼Ͱ͖ΔIssue • PhpStormͷ͍͔ͭ͘ͷInspectionʹ͸
 Auto fixػೳ͕෇͍͍ͯΔ

Slide 44

Slide 44 text

PhpStormͷAuto fix • ͲͷInspectionʹAuto fix͕͋Δ͔͸
 ࣮ࡍʹ΍ͬͯΈΔ͔͠ͳͦ͞͏ • ΋ͷʹΑͬͯ͸Auto fixͰ΋յΕΔ͜ͱ͕͋ΔͷͰ৻ॏ • Auto fix͕෇͍͍ͯΔ͜ͱ͕ଟ͍ͷ͸ɺ • Unnecessary ~ܥͷInspection • Code StyleܥͷInspection • Missing ~ ܥͷPHPDocͷInspection

Slide 45

Slide 45 text

Run Inspection by Name • Inspectionͷ໊લΛࢦఆ࣮ͯ͠ߦͰ͖Δ

Slide 46

Slide 46 text

ෆཁίʔυ࡟আ • ϑΝΠϧɾϝιουɾΫϥε୯ҐͰ͋Ε͹ɺ
 ୯ʹ࡟আ͢Δ͚ͩͰΑ͍ • ෆཁίʔυ͸ͦ΋ͦ΋࣮ߦ͞Ε͍ͯͳ͍ͷͰɺ
 ෆ۩߹ίʔυ͕࢒͍ͬͯΔ͜ͱ΋ଟ͍ • ੩తղੳͷअຐʹ΋ͳΔͷͰ
 ·ͣ࡟আ͢Δͷ͕Φεεϝ

Slide 47

Slide 47 text

ෆཁίʔυͷݟ͚ͭํ • PhpStormͷUnused ~ ܥͷInspection • Phanͷ--dead-code-detection

Slide 48

Slide 48 text

੩తղੳ͕νʔϜΛҭͯΔ

Slide 49

Slide 49 text

੩తղੳͰϨϏϡʔ͕͔ΘΔ • ϨϏϡʔͰ΋খ͍͞ࢦఠ͕ଟ͘ͳΔͱɺ
 ຊ࣭తͳେ͖ͳ໰୊΁ͷࢦఠ͕೉͘͠ͳΔ • ϓϧϦΫͷখੴ͕গͳ͘ͳΕ͹ɺ
 ͦΕ͚ͩຊ࣭తͳ໰୊ͷϨϏϡʔ͕Մೳʹ • ؍఺ΛߜΓࠐΜͰͷϨϏϡʔ

Slide 50

Slide 50 text

؍఺ΛߜΓࠐΜͰͷϨϏϡʔ ৿࡚म࢘ஶؒҧ͍ͩΒ͚ͷઃܭϨϏϡʔ<վగ൛>1ΑΓҾ༻

Slide 51

Slide 51 text

੩తղੳ͕νʔϜΛҭͯΔ • ϨϏϡʔͰখ͍͞ࢦఠΛ͠ͳͯ͘Α͘ͳΔͷͰ
 ຊ࣭తͳ఺ΛϨϏϡʔͰ͖Δ • νʔϜϝϯόʔ͕ࣗવͱྑ͍
 ίʔσΟϯάΛֶ΂Δ • طଘίʔυͱҰ؏ੑΛ࣋ͬͯ
 ৽نίʔυΛॻ͖΍͘͢ͳΔ

Slide 52

Slide 52 text

·ͱΊ • খ͞ͳ໰୊ΛݮΒ͢ɾ૿΍͞ͳ͍ͨΊʹ
 ੩తղੳ͸໾ʹͨͭ • ϦεΫͷߴ͍ͱ͜Ζ͔Βɺ੩తղੳΛҭͯΑ͏ • ίετͷ௿͍ͱ͜Ζ͔Βɺ੩తղੳΛҭͯΑ͏ • ੩తղੳΛҭͯΔͱνʔϜ͕ҭͭ

Slide 53

Slide 53 text

Speaker asks… • @suppress, @noinspectionͳͲΛ࢖͏ͷ͸
 ͋Γʁͳ͠ʁϧʔϧʁ • IDEΛνʔϜͰ౷Ұ͍ͤͨ͞೿ͳΜͰ͕͢ɺ
 Έͳ͞ΜͲ͏Ͱ͔͢ʁ • ੩తղੳͷίΞͳػೳʢPhanͷΞϊςʔγϣϯͱ͔ʣ
 ࢖͏ͷ͋Γʁͳ͠ʁ