Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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ࣾͷ։ൃ͕ݩ • ※PHPStanPHPMDͱͷൺֱࠓճ͠·ͤΜ
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ͷΞϊςʔγϣϯͱ͔ʣ ͏ͷ͋Γʁͳ͠ʁ