Slide 1

Slide 1 text

OSSίϛολʔʹͳΖ͏ʂ 5/12 ϫʔΫγϣοϓ @ Money Forward @giginet 1/51

Slide 2

Slide 2 text

ࣗݾ঺հ • @giginet • Core Contributor of Carthage/fastlane/ XcodeGen etc... • https://github.com/giginet • https://twitter.com/giginet • ؾܰʹmention͍ͯͩ͘͠͞ʂ 2/51

Slide 3

Slide 3 text

! ໨త • ओʹiOS෼໺ͰͷOSS΁ͷίϛοτΛମݧΛ͢Δ • ࣮ࡍʹϚʔδ͞ΕΔΑ͏ͳPRΛૹΓɺOSSʹߩݙ͢Δ • ৺ཧతোนΛݮΒ͢ɻඞཁʹԠ͡OSSʹߩݙͰ͖ΔΑ͏ʹ͢ Δ • MoneyForward iOSΤϯδχΞؒͷަྲྀ • ϫʔΫγϣοϓ಺ͰऔΓ૊Μͩ՝୊Λݩʹަྲྀ͢Δ 3/51

Slide 4

Slide 4 text

⏱ λΠϜςʔϒϧ 14:00 ߨٛ 14:20~ ! OSSମݧϫʔΫγϣοϓ 17:20~ " ൃදձ + ࣗݾ঺հ 18:00~ # 4/51

Slide 5

Slide 5 text

PR͕Ϛʔδ͞ΕΔ·Ͱ 5/51

Slide 6

Slide 6 text

1. ωλ୳͠ 2. ௐࠪ 3. ࣮૷ 4. ςετ 5. Pull Request 6. Ϛʔδ ! 6/51

Slide 7

Slide 7 text

1. ωλ୳͠ • ԿΛ࣮૷͢Δ͔ܾΊΔ • OSSߩݙʹ͓͍ͯҰ൪೉͍͠ • ՝୊ൃݟΛͲͷΑ͏ʹ͍͔͕ͯ͘͠ॏཁ 7/51

Slide 8

Slide 8 text

i. ࢖͍ͬͯͯػೳཁ๬΍όάΛݟ͚ͭΔ • ೔ৗతʹ࢖͍ͬͯΔπʔϧ΍OSSͷதͰෆ۩߹΍ཁ๬Λൃݟ͢ Δ • ͜Μͳػೳཉ͍͠ • ͜ͷڍಈʹࠔͬͨ • typoൃݟ • Ұ൪ྑ͍՝୊ൃݟํ๏͕ͩɺ͜Ε͕Ͱ͖Ε͹ۤ࿑͠ͳ͍ 8/51

Slide 9

Slide 9 text

ii. issueτϥοΧʔΛݟΔ • ීஈ࢖͍ͬͯΔϥΠϒϥϦɺπʔϧ΍ɺ༗໊OSSʹ͍ͭͯ GitHub issueΛோΊͯΈΔɻͳΜͱͳ͘՝୊͕΄͍͠৔߹ʹ޲ ͍͍ͯΔɻ • ϓϩδΣΫτʹΑͬͯ͸ॳ৺ऀ׻ܴϥϕϧ͕෇͍͍ͯΔ৔߹΋ • appleͷϦϙδτϦ͸Good First Issue ϥϕϧ͕෇͍͍ͯΔ ͷͰɺमߦʹ͍࣋ͬͯ͜ 9/51

Slide 10

Slide 10 text

iii. υΩϡϝϯτͷߩݙɺ • ίϚϯυͷϛεɺtypoɺϦϯΫ੾ΕͳͲ͸Α͘ݟ͚ͭΒΕΔͷ Ͱݟ͚ͭͨΒŢœŕͱ௚ͤΔ • ܰඍͳमਖ਼Ͱ΋໰୊ͳ͍ɻ 10/51

Slide 11

Slide 11 text

