Save 37% off PRO during our Black Friday Sale! »

両OSやるマンという選択

 両OSやるマンという選択

iosdc2017

B4e8461292c2cccef061741f8ba1ac3f?s=128

Ken Jumbo Haneda

September 16, 2017
Tweet

Transcript

  1. ྆OS΍ΔϚϯͱ͍͏બ୒ J04%$!5SBDL$

  2. None
  3. δϟϯϘ@jumboOrNot Kentaro Haneda Mobile Engineer@RareJob
 Swift/kotlin/Golang/WebRTC

  4. None
  5. None
  6. Q. Android։ൃͷܦݧ͕͋Δͱ͍͏ํ ಥવͰ͕͢ʢͦͷ1ʣ

  7. Q. kotlinͰͷAndroid։ൃͷܦݧ͕͋Δͱ͍͏ํ ಥવͰ͕͢ʢͦͷ2ʣ

  8. ࠓ೔ͷ఻͍͑ͨ͜ͱ ʮ྆ํͷOSͷΞϓϦΛ࡞Δͷ͸ָ͍͠͠ɺ ͍͍ͧͬͯ࿩ʯ

  9. ಋೖ “ҰਓͰ྆OSϑϧωΟςΟϒͰॻ͍͍ͯΔ࿩”

  10. WebͷձࣾͰΞϓϦࣄۀΛ࡞ΔͨΊʹస৬ͯ͠ ੎͍Ͱ྆OSͷΞϓϦΛҰਓͰ࡞Δ͜ͱʹͳͬͨɾɾɾ ͋ͳͨͳΒͲ͏͠·͔͢ʁ ΨϯΨϯ͍͜͏ͥ ͍ͷͪΛ͍ͩ͡ʹ ͍͍͔Βస৬ ͍Ζ͍Ζ΍Ζ͏ͥ

  11. ʮ੎͍Ͱݴ͚ͬͨͲAndroidΘ͔ΒΜ͠ɺ
 ͦ΋ͦ΋Ұਓͱ͸ɾɾɾʯ ΨϯΨϯ͍͜͏ͥ ͍ͷͪΛ͍ͩ͡ʹ ▶︎ ͍͍͔Βస৬ ͍Ζ͍Ζ΍Ζ͏ͥ

  12. ʮ·͊΍ͬͯΈΔ͔ʯ ΨϯΨϯ͍͜͏ͥ ͍ͷͪΛ͍ͩ͡ʹ ͍͍͔Βస৬ ▶︎ ͍Ζ͍Ζ΍Ζ͏ͥ

  13. ϨΞδϣϒӳձ࿩ΞϓϦ Ͱ͖͕͋Γ͕ͪ͜Β

  14. 3BSF+PCΞϓϦ J04 "OESPJE ։ൃݴޠ 4XJGU LPUMJO ։ൃ؀ڥ 9DPEF "OESPJE4UVEJP ΞʔΩςΫνϟ

    3Y4XJGU .77. 3Y+BWB .77. ओͳϥΠϒϥϦ 3Y4XJGU "1*,JU  )JNPUPLJ 3FBMN 3Y+BWB 3FUSpU 
 0L)551 3YCJOE Ξοϓσʔτස౓ গ ଟ Ϋϥογϡ গ ͪΐͬͱଟ ϨϏϡʔ   Ϣʔβʔൺ཰   ͦͯ͠1೥΄Ͳӡ༻ͯͨ݁͠Ռ
  15. ͜͏ͯ͠ʮ྆OS΍ΔϚϯʯʹͳͬͨɾɾɾ ͦΜͳ͜ΜͳͰ1೥͘Β͍ܦͪ·ͨ͠

  16. ࠓ೔ͷ࿩ 1೥ͷӡ༻Ͱಘͨؾ͖ͮ΍஌ݟ͔Β
 1. ചΕํ 2. ࡞Γํ 3. ࡞Δ΋ͷ 4. ίʔυ


    
 ͷҧ͍ΛฐࣾͷࣄྫΛަ͑ͯ͝঺հ
  17. σόΠεɾ04ͷൺֱ ചΕํͷҧ͍Λ஌Δ “iOSͱAndroid”

  18. 2017೥಄ͷσόΠεγΣΞ Ҿ༻: http://www.idc.com/promo/smartphone-market-share/os http://www.ai-bibo.net/entry/2017/02/10/113350, https://www.kantarworldpanel.com/global/smartphone-os-market-share/ 14.7 49.5 16.4 42 4.3

    85 49 83.5 56.4 94.4 0.2 0.95 1.42 1.61 1.3 0 20 40 60 80 100 120      ios android 
  19. 2016೥ͷϚʔέοτऩӹϥϯΩϯά - ΫΠζ ▪ iOS 1Ґ China 2Ґ Unites States

    3Ґ ??? Android
 1Ґ ??? 2Ґ United States 3Ґ South Korea Ҿ༻: https://www.appannie.com/jp/insights/market-data/app-annie-2016-retrospective/
  20. 2016೥ͷϚʔέοτऩӹϥϯΩϯά - ౴͑ ▪ iOS 1Ґ China 2Ґ Unites States

    3Ґ Japan Android
 1Ґ Japan 2Ґ United States 3Ґ South Korea Ҿ༻: https://www.appannie.com/jp/insights/market-data/app-annie-2016-retrospective/ ೔ຊ͸DL਺ͱऩӹֹ͕͍ۚۙਪҠͰ ಈ͍͍ͯΔɻ ୯ՁͰݟΔͱؖࠃͱ͔͸DL਺͕গͳׂ͍ʹ ऩӹֹ͕ଟ͍ͷͰ୯Ձ͕େ͖͍ɻ ଞࠃϦʔδϣϯ΁ͷల։Λ͍ͯ͠Δ ΞϓϦʹؔ܎͍ͯ͠Δਓ͸ͥͻAppAnnieͷ 2016೥ͷϨϙʔτΛݟ͍ͯͩ͘͞ɺ ௒໘ന͍Ͱ͢
  21. ͦΕͧΕͷϚʔέοτ Φεεϝهࣄ: https://growthhackjournal.com/app-store-optimization-tips-and-checklist-2017/ https://www.quora.com/Are-there-any-SEO-guides-for-mobile-apps-Google-Play-and-AppStore Google Play AppStore • ৹͕ࠪඞཁ •

    આ໌΍λΠτϧ΋৹ࠪ ඞཁ • εΫγϣ͸αΠζݻఆ • ϨΪϡϨʔγϣϯݫ͠ ͍ʢ”ແྉ”ͳͲ࢖͑ͳ ͍จݴʣ • ιʔγϟϧͳӨڹ͸ϥ ϯΩϯάʹߟྀ͞Εͳ ͍ • ετΞͷػೳΞοϓσʔ τ͸ͦ͜·Ͱසൟʹͳ ͍ • ৹͕ࠪෆཁ • ετΞͷ಺༰͸΄΅શͯ ABςετͰ͖Δ • εΫγϣ͸αΠζࢦఆॊೈ • ϨΪϡϨʔγϣ͸ൺֱతΏ Δ͍ • ιʔγϟϧͳӨڹ͸ϥϯΩ ϯάʹߟྀ͞ΕΔ • ετΞͷػೳΞοϓσʔτ ͕සൟͰศརͳػೳ͕ଟ͍
  22. ϓϩμΫτͷൺֱ ࡞Δ΋ͷͷҧ͍Λ஌Δ “iOSΞϓϦͱAndroidΞϓϦ”

  23. σβΠϯ - ΨΠυϥΠϯ Ҿ༻: https://developer.apple.com/ios/human-interface-guidelines/overview/design-principles/ Three primary themes differentiate iOS

    from other platforms. • Clarity
 ໌ྎͰΔ͜ͱ • Deference ߇͑ΊͰ͋Δ͜ͱ • Depth Ԟߦ͖͕͋Δ͜ͱ

  24. σβΠϯ - ΨΠυϥΠϯ Ҿ༻: https://material.io/guidelines/#introduction-goals Material Design Principles. • Bold,

    graphic, intentional େ୾ʹɺੜ͖ੜ͖ͱɺҙਤతʹ • Motion provides meaning ಈ͖͸ҙຯΛఏڙ͢Δ • Material is the metaphor
 ϚςϦΞϧ͸ϝλϑΝʔͰ͋Δ 

  25. σβΠϯ - ΨΠυϥΠϯ Ҿ༻: https://material.io/guidelines/#introduction-goals • Material is the metaphor


    ϚςϦΞϧ͸ϝλϑΝʔͰ͋Δ
  26. σβΠϯ - େ͖͞ͷදݱ ▪ iOS - px 
 pixel 


    σόΠεαΠζ͕ҟͳΔ࣌ʹpxࢦఆ σόΠεαΠζ͕ҟͳΔ࣌ʹdpࢦఆ dpiͷදݱ Android - dp
 density-independent pixels 
 (ີ౓ඇґଘϐΫηϧ) - dpi 
 dots per inch
 (ը໘ີ౓)
 1inchͷதͷdot਺
  27. σβΠϯ - ΞΠίϯͳͲͷඞཁͳը૾ ▪ iOS - Image Assets 
 2x/3x͕͋Ε͹͍͍ɺRetina

    = 2x/Plus = 3x 
 Android - dpi 
 hdpi, xhdpi, xxhdpi ͷ 3 छྨͷղ૾౓Ͱɺ
 ੈքͷશγΣΞͷ 8 ׂ Ҿ༻: https://developer.android.com/about/dashboards/index.html#Screens http://yuki312.blogspot.jp/2012/10/androidxhdpi.html
  28. σβΠϯ - ߏ੒ ▪ iOS - Navigation Controller/
 ViewController Classes

    
 ը໘Λදݱ͢ΔΫϥε͕ܾ·͍ͬͯΔɺ
 ContainerΛ࢖͍Viewίϯϙʔωϯτͱͯ͠΋
 ࢖͑Δ 
 Android - Activity - Fragment - View
 ϥΠϑαΠΫϧɺ࠶ར༻ੑɺ
 όοΫΩʔɺΩʔΠϕϯτɺ
 ςʔϚΛ͔࣋ͭͲ͏͔ͳͲ
 ҟͳΔ෦෼͕ଟ͍ ཧղ͢ΔͨΊͷΦεεϝهࣄ: https://www.slideshare.net/yanzm/droid-kaigi2015-yanzm
  29. σβΠϯ - ߏ੒ Android - Activity - Fragment - View


    
 ྆OS΍ΔϚϯʹͳΔʹ౰ͨͬͯ࠷ॳʹͭ·ͮ͘ϙΠϯτɻ
 
 
 Q. ݁ہͲΕͰը໘Λ࡞Δͷ͕͍͍ͷʁ
 A. ΈΜͳ͕ͪͬͯΈΜͳ͍͍ɻ ͭ·Γɾɾɾ
  30. σβΠϯ - ߏ੒ Android - Activity - Fragment - View


    
 A. ΄΅perfume. View Fragment Activity
  31. σβΠϯ - ߏ੒ Android - Activity - Fragment - View


    
 ͨͩͦΕͰ΋͋͑ͯݴ͏ͳΒ "ը໘֊૚ͷSPPUʹ͍ۙ΋ͷ΄Ͳ"DUJWJUZ'SBHNFOU7JFX
 ͭ·ΓJ04Ͱ͍͏.PEBMͱݺ͹Ε͍ͯͨ෦෼ʹ૬౰͢Δͱ͜ΖΛ
 "DUJWJUZͰදݱ͢Δͷ͕͏·͍͘͘
  32. ΫϩεϓϥοτϑΥʔϜͱ͍͏બ୒ࢶ ▪ ϏδωεαΠυࢹ఺ - ը໘ͷڞ௨։ൃͳͲ։ൃίετͷ࡟ݮ 
 ▪ ΤϯδχΞαΠυࢹ఺ - ࠷৽ͷωΠςΟϒAPI΁ͷར༻ݒ೦

    - αϙʔτ͕ා͍ - ࣮ࡍ׳Ε͍ͯΔݴޠͰ࡞ͬͨ΄͏͕ڞ௨Ͱ࡞ΔΑΓ
 ૣ͍ͷͰ͸ʁ - υΩϡϝϯτ͕ා͍ - ΩϟϦΞతʹා͍
  33. ։ൃ؀ڥͷൺֱ ࡞Γํͷҧ͍ “XcodeͱAndroid Studio”

  34. ڞ༗Ͱ͖Δ͜ͱͰ͖ͳ͍͜ͱ ڞ௨Խ Ͱ͖Δʁ ϝϞ σβΠϯ ✖ ϓϥοτϑΥʔϜͷσβΠϯΨΠ υϥΠϯʹै͍·͠ΐ͏ ઃܭɾΞʔΩςΫνϟ ˚

    ͋ͱͰ࿩͠·͢ ίʔυ ✖ 4XJGU,PUJO
 ม׵͸·ͩͰ͖ͳ͍ɾɾɾ $*$%ͳͲͷαʔϏε ˓ ͋ͱͰ࿩͠·͢ ετΞ؅ཧ ✖ ը૾΍εΫγϣͳͲඞཁͳ΋ͷ͕ ݁ߏҧ͏ ςετυΩϡϝϯτ ˚ ࠩҟΛ͚ͭͳ͍ͷͰ͋Ε͹͋Δఔ ౓ڞ௨ԽͰ͖Δ͸ͣ Ϣʔβʔମݧ ˚ σβΠϯ͕ҟͳΔͷͰɺΤϥʔද ه΍Ξχϝʔγϣϯ͸มΘΔ ΤσΟλ ˚ ͕Μ͹Ε͹WJNͱ͔Ͱ΋ॻ͚Δ͚ Ͳ݁ہϏϧυͱ͔Ͱඞཁ
  35. ࠷ۙͷXcodeͱAndroid Studioͷ৽ػೳ Xcode 9.0 Android Studio 2.3 ɾEmulatorͱͷΫϦοϓϘʔυڞ༗ ɾσΟʔϓϦϯΫͷ؅ཧػೳ ɾInstant

    RunͷΞοϓσʔτ ɾϏϧυΩϟογϡͷσϑΥϧτ༗ޮԽ ɾωοτϫʔΫܦ༝ͷΞϓϦసૹ ɾෳ਺ಉ࣌ͷγϛϡϨʔλʔىಈ ɾSwift4ରԠ ɾϏϧυߴ଎Խ
  36. ։ൃ؀ڥ 9DPEF "OESPJE4UVEJP ಋೖ ָ ͪΐͬͱෳࡶ Ϙλϯ গͳ͍ ΊͪΌΊͪΌଟ͍ ։ൃ؀ڥͱ


    ݴޠͷґଘ ڧ͍ɻ ͙͢όʔδϣϯ͋͛ͳ͍ͱ͍͚ͳ͍ ऑ͍ɻ ݁ߏલͷόʔδϣϯͰ΋ಈ͘ ύοέʔδɺϥΠϒϥϦ؅ ཧ DPDPBQPETDBSUIBHFͳͲ
 ֎෦ͷπʔϧ (SBEMF Ϗϧυ࣌ؒ ࣮૷ʹ΋ΑΔ͚Ͳ ॏ͘ͳΓ͕ͪ ࣮૷ʹ΋ΑΔ͚Ͳ
 ͋·Γॏ͍ҹ৅͸ͳ͍ ϨΠΞ΢τ؅ཧ 4UPSZCPBSE "VUP-BZPVU
 ৴ڼ৺͕ඞཁ 9.-
 ׂͱ$44ʹ͍ۙ ΤϛϡϨʔλʔͷ
 ࢖͍΍͢͞ γϯϓϧɺͦ΋ͦ΋σόΠεࣗମ͕
 γϯϓϧͩ͠؅ཧָ͕ ෳࡶͳ෦෼͕ଟ͍͕BECͰ
 $6*ܦ༝Ͱ؅ཧͰ͖Δ ϓϩδΣΫτ؅ཧ YDPEFQSPKYDXPSLTQBDFͳͲ
 ϓϩδΣΫτϑΝΠϧ͕࡞ΒΕγϯϓϧ ࣗ෼Ͱύεࢦఆͯ͠ىಈ͢Δɺ
 ؒҧ͑Δͱ͏·͘ಡΈࠐΊͳ͍ ϓϩδΣΫτ࡞੒࣌ߏ੒ ϓϩδΣΫτϑΝΠϧ͕΍΍͍͜͠ͱ͜Λ ͍͍ײ͡ʹݟͤͳ͍ͷͰΘ͔Γ΍͍͢ ͍͖ͳΓΘ͔Βͳ͍΋ͷ͕ͨ͘͞ Μੜ·ΕΔɻා͍ ˎओ؍ʹجͮ͘ൺֱ
  37. ։ൃ؀ڥ͝ͱʹϏϧυΛ෼͚Δ - iOS Build Configuration / Scheme, ͋ͱ͸ݹ͍΍ΓํͩͱTarget΍ϚΫϩͰ෼͚ΔͳͲ 1؀ڥ =

    1 Scheme
 = 1 Debug, 1 Release Build
 ιʔείʔυ಺ͰϚΫϩͰίʔυΛ෼͚Δ͜ͱ ͕ଟ͍.
  38. ։ൃ؀ڥ͝ͱʹϏϧυΛ෼͚Δ - Android Build Variant = Build Type ✖ Flavor

    1؀ڥ = 2 Build Variant
 = 1 Debug, 1 Release Build Type
 ιʔείʔυ͕Build Variant͝ͱʹ෼͚ΒΕ Δɻجຊ͸ڞ௨ͷ΋ͷɺ͋Ε͹؀ڥ͝ͱͷ΋ͷ Λ࢖͏ɻ Build VariantΛ੾Γସ͑ΔͱࣗಈͰͦΕʹԠͨ͡Ϧιʔε͕બ͹ΕΔ
  39. CI/CDΛͲ͏͢Δ͔ʁ $JSDMF$* #JUSJTF 8FSDLFS #VEEZ#VJME +FOLJOT ରԠ04 ྆04 ྆04 "OESPJEͷΈ

    ྆04 ྆04
 ʢ.BD04ͳΒʣ ࠷খϓϥϯ ྉۚ NP NP NP NP ࣗલ ແྉϓϥϯ
 ੍ݶ ͳ͠ Ϗϧυ͕࣌ؒ෼Ҏ ಺ɺϏϧυճ਺͸݄ ճ·Ͱͷ੍ݶ෇ ͖ Ϗϧυ࣌ؒ෼Ҏ ಺ɺ5SFMMP࿈ܞͳ͠ ࣗલ ઃఆํ๏ :".-8FC :.-8FC %PDLFS*NBHF ඞཁ 8FC ࣗલ ϝϞ ࢒೦ͳ͕Β༗ྉԽ Ϗϧυ͕࣌ؒҾ͔ͬ ͔Δ·Ͱ͸͜Ε࢖͑ ͹͍͍ͱࢥ͍·͢ɻ
 ઃఆָ͕ͳͷͰɻ ͪΐͬͱલʹྲྀߦͬͯ ͨΠϝʔδ ΩϡʔΠϯά͕݁ߏଟ ͍ɺٸʹ࣌ؒ଴ͪͱ ͔͋Δɻಠࣗͷϑϩʔ Ͱ$*ͳͲ͕ಈ͘ͷͰͱ ͖ͬͭʹ͍͘ҹ৅ɻ ਏ͍͚Ͳɺ΍ͬͺ֦ு ੑ͸Ұ൪͋ΔͷͰ "QQJVNͱ͔Ͱ6*ςε τ΋͍ͨ͠ਓͱ͔ɺ .BDͷ༨͍ͬͯΔਓ ͸͍͍͔΋
  40. ݕ౼ͷ຤ɺզ͕Ո͸Bitrise ઃఆ͸྆OS΍ͬͯ΋1೔ͰͰ͖Δͱࢥ͍·͢ɻ - YAML׳Εͯͳͯ͘΋ɺworkflowͰWeb্Ͱࢦఆͨ͠؀ڥม਺͔Β
 ੜ੒͢Δ͜ͱ΋Ͱ͖Δ - ഑෍ɺitunesconnect΁ͷΞοϓϩʔυ·ͰͰ͖Δ - iOSͷAutomatically Manage

    Signinઃఆ͍ͯ͠Δͱࣦഊ͢Δʢॿ͚ͯʣ - PlayStoreʹ্͛Δͷʹ͸Ұख͍ؒΔʢBeta൛ͰͰ͖ΔNowʂʣ - ͲͪΒͷOS΋؀ڥ͝ͱʹϏϧυͰ͖Δ͸ͣ CI/CDΛͲ͏͢Δ͔ʁ
  41. ։ൃݴޠͷൺֱ ίʔυͷҧ͍ ʢશ෦΍Δͱ͖Γ͕ͳ͍ͷͰ཈͑ͱ͍ͨ΄͏͕͍͍ͱ͚ͩ͜ʣ “Swiftͱkotlin”

  42. Enum // SwiftͱҟͳΔϙΠϯτ1. ෳ਺ͷॳظ஋ͷઃఆͱΞΫηε enum class Student(val firstName:String, val lastName:String,

    val age:Int){ STUDNET1(firstName = "tarou", lastName = "tanaka", age = 10), STUDNET2(firstName = "jirou", lastName = "suzuki", age = 12) } print(Student.STUDNET1.firstName) // tarou print(Student.STUDNET2.firstName) // jirou print(Student.STUDNET1.toString()) // STUDNET1 // SwiftͱҟͳΔϙΠϯτ2. ྻڍܕఆ਺ͷར༻ʹΑΓfilter΍foreach͕࢖͑Δ Student.values().forEach { student -> print(student.firstName) } kotlinʹ͓͚Δenum͸classͰ͋ΔͷͰɺෳ਺ͷॳظ஋Λ࣋ͬͨΓ
 Java४ڌͳͷͰͰ͖Δ͜ͱ͕ଟ͍˕ ࢀߟ: https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/enum-classes.html
  43. Protocol Φεεϝهࣄ: http://qiita.com/koher/items/ee31222b7f9b0ead3de7 https://tech.recruit-mp.co.jp/mobile/swift-optional-method/ protocol ≒ interface 
 ͔ͳΓ͍ۙͷͰ͕͢ɺ ɾimplementʢ࣮૷ʣ͢΂͖΋ͷͱprotocolʢ࠾୒ʣ͢Δ΋ͷͰࢥ૝͕ҟͳΔ͜ͱ

    ɾkotlinͰ͸optional͕࢖͑ͳ͍ ɾkotlin͸σϑΥϧτ͕finalʢܧঝෆՄʣͳͷͰimplementͰ͖ͳ͍৔߹΋͋Δ
  44. म০ࢺ TXJGU LPUMJO PQFO Ϟδϡʔϧ͔֗ΒͷΞΫηεΛڐՄ ʢ4XJGU͔ΒͷΞΫηείϯτϩʔϧʣ ܧঝΛڐՄ͢Δ
 ʢpOBM͕σϑΥϧτͳͷͰඞཁʹԠ࣮ͯ͡૷ʣ QVCMJD ผϞδϡʔϧ͔ΒΞΫηεͰ͖Δ͕

    ܧঝɾΦʔόʔϥΠυͰ͖ͳ͍ ΞΫηεͰ͖ΔݶΓར༻Մೳ JOUFSOBM ಉ͡Ϟδϡʔϧ͔ΒΞΫηεͰ͖Δ ಉ͡Ϟδϡʔϧ͔ΒΞΫηεͰ͖Δ pMFQSJWBUF ಉ͡ιʔεϑΝΠϧ಺ͷΈΞΫηεͰ͖Δ  QSJWBUF ఆٛ͞Εͨείʔϓ಺ͷΈ ͦͷΫϥε಺͚ͩݟ͑Δ QSPUFDUFE  ͦͷΫϥεͱαϒΫϥε͔ΒͷΈݟ͑Δ pOBM ܧঝͰ͖ͳ͘ͳΔ ܧঝͰ͖ͳ͘ͳΔ ˎ஡৭͕σϑΥϧτ
  45. ར༻͢ΔϥΠϒϥϦ

  46. ར༻͢ΔϥΠϒϥϦ ৄ͍͜͠ͱ͸ͪ͜Βʹ ʮSwiftͰ࡞ͬͨ΋ͷΛKotlinͰ࡞͍ͬͯΔ࿩ - Qiitaʯ http://qiita.com/jumbOrNot/items/4f143c8dcf9620080382

  47. Swift to Kotlin Swift͔ΒkotlinͷίʔυΛ࡞ΔOSS https://github.com/angelolloqui/SwiftKotlin In fact, I explored an

    actual example using MVVM+Rx, where I got between a 50% and 90% of code similarity depending on the layer (non UIKit dependent is much more reusable than UIKit dependent classes of course). It took me around 30% the time to convert the Android version from the iOS version and I did not have SwiftKotlin then ;)
  48. ·ͱΊ ৭ʑ࿩͠·͕ͨ͠ 
 ɾڞ௨ԽͰ͖Δ෦෼ʢCI/CD΍ΞʔΩςΫνϟʣ ɾผʑʹߟ͑ͨํ͕͍͍෦෼ʢσβΠϯ΍ίʔυʣ 
 ҧ͍Λҙࣝͯ͠ϓϩμΫτʹམͱ͠ࠐΉ͜ͱ͕Ұ൪ॏཁ
 ͩͱߟ͍͑ͯ·͢ɻͦͯ͠ئΘ͘͹
 ҰਓͰ΍Βͣʹෳ਺ਓͰ΍Γ·͠ΐ͏ʢޏ͍·͠ΐ͏ʣ

  49. r,FOUBSP)BOFEB!+VNCP0S/PU “Let’s start your career as ྆OS΍ΔϚϯ!”