iOSには無いmacOS独自機能をCatalystで実装する #iosdc #d/make_macos_apps_with_catalyst

249b3122eee454c0a818bfe7851418e4?s=47 fromkk
September 20, 2020

iOSには無いmacOS独自機能をCatalystで実装する #iosdc #d/make_macos_apps_with_catalyst

これまではmacOSのアプリケーションを開発しようと思うとAppKitというUIKitとは異なるframeworkを利用する必要がありiOSアプリの開発とは勝手が異なりました。​
そんな中WWDC 2018でmacOS Mojaveの一部のアプリケーションにUIKitをmacOSに対応したアプリケーションが搭載されることが発表されました。
さらに、翌年のWWDC 2019にてその機能が開発者向けに「Project Catalyst」として公開されました。
Catalyst対応はXcodeでチェックを一つ入れるだけで簡単にビルドをすることが可能です。
しかし、macOSらしいアプリケーションを作ろうと思うとすべきことが色々とあります。
WWDCでもサイドバーのUIをmacOSらしくする方法などが紹介されていましたが、WWDCで紹介されなかった機能がいくつもあります。
CatalystにおいてiOSには無い機能として「メニュー」、「Touch Bar」、「Toolbar」があげられます。
本トークではCatalystに対応した2つのアプリのリリース経験とCatalystに関する本を執筆した内容を基に、
対応方法の基礎から、先述したメニューやTouch Bar、Toolbarへの対応方法をご紹介します。

249b3122eee454c0a818bfe7851418e4?s=128

fromkk

September 20, 2020
Tweet