ߩݙ͠΍͍͢issue • Ϛʔδͷ͞Ε΍͢͞ • ෆ۩߹ɺΤοδέʔεͷߟྀ࿙ΕͳͲɺؒҧ͍ͬͯΔ͜ͱ͕ ໌֬ͳ΋ͷ • issue্Ͱٞ࿦͕ਐΜͰ͓Γɺ࣮૷଴ͪͷঢ়ଶͷ΋ͷ(ϥϕϧ ͳͲ͕෇͍͍ͯΔέʔε΋) • ޙํޓ׵Λ่͞ͳ͍΋ͷɻ໭ͯ͠΋໰୊ͳ͍΋ͷ 11/51

Slide 12

Slide 12 text

ߩݙ͕େมͳissue • େن໛ͳػೳ௥Ճ͸Ϛʔδ·Ͱ೉͍͠ • ࢓༷΍࣮૷ʹ͍ͭͯɺAuthorͱٞ࿦ͯ͠ຏ͘ඞཁ͕͋Δ • ద੾ͳ࢓༷͔ • ߟྀ࿙Ε͸ͳ͍͔ • ίʔσΟϯάنൣʹଇ͍ͯ͠Δ͔ɾΑΓྑ͍ॻ͖ํ͸ͳ͍ ͔ 12/51

Slide 13

Slide 13 text

ωλ୳͕͠Ұ൪೉͍͠ • OSSʹߩݙ͠Α͏ͱ͍͏ϞνϕʔγϣϯΛ࡞Δͷ͕Ұ൪೉͍͠ • ΍Δ͜ͱ͕໌֬ͩͬͨΓɺࣗ෼ʹͱͬͯඞཁͳΒखΛ෇͚΍͢ ͍ • ࠓճ͸͍͔ͭ͘खΛ෇͚΍͍͢issueΛ༧Ί୳͖ͯͨ͠ͷͰɺ͜ ͷաఔΛ͋Δఔ౓εΩοϓͰ͖·͢ 13/51

Slide 14

Slide 14 text

2. ௐࠪ 14/51

Slide 15

Slide 15 text

ௐࠪͷखॱ 1. ։ൃ؀ڥͷߏங 2. ࠶ݱঢ়گͷ༻ҙ 3. ݪҼͷௐࠪ • σόοΨʔͷར༻ 15/51

Slide 16

Slide 16 text

1. ։ൃ؀ڥͷߏங • ϦϙδτϦͷclone • Ϗϧυ؀ڥͷߏங • खݩͰ࣮ߦͰ͖ΔΑ͏ʹ͢Δ 16/51

Slide 17

Slide 17 text

2. ࠶ݱঢ়گͷ༻ҙ • ࠷খ࠶ݱ؀ڥΛ࡞Δ • ৽نϓϩδΣΫτ࡞੒ɺcloneͨ͠ґଘϥΠϒϥϦΛऔΓࠐΉ • લఏ৚݅Λௐ΂Δɺ༻ҙ͢Δ • ಛఆͷঢ়گԼͰ໰୊͕ى͖Δͱ͖ɺͦͷέʔεΛ༻ҙ͢Δ ʢઃఆϑΝΠϧͳͲʣ • ςετέʔεͷ༻ҙ 17/51

Slide 18

Slide 18 text

3. ݪҼͷௐࠪ • lldb(σόοΨʔ)ɺbreakpointͳͲɺ௨ৗͷσόοάख๏Λۦ࢖ ͢Δʢޙड़ʣ 18/51

Slide 19

Slide 19 text

ςετίʔυͷ࣮૷ • ͘͢͝େࣄɻ࣮૷1ߦʹରͯ͠ςετ͸਺ഒͱ͍͏ͷ͸βϥ • ઌʹςετέʔε͔Βॻ͍ͯ΋ྑ͍(TDD) 19/51

Slide 20

Slide 20 text

ྑ͍ςετ • PRͷલʹςετ͕མ͍͕ͪͯͨɺमਖ਼ʹΑͬͯ௚ΔΑ͏ͳςε τ͕ཧ૝త • ૝ఆ͞ΕΔΤοδέʔε΍೉͍͠ঢ়گ͕໢ཏ͞Ε͍ͯΔ • Α͍ςετέʔε͕͋ΔͱϨϏϡʔ͞Ε΍͍͢ɹ 20/51

Slide 21

Slide 21 text

PRΛग़͢ 21/51

Slide 22

Slide 22 text

