Slide 1

Slide 1 text

!GSPNLL5JNFST*OD ⚠9DPEFͰͳΔ΂͘ૣ͘UZQPʹؾ෇͖͍ͨ

Slide 2

Slide 2 text

1SPpMF struct Profile { let name = "Kazuya Ueoka" let twitter = "@fromkk" let github = "fromkk" let qiita = "fromkk" let company = "Timers Inc." } •

Slide 3

Slide 3 text

UZQPͱ͸ʁ w UZQPHSBQIJDBMFSSPSͷུɻͱΓΘ͚ɺλΠϙͱ͍͏໊ࢺͰɺί ϯϐϡʔλʹ͓͚ΔΩʔϘʔυͷλΠϓϛεΛࢦ͠ɺҰ෦ͷӳ ࿨ࣙయʹ΋UZQPͷهࡌ͕͋Δɻ 3 Ҿ༻IUUQTKBXJLJQFEJBPSHXJLJλΠϙ

Slide 4

Slide 4 text

ಥવͰ͕͢

Slide 5

Slide 5 text

UZQP͸޷͖Ͱ͔͢ʁ

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

͜Ε·Ͱͷ5JNFSTʹ͓͚Δ׆ಈ w 1VMM3FRVFTU࡞੒࣌ʹ$* #JUSJTF ্Ͱ%BOHFSΛ࣮ߦ͍ͯͨ͠ w DTQFMMͱ͍͏πʔϧΛར༻ 7

Slide 8

Slide 8 text

8 # cspell # npm install -g cspell added_and_modified_files = git.added_files + git.modified_files added_and_modified_files.each do |file_path| next unless file_path =~ /.swift$/ stdout, status = Open3.capture2("npx", "cspell", file_path, "-c", "cspell.json") next if status.success? stdout.split("\n").each do |line| next unless matches = /\w.swift:(\d+).*-\sUnknown\sword\s\((\w+)\)/.match(line) line_number = matches[1].to_i word = matches[2] warning = "typo? #{word}" warn(warning, file: file_path, line: line_number) end end ࢀߟIUUQTTQFBLFSEFDLDPNZILBQMBOBVUPNBUFBMMUIFUIJOHT TMJEF

Slide 9

Slide 9 text

9

Slide 10

Slide 10 text

1VMM3FRVFTU࡞੒ޙͰ͸஗͍ ՝୊

Slide 11

Slide 11 text

1VMM3FRVFTU࡞੒ޙͰ͸஗͍ ՝୊ ˣ ίʔσΟϯάதʹؾ͖͍ͮͨ

Slide 12

Slide 12 text

9DPEFͰXBSOJOHΛදࣔ͢Δํ๏ 12

Slide 13

Slide 13 text

9DPEFͰXBSOJOHΛදࣔ͢Δํ๏ w 3VO4DSJQUதʹඪ४ग़ྗʹwarning: $message Λग़ྗ͢Δ 13

Slide 14

Slide 14 text

ϑΝΠϧΛࢦఆͯ͠XBSOJOH w /path/to/file: warning: $messageʹมߋ 14

Slide 15

Slide 15 text

ߦ਺Λࢦఆͯ͠XBSOJOH w /path/to/file:$line: warning: $messageʹมߋ 15

Slide 16

Slide 16 text

֘౰ͷจࣈΛࢦఆͯ͠XBSOJOH w /path/to/file:$line:$column: warning: $messageʹม ߋ 16

Slide 17

Slide 17 text

UZQPͷ৔ॴ͕෼͔Ε͹XBSOJOHग़ͤΔʂ

Slide 18

Slide 18 text

18 εϖϧͷνΣοΫํ๏

Slide 19

Slide 19 text

19 εϖϧͷνΣοΫํ๏

Slide 20

Slide 20 text

XBSOJOHΛແࢹ͍ͨ͠΋ͷϦετ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSTFUJHOPSFEXPSET

Slide 21

Slide 21 text

ݴޠͷઃఆ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSTFUMBOHVBHF

Slide 22

Slide 22 text

εϖϧͷνΣοΫ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSDIFDLTQFMMJOH

Slide 23

Slide 23 text

εϖϧͷमਖ਼ͷఏҊ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTTQFMMDIFDLFSDPSSFDUJPO

Slide 24

Slide 24 text

ग़དྷͦ͏

Slide 25

Slide 25 text

IUUQTHJUIVCDPNGSPNLL4QFMM$IFDLFS

Slide 26

Slide 26 text

IUUQTHJUIVCDPNGSPNLL4QFMM$IFDLFS 4UBS͕ԡͯ͠ཉͦ͠͏ʹͪ͜ΒΛݟ͍ͯΔ

Slide 27

Slide 27 text

Πϯετʔϧ 27 git clone [email protected]:fromkk/SpellChecker.git cd ./SpellChecker make install

Slide 28

Slide 28 text

࢖͍ํ /usr/local/bin/SpellChecker -- /path/to/FileA.swift /path/to/FileB.swift -yml WhiteList.yml Λࢦఆ͢ΔࣄͰwarningΛແࢹग़དྷΔ whiteList: - kazuya - ueoka - fromkk

Slide 29

Slide 29 text

9DPEFʹ3VO4DSJQUΛ௥Ճ if ! [ -f /usr/local/bin/SpellChecker ]; then echo "SpellChecker not installed" exit 0 fi git_path=/usr/local/bin/git files=$($git_path diff --diff-filter=d --name-only -- "*.swift" "*.h" "*.m") if (test -z $files) || (test ${#files[@]} -eq 0); then echo "no files changed." exit 0 fi options="" for file in $files do options="$options $SRCROOT/$file" done /usr/local/bin/SpellChecker -yml $SRCROOT/spell-checker.yml -- $options

Slide 30

Slide 30 text

%&.0

Slide 31

Slide 31 text

·ͱΊ w ͜Ε·Ͱ͸1VMM3FRVFTU࡞੒࣌ʹ%BOHFS্ͰDTQFMMΛୟ͘ࣄͰUZQPΛνΣο Ϋ͍ͯͨ͠☑ w 1VMM3FRVFTU࡞੒ޙʹϏϧυ͕૸͔ͬͯΒ%BOHFSͷ࣮ߦͩͱ஗͍ͷͰ9DPEF ͰίʔσΟϯάதʹؾ͖͔ͮͨͬͨ w $-*πʔϧΛ࡞੒ͯ͠3VO4DSJQU಺ͰXBSOJOHΛදࣔͤ͞Δ༷ʹ͢Δ͜ͱͰͳ Δ΂͘ૣ͘ؾ͚ͮΔ༷ʹͨ͠⚡ w ߋʹࡉ͔͍͜ͱ͸ࠓ೔ͷJ04"EWFOU$BMFOEBSʹॻ͘ͷͰͦͪΒ΋ݟ ͯͶ 31

Slide 32

Slide 32 text

ँࣙ w /44QFMM$IFDLFSͷ࢖͍ํΛௐ΂͍ͯΔதͰF[VSBTQFMM DIFDLFSGPSTXJGUΛൃݟ w ༻్͕ඃ͍ͬͯͨͷͰ։ൃΛଓ͚Δ͔೰Μ͕ͩ4XJGUϑΝΠϧઐ ༻ʹݟ͑ͨͷͰͦͷ··ܧଓ w ࢖͏৔߹͸ؾʹೖͬͨํΛར༻ͯ͠௖͚Ε͹ w /44QFMM$IFDLFSͷ࢖͍ํ͸ͱͯ΋ࢀߟͤͯ͞௖͖·ͨ͠ɻ͋Γ͕ ͱ͏͍͟͝·ͨ͠ 32

Slide 33

Slide 33 text

13

Slide 34

Slide 34 text

• αʔόʔαΠυΤϯδχΞ (PHP, Golang, AWS) • AndroidΤϯδχΞ (Kotlin) • iOSΤϯδχΞ (Swift) TimersͰ͸ݱࡏΤϯδχΞશ৬छ࠾༻தʂ ৄ͘͠͸”Timers”Ͱݕࡧ

Slide 35

Slide 35 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