Transcript

  1. J04ʹ͸ແ͍NBD04ಠࣗػೳΛ $BUBMZTUͰ࣮૷͢Δ J04%$+BQBO 1

  2. 1SPpMF struct Profile { let name = "Kazuya Ueoka" let

    company = "note, Inc." let twitter = "@fromkk" let github = "fromkk" let qiita = "fromkk" let note = "fromkk" } • 2
  3. 3

  4. note inc. ೥݄ελʔτ 4

  5. note inc. ଟ਺ͷΫϦΤΠλʔ΍ग़൛ࣾͱఏܞ͍ͯ͠Δίϯςϯπ഑৴αΠτ 5

  6. note inc. ೥݄ελʔτ 6

  7. note inc. ΫϦΤΠλʔ͕จষ΍ϚϯΨɺࣸਅɺԻ੠Λ౤ߘ͢Δ͜ͱ͕Ͱ͖ɺ Ϣʔβʔ͸ͦͷίϯςϯπΛָ͠ΜͰԠԉͰ͖ΔϝσΟΞϓϥοτϑΥʔϜ 7

  8. note inc. ϛογϣϯ ͩΕ΋͕૑࡞Λ͸͡Ίɺ ଓ͚ΒΕΔΑ͏ʹ͢Δɻ 8

  9. $BUBMZTUͷ͜Ε·Ͱ 9

  10. 10

  11. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 11

  12. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 12

  13. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 13

  14. 14

  15. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 15

  16. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 16

  17. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 17

  18. 1SPKFDU$BUBMZTUͱ͸ w 88%$Ͱൃද͞ΕͨJ1BE04޲͚ͷΞϓϦΛNBD04޲ ͚ʹϏϧυՄೳʹ͢Δٕज़ w 6*,JU͕ར༻Ͱ͖ΔͷͰJ04Ͱഓ͖ٕͬͯͨज़͕ͦͷ··ར༻Մ ೳ w গͳ͍޻਺Ͱ഑෍Ͱ͖ΔϓϥοτϑΥʔϜ͕૿͑ΔͷͰϏδω εతʹ΋νϟϯε

    18
  19. w 9DPEFͷ(FOFSBMλϒͷ%FQMPZNFOU*OGPͰ.BDʹνΣοΫΛ ೖΕΔ͚ͩ ରԠํ๏ 19

  20. J04ͱNBD04ͷେ͖ͳҧ͍ w ϝχϡʔ  w 5PVDI#BS  w πʔϧόʔ 20

  21. ϝχϡʔ 21

  22. ϝχϡʔ w ΞϓϦέʔγϣϯ͕࣋ͭػೳʹ؆୯ʹΞΫηε͢Δ͜ͱ͕Ͱ͖ Δը໘্෦ʹදࣔ͞ΕΔόʔ w ֊૚ΛೖΕࢠʹ͢Δ͜ͱͰෳ਺ͷ֊૚Λ࡞Δ͜ͱ͕Ͱ͖Δ w ΩʔϘʔυγϣʔτΧοτͱ૊Έ߹ΘͤΔ͜ͱͰΞϓϦέʔ γϣϯͷ࢖͍΍͕͢͞޲্ 22

  23. ࣮૷ํ๏ 23

  24. w "QQ%FMFHBUF 6*3FTQPOEFS ʹCVJME.FOVͱ͍͏ϝιου͕ ͍ΔͷͰ࣮૷ΛՃ͑Δ w CVJMEFSTZTUFNʹDPOUFYUͷछྨ͕౉͞ΕΔͷͰϋϯυϦϯά ͢Δ ࣮૷ํ๏ #if

    targetEnvironment(macCatalyst) override func buildMenu(with builder: UIMenuBuilder) { super.buildMenu(with: builder) // TODO: build your menu } #endif IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJSFTQPOEFSCVJMENFOV 24
  25. 6*.FOV4ZTUFN w Ͳ͏͍͏࣌ʹݺ͹Ε͔ͨɺϝχϡʔΛ࠶ߏங͢Δඞཁ͕͋Δ͔ ͳͲͷ৘ใΛอ͍࣋ͯ͠Δ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJNFOVTZTUFN 25 UIMenuSystem ఆٛ .main ΞϓϦىಈ࣌ʹ౉͞ΕΔɻΞϓϦશମͷϝχϡʔΛߏங͢Δࡍʹར༻͢Δɻ

    .context ӈΫϦοΫϝχϡʔ(contextMenu)͕දࣔ͞ΕΔࡍʹ౉͞ΕΔɻ
  26. 6*.FOV w ϝχϡʔΛߏ੒͢ΔΫϥε w λΠτϧ΍ը૾Λઃఆ͢Δ͜ͱ͕Ͱ͖Δ w DIJMESFOʹ͸6*.FOV&MFNFOUΛܧঝ͍ͯ͠ΔΫϥεΛೖΕΔ͜ͱ͕Ͱ͖ΔͷͰ࠶ؼ తʹϝχϡʔΛ࡞Δ͜ͱ͕Մೳ w ϝχϡʔͷ߲໨͕ͭ6*.FOVɺ಺෦͸6*.FOV&MFNFOUͷDIJMESFO

    w BDUJPO4FMFDUPS͸࣮ߦՄೳͳ!PCKDͳϝιουΛࢦఆՄೳ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJNFOV init(title: String, image: UIImage? = nil, identifier: UIMenu.Identifier? = nil, options: UIMenu.Options = [], children: [UIMenuElement] = []) 26
  27. 6*.FOV#VJMEFS w ϝχϡʔͷߏ੒Λ؅ཧ͢ΔΫ ϥε w ϝχϡʔͷ௥Ճɺ࡟আɺೖΕ ସ͕͑Մೳ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJNFOVCVJMEFS /// Replace

    an identified menu with a menu. /// /// @param replacedIdentifier The identifier of the menu to be replaced. /// @param replacementGroup The replacement menu. func replace(menu replacedIdentifier: UIMenu.Identifier, with replacementMenu: UIMenu) /// Replace the children of an identified parent menu. /// /// @param parentIdentifier The identifier of the parent menu. /// @param childrenBlock A block that returns the new children, given the old children. func replaceChildren(ofMenu parentIdentifier: UIMenu.Identifier, from childrenBlock: ([UIMenuElement]) -> [UIMenuElement]) /// Insert a sibling menu before an identified sibling menu. /// /// @param siblingGroup The sibling menu to insert. /// @param siblingIdentifier The identifier of the sibling menu to insert before. func insertSibling(_ siblingMenu: UIMenu, beforeMenu siblingIdentifier: UIMenu.Identifier) /// Insert a sibling menu before an identified sibling menu. /// /// @param siblingGroup The sibling menu to insert. /// @param siblingIdentifier The identifier of the sibling menu to insert before. func insertSibling(_ siblingMenu: UIMenu, afterMenu siblingIdentifier: UIMenu.Identifier) /// Insert a child menu at the start of an identified parent menu. /// /// @param childGroup The child menu to insert. /// @param parentIdentifier The identifier of the parent menu to insert at the start of. func insertChild(_ childMenu: UIMenu, atStartOfMenu parentIdentifier: UIMenu.Identifier) /// Insert a child menu at the end of an identified parent menu. /// /// @param childGroup The child menu to insert. /// @param parentIdentifier The identifier of the parent menu to insert at the end of. func insertChild(_ childMenu: UIMenu, atEndOfMenu parentIdentifier: UIMenu.Identifier) /// Remove an identified menu. /// /// @param removedIdentifier The menu to remove. func remove(menu removedIdentifier: UIMenu.Identifier) 27
  28. 6*"DUJPO w Ϋϩʔδϟʔ CMPDLT Λݺͼग़ͤΔ w 6*.FOV&MFNFOUΛܧঝ͍ͯ͠ΔͷͰ6*.FOVͷDIJMESFOʹ௥ Ճ͢Δ͜ͱ͕Ͱ͖Δ 28 IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJBDUJPO

    public convenience init(title: String, image: UIImage? = nil, identifier: UIAction.Identifier? = nil, discoverabilityTitle: String? = nil, attributes: UIMenuElement.Attributes = [], state: UIMenuElement.State = .off, handler: @escaping UIActionHandler)
  29. 6*$PNNBOE w ηϨΫλʔΛݺͼग़ͤΔ w 6*.FOV&MFNFOUΛܧঝ͍ͯ͠ΔͷͰ6*.FOVͷDIJMESFOʹ௥ Ճ͢Δ͜ͱ͕Ͱ͖Δ 29 IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJDPNNBOE public convenience

    init(title: String, image: UIImage? = nil, action: Selector, propertyList: Any? = nil, alternates: [UICommandAlternate] = [], discoverabilityTitle: String? = nil, attributes: UIMenuElement.Attributes = [], state: UIMenuElement.State = .off)
  30. 6*,FZ$PNNBOE w ΩʔϘʔυγϣʔτΧοτΛՄೳʹ͢ΔΫϥε w 6*$PNNBOEΛܧঝ͍ͯ͠ΔͷͰ6*.FOVͷDIJMESFOʹ௥Ճ͢ Δ͜ͱ͕Ͱ͖Δ 30 IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJLFZDPNNBOE

  31. DBO1FSGPSN"DUJPO @XJUI4FOEFS w ౉͞ΕͨBDUJPO͕࣮ߦՄೳ͔ #PPM Λฦ͢ w ϝχϡʔͷ׆ੑɺඇ׆ੑΛ൑ఆ 31 IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJSFTQPOEFSDBOQFSGPSNBDUJPO

  32. 5PVDI#BS 32

  33. 5PVDI#BS w ೥ʹൃച͞Εͨ.BDCPPL1SP͔Β౥ࡌ͞ΕͨΩʔϘʔ υͷԞଆʹ഑ஔ͞ΕΔσΟεϓϨΠ͖ͭͷίϯτϩʔϧόʔ w ൃച౰͔࣌Β&TDΩʔͱϑΝϯΫγϣϯΩʔ͕5PVDI#BSʹ ಺แ͞Εͯ͠·͍ࢍ൱྆࿦ w ೥݄ʹൃച͞Εͨ.BDCPPL1SPΠϯνͰ͸&TD Ωʔ͕෮ؼͨ͜͠ͱͰ଴ͪ๬ΜͰ͍ͨਓ͸େ׻ت

    33
  34. $BUBMZTUͰར༻ՄೳͳϘλϯͷछྨ 34

  35. ࣮૷ํ๏ 35

  36. ࣮૷ํ๏ • NSTouchBar.CustomizationIdentifierΛఆٛ͢Δ • Touch BarͷछྨΛࣝผ͢Δ 36 extension NSTouchBar.CustomizationIdentifier {

    static let myTouchBar = NSTouchBar.CustomizationIdentifier( "me.fromkk.CatalystSampler.MyTouchBar" ) }
  37. ࣮૷ํ๏ 37 extension NSTouchBarItem.Identifier { static let prev = NSTouchBarItem.Identifier(

    "me.fromkk.CatalystSampler.prev" ) static let next = NSTouchBarItem.Identifier( "me.fromkk.CatalystSampler.next" ) } • NSTouchBarItem.IdentifierΛఆٛ͢Δ • Touch Barʹදࣔ͢Δ߲໨ͷछྨΛࣝผ͢Δ
  38. ࣮૷ํ๏ w $BUBMZTUͷ৔߹ʹ6*3FTQPOEFSʹ૿͍͑ͯΔNBLF5PVDI#BSϝιουΛ࣮૷͢Δ 38 #if targetEnvironment(macCatalyst) override func makeTouchBar() ->

    NSTouchBar? { let touchBar = NSTouchBar() touchBar.customizationIdentifier = .myTouchBar touchBar.defaultItemIdentifiers = [.prev, .next, .otherItemsProxy] touchBar.customizationAllowedItemIdentifiers = [.prev, .next] touchBar.delegate = self return touchBar } #endif
  39. NSTouchBarͷϓϩύςΟ • customizationIdentifier:Touch BarΛࣝผ͢ΔͨΊͷ஋ • customizationAllowedItemIdentifiers:ΧελϚΠζΛڐՄ͢Δࣝผࢠ • customizationRequiredItemIdentifiers:ΧελϚΠζ࣌ʹ࡟আͰ͖ͳ͍ࣝผࢠ • defaultItemIdentifiers:ΧελϚΠζ͢Δલʹදࣔ͢Δࣝผࢠ

    • itemIdentifiers:ొ࿥ࡁΈͷࣝผࢠ • principalItemIdentifier:தԝʹදࣔ͞ΕΔॏཁͳࣝผࢠ • escapeKeyReplacementItemIdentifier:Esc ΩʔΛࠩ͠ସ͑Δ৔߹ͷࣝผࢠ • templateItems:ࣝผࢠ͔ΒΠϯελϯεԽ͞Ε߲ͨ໨Λอ࣋͢ΔϓϩύςΟ • delegate: ࣝผࢠ͔ΒΠϯελϯεΛੜ੒͢ΔॲཧΛҠৡ 39
  40. ΧελϚΠζ w ʮදࣔʯϝχϡʔ͔Βʮ5PVDI#BSΛΧελϚΠζʜʯΛબ୒ ͢Δ͜ͱͰදࣔ͢Δ߲໨΍ฒͼॱͷઃఆ͕Մೳ w DVTUPNJ[BUJPO"MMPXFE*UFN*EFOUJpFST΍ DVTUPNJ[BUJPO3FRVJSFE*UFN*EFOUJpFSTΛࢦఆ 40

  41. ࣮૷ํ๏ • NSTouchBarDelegateΛ࣮૷͢Δ • func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier:

    NSTouchBarItem.Identifier) -> NSTouchBarItem? • identifierʹࣄલʹఆٛͨ͠஋͕౉͞ΕΔͷͰNSTouchBarItem ͷαϒΫϥεΛੜ੒ͯ͠ฦ͢ • NSTouchBarItemʹ͸customizationLabelΛઃఆ͓ͯ͘͠ͱΧ ελϚΠζ࣌ʹϥϕϧ͕දࣔ͞ΕΔ 41
  42. ݕࡧॱং IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTUPVDICBS 10. App delegate 9. App object 8. Main

    window’s controller 7. Main window’s delegate 6. Main window 5. Main window’s first responder 4. Key window’s controller 3. Key window’s delegate 2. Key window 1. Key window’s first responder 5PVDI#BSΛݕࡧ͢ΔॱংʢԼ͔Β্ʹʣ 6*3FTQPOEFSͷαϒΫϥεΛൃݟ͢Δͱߋʹݕࡧ 9. App delegate 8. App object 7. Key window’s controller 6. Key window 5. View controller that is closest to root of window 4. View that is closest to root of window 3. Intermediate view controllers and views 2. View controller of key window’s first responder 1. Key window’s first responder 42
  43. ஫ҙ఺ w 6*3FTQPOEFSΛܧঝͯ͠Ε͹දࣔ͞ΕΔ͔ͱࢥ͕ͬͨ4XJGU6* ʢ6*7JFX$POUSPMMFS3FQSFTFOUBCMF 6*7JFX3FQSFTFOUBCMFͰϥοϓͨ͠΋ͷʣͰ͸ දࣔ͞Εͳ͍ w XJOEPX4DFOFͷUPVDI#BSϓϩύςΟʹແཧ΍Γ/45PVDI#BSͷΠϯελϯεΛ౉ ͙͢Β͍͔͠ͳͦ͞͏ w

    4XJGU6*Λར༻͍ͨ͠৔߹͸$BUBMZTUͰ͸ແ͘NBD04ωΠςΟϒͷΞϓϦΛ։ൃ͠ ͨํ͕ྑ͍͔΋ w εϥΠμʔΛදݱ͢Δ/44MJEFS5PVDI#BS*UFN͔Β஋Λऔಘ͢ΔϓϩύςΟ͕ແ͍ w TMJEFS*UFNWBMVF GPS,FZEPVCMF7BMVF ͰऔಘՄೳ 43
  44. πʔϧόʔ 44

  45. πʔϧόʔ w πʔϧόʔ͸ΞϓϦέʔγϣϯͷ্෦ʹݻఆͰදࣔ͞ΕΔόʔ ͷ͜ͱ w Ϙλϯ΍ϥϕϧɺϝχϡʔΛઃஔ͢Δ͜ͱ͕Մೳ w .BD$BUBMZTU ͔Βݕࡧόʔ΍ηύϨʔλʔ΋ઃஔՄೳ w

    XJOEPX4DFOFUJUMFCBS UPPMCBSΛ௚઀ૢ࡞͢ΔͷͰը໘͝ͱ ʹදࣔ͢Δ߲໨Λૢ࡞͢Δ༷ͳ໨తʹ͸޲͍͍ͯͳ͍ 45
  46. ࣮૷ํ๏ • NSToolbar.IdentifierΛఆٛ͢Δ • πʔϧόʔͷछྨΛࣝผ͢Δ 46 extension NSToolbar.Identifier { static

    let myToolbar = NSToolbar.Identifier( "me.fromkk.CatalystSampler.MyToolbar" ) }
  47. • NSToolbarItem.IdentifierΛఆٛ͢Δ • πʔϧόʔʹදࣔ͢Δ߲໨ͷछྨΛࣝผ͢Δ ࣮૷ํ๏ 47 extension NSToolbarItem.Identifier { static

    let arrowGroup = NSToolbarItem.Identifier( "me.fromkk.CatalystSampler.arrowGroup" ) static let reload = NSToolbarItem.Identifier( "me.fromkk.CatalystSampler.reload" ) static let favorite = NSToolbarItem.Identifier( "me.fromkk.CatalystSampler.favorite" ) }
  48. /45PPMCBS w πʔϧόʔࣗମͷΫϥε w XJOEPX4DFOFUJUMF#BS UPPMCBSʹ౉͢͜ͱͰදࣔ͞ΕΔ w /45PPMCBS%FMFHBUFͰπʔϧόʔͷ߲໨ͳͲΛฦ͢͜ͱͰϘ λϯͳͲ͕දࣔ͞ΕΔ w

    JOTFSU*UFN΍SFNPWF*UFNͰ߲໨ͷ௥Ճɾ࡟আ΋Մೳ 48
  49. /45PPMCBS%FMFHBUF 49 @available(iOS 13.0, *) public protocol NSToolbarDelegate : NSObjectProtocol

    { /// itemIdentifierʹ߹ͬͨπʔϧόʔͷ߲໨Λฦ͢ optional func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? /// ॳظʹදࣔ͢ΔitemIdentifierͷҰཡΛฦ͢ optional func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] /// දࣔΛڐՄ͢ΔitemIdentifierͷҰཡΛฦ͢ optional func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] /// બ୒ՄೳͳitemIdentifierͷҰཡΛฦ͢ optional func toolbarSelectableItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] /// ߲໨͕௥Ճ͞ΕΔͱ͖ʹݺ͹ΕΔ optional func toolbarWillAddItem(_ notification: Notification) /// ߲໨͕࡟আ͞ΕΔͱ͖ʹݺ͹ΕΔ optional func toolbarDidRemoveItem(_ notification: Notification) }
  50. දࣔܗࣜ w UPPMCBSEJTQMBZ.PEFΛมߋ͢Δ͜ͱͰදࣔΛมߋ͢Δ͜ͱ͕ Ͱ͖Δ w JDPO"OE-BCFM w JDPO0OMZ w MBCFM0OMZ

    50
  51. /45PPMCBS*UFNͷछྨ 51 NSToolbarItemGroup NSToolbarItem NSMenuToolbarItem

  52. πʔϧόʔͷΧελϚΠζ • toolbar.allowsUserCustomization = true Λઃఆ͢Δ͜ͱͰϢʔβʔ͕ࣗ༝ʹΧελϚΠζ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ • toolbar.autosavesConfiguration = true

    Λઃఆ͢Δ͜ͱͰઃఆ߲ͨ͠໨Λࣗಈతʹอଘ͓ͯ͘͜͠ͱͰ࣍ճҎ߱อଘ͠ ͨઃఆ͕൓ө͞ΕΔ 52
  53. #JH4VSͰͷਐԽ w πʔϧόʔͷදࣔελΠϧΛมߋ͢Δ͜ͱ͕Մೳʹ 53 IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  54. #JH4VSͰͷਐԽ w 4QMJU7JFXͷը໘͝ͱʹ߲໨Λઃఆ͢Δ͜ͱ΋Մೳʹ 54 IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  55. #JH4VSͰͷ$BUBMZTUͷਐԽ 55

  56. #JH4VSͰͷ$BUBMZTUͷਐԽ w "3,JUͳͲ͜Ε·Ͱ͸ϑϨʔϜϫʔΫΛ࡟আ͢Δඞཁ͕͋ͬͨ΋ͷ΋Ϗϧυ͕ Մೳʹͳͬͨʢػೳͱͯ͠͸ར༻ෆՄʣ w 6*3FTQPOEFSʹQSFTTFT#FHBOQSFTTFT&OEFE͕࣮૷͞ΕɺΑΓࡉ͔͍ϋ ϯυϦϯά͕Մೳʹ w 6*5BCMF7JFX6*$PMMFDUJPO7JFXʹTFMFDUJPO'PMMPXT'PDVTϓϩύςΟ͕௥Ճ ͞ΕԾબ୒ঢ়ଶʹରԠ

    w /4$VSTPSΫϥε͕௥Ճ͞ΕදࣔɾඇදࣔͳͲͷૢ࡞͕Մೳʹ w Χʔιϧͷը૾΋มߋՄೳ 56
  57. #JH4VSͰͷ$BUBMZTUͷਐԽ w $BUBMJOBͰ͸ॖখ͞Ε͍͕ͯͨɺ#JH4VS͔Β͸͞ΒʹNBD04 ʹ࠷దԽͤͨ͞දࣔʹ΋ରԠ w Ϙλϯ΍εϥΠμʔͳͲ͕ΑΓNBD04Β͘͠ w 4XJGU6*ͰίϚϯυɺπʔϧόʔʹରԠ w ϥΠϑαΠΫϧ͕ΑΓࡉ͔͘ϋϯυϦϯάՄೳʹʢ࠷খԽɺόοΫά

    ϥ΢ϯυεϖʔεɺඇදࣔͳͲʣ w Ϟʔμϧ΍ϙοϓΦʔόʔ͕ಠཱͨ͠XJOEPXʹ 57
  58. #JH4VSͰͷ$BUBMZTUͷਐԽ w ࣸਅฤू֦ுػೳʹରԠ w ΞϓϦ಺՝ۚΛݸผʹઃఆ͢Δ͜ͱ͕Մೳʹ w ΞΫηϯτΧϥʔΛઃఆ͢Δ͜ͱ͕Մೳʹ 58

  59. #JH4VSͰͷ$BUBMZTUͷਐԽ w 6*,JUͷਐԽʹ௥ै w 6*$PMPS8FMM6*$PMPS1JDLFS7*FX$POUSPMMFS w 6*%BUF1JDLFSͷਐԽʹ΋ରԠ w 6*#VUUPO6*#BS#VUUPO*UFNͷNFOVTʹ΋ରԠ w

    4QMJU7JFX$POUSPMMFS͕ྻදࣔʹରԠ w J04J1BE04ͱಉ༷ʹ8JEHFU,JUʹରԠ 59
  60. ·ͱΊ w 1MBUGPSN͕૿͑Δ͜ͱ͸Ϗδωεతʹ΋νϟϯε͕޿͕Δ͸ͣ w ϝχϡʔɺπʔϧόʔɺ5PVDI#BS͸J04ʹ͸ແ͍͕NBD04Ͱ͸ ॏཁͳػೳͳͷͰੋඇ࣮૷͠Α͏ w NBD04#JH4VSͷਐԽʹ΋ظ଴ 60

  61. 61

  62. 62

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