Description • ʮ΍Γ͍ͨ͜ͱʯʮલఏ৚݅ʯʮͲͷΑ͏ʹղܾ͔ͨ͠ʯʮͦ ͷଞݒ೦ʯ • ςϯϓϨʔτʹԊ͏ͱָ • ແݴPR͸ආ͚Δ 22/51

Slide 23

Slide 23 text

## Motivation & Context ## Description 23/51

Slide 24

Slide 24 text

ϨϏϡʔ͞ΕΔ΂͖ͱ͜Ζ • ςετέʔε͸ద੾͔ • Τοδέʔε͸ͳ͍͔ • ঢ়گ͕໢ཏ͞Ε͍ͯΔʁ • ίʔσΟϯάنൣʹै͍ͬͯΔ͔ • ࣮૷͔ॴɺϓϩδΣΫτ͝ͱͷنଇ 24/51

Slide 25

Slide 25 text

Ϛʔδ 25/51

Slide 26

Slide 26 text

Ϛʔδ͞Ε΍͍͢PR • ٞ࿦ͷ༨஍͕ͳ͍ • MotivationΛ͔ͬ͠Γͱઆ໌͍ͯ͠Δ • ςετ΍ಈ࡞֬ೝ͕໌֬ 26/51

Slide 27

Slide 27 text

αϯϓϧ https://github.com/yonaskolb/XcodeGen/pull/720 27/51

Slide 28

Slide 28 text

28/51

Slide 29

Slide 29 text

29/51

Slide 30

Slide 30 text

ਐΊํ 30/51

Slide 31

Slide 31 text

՝୊ • ࣄલʹड़΂ͨΑ͏ʹωλ୳͕͠ͱͯ΋೉͍͠ɻ༧Ίணख͠΍͢ ͍՝୊Λ͍͔ͭ͘༻ҙͯ͠Έ·ͨ͠ • https://hackmd.io/@giginet/BJQulUAr5 • ͜͜ʹͳ͍issue΋΋ͪΖΜ׻ܴ • ݸਓతʹ๊͍͑ͯΔ՝୊ײ΍ɺڵຯͷ͋ΔOSSͷௐࠪ΋׻ܴ 31/51

Slide 32

Slide 32 text

ਐΊํ • ωλாΛݟͯɺSlackͰ௅ઓ͍ͨ͠issueΛڭ͍͑ͯͩ͘͞ • 1ਓͰ΋ྑ͍͠ɺ՝୊͕ඃͬͨΒదٓνʔϜΛ૊ΜͰ΋Α͍Ͱ ͢ɻϞϒϓϩɺϖΞϓϩ׻ܴ 32/51

Slide 33

Slide 33 text

! ϝϯλʔ • ͷखआΓ์୊ɻͲΜͲΜฉ͍͍ͯͩ͘͞ • Ͳͷissue΍͍͍͔ͬͯΘ͔Βͳ͍ʂ • ؀ڥߏஙηοτΞοϓͰ͖ͳ͍ʂ(खݩͰͷ࣮ߦɺσόο Ψʔ) • ࣮૷ํ๏Θ͔Βͳ͍ʂ • ςετॻ͚ͳ͍ʂ 33/51

Slide 34

Slide 34 text

(෇࿥) ؀ڥߏங σόοάςΫχοΫ 34/51

Slide 35

Slide 35 text

iOSϥΠϒϥϦͷςετ • 1. ςετ༻ͷiOSϓϩδΣΫτΛ࡞Δ • 2. Ϋϩʔϯͨ͠ϩʔΧϧϦϙδτϦΛΞϓϦʹ૊ΈࠐΉ • SwiftPM • CocoaPods 35/51

Slide 36

Slide 36 text

SwiftPM Package Dependencies > + > Add Local Ͱcloneͨ͠σΟϨΫτ ϦΛࢦఆ 36/51

Slide 37

Slide 37 text

CocoaPods $ git clone https://github.com/ReactiveX/RxSwift.git /path/to/repos/RxSwift pod 'RxSwift', path: '/path/to/repos/RxSwift' 37/51

Slide 38

Slide 38 text

CLIπʔϧͷςετ(ྫ: XcodeGen) ShellͰͷ࣮ߦɺςετ $ git clone https://github.com/yonaskolb/XcodeGen.git $ cd XcodeGen $ swift build $ swift test $ swift run xcodegen --help 38/51

Slide 39

Slide 39 text

• ΋͘͠͸XcodeͰϏϧυͨ͠όΠφϦΛShell͔Β࣮ߦͯ͠΋ྑ ͍ • Products > Show Build Folder in FinderͰόΠφϦͷҐஔ͕ Θ͔Δ 39/51

Slide 40

Slide 40 text

XcodeͰσόοΨʔʹ઀ଓ͢Δ 1. Debug > Attach to Process by ID ͰίϚϯυ໊ΛೖΕΔ 2. Edit Scheme > Arguments Passed on Launch 3. Run 40/51

Slide 41

Slide 41 text

41/51

Slide 42

Slide 42 text

XcodeͷRunϘλϯ͔ΒҾ਺Λ౉͢ XcodeͰͷ࣮ߦ࣌ʹίϚϯυϥΠϯҾ਺Λ౉͢͜ͱ΋Ͱ͖Δɻ࠷ ॳ͔ΒσόοΨʔ͕ܨ͕Γ։ൃ͠΍͍͢ • xcodegen > Edit Scheme > Arguments Passed On Launch. 42/51

Slide 43

Slide 43 text

43/51

Slide 44

Slide 44 text

ShellΛ࢖ͬͨςετ؀ڥͷ࡞Γํ(ྫ: swift- argument-parser) 44/51

Slide 45

Slide 45 text

։ൃ͍ͨ͠ύοέʔδΛclone $ git clone https://github.com/apple/swift-argument-parser.git 45/51

Slide 46

Slide 46 text

։ൃ༻ϓϩδΣΫτͷ࡞੒ $ mkdir oss-forward-workshop $ cd oss-forward-workshop $ swift package init 46/51

Slide 47

Slide 47 text

ϓϩδΣΫτΛXcodeͰ։͘ Xcode > Open͔Β oss-forward-workshop Λ։͘ 47/51

Slide 48

Slide 48 text

Package.swift • cloneͨ͠ϩʔΧϧύεΛ Package.swift ʹهड़ • ςετ༻ͷexecutableΛ௥Ճ // swift-tools-version: 5.6 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "oss-forward-workshop", products: [ .executable(name: "oss-forward-workshop", targets: ["oss-forward-workshop"]) ], dependencies: [ .package(name: "swift-argument-parser", path: "/path/to/repo/swift-argument-parser"), ], targets: [ .target(name: "oss-forward-workshop", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser"), ]) ] ) 48/51

Slide 49

Slide 49 text

Package.swift • cloneͨ͠ϩʔΧϧύεΛ Package.swift ʹهड़ • ςετ༻ͷexecutableΛ௥Ճ // swift-tools-version: 5.6 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "oss-forward-workshop", products: [ .executable(name: "oss-forward-workshop", targets: ["oss-forward-workshop"]) ], dependencies: [ .package(name: "swift-argument-parser", path: "/path/to/repo/swift-argument-parser"), ], targets: [ .target(name: "oss-forward-workshop", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser"), ]) ] ) 48/51

Slide 50

Slide 50 text

oss-forward-workshop/main.swift import ArgumentParser struct MyCommand: ParsableCommand { static var configuration = CommandConfiguration( commandName: "my-command", abstract: "My first command", discussion: "Hello", version: "1.0.0", shouldDisplay: true, helpNames: [.long, .short] ) func run() throws { print("Hello, World!") } } MyCommand.main() 49/51

Slide 51

Slide 51 text

$ swift run oss-forward-workshop --help OVERVIEW: My first command Hello USAGE: my-command OPTIONS: --version Show the version. -h, --help Show help information. 50/51

Slide 52

Slide 52 text

ͦͷଞ • ྺ࢙ͷ͋Δπʔϧ (fastlane/CocoaPods/danger/xcprettyͳͲ)͸ RubyͰॻ͔Ε͍ͯΔ͜ͱ͕ଟ͘ɺRuby։ൃͷσόοάख๏͕໾ ʹཱͭ • pry, rspec, rubygems • ௅ઓ͢Δํ͸ฉ͍͍ͯͩ͘͞ 51/51