Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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への対応方法をご紹介します。

fromkk

September 20, 2020
Tweet

More Decks by fromkk

Other Decks in Programming

Transcript

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

    View Slide

  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

    View Slide

  3. 3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. $BUBMZTUͷ͜Ε·Ͱ
    9

    View Slide

  10. 10

    View Slide

  11. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    11

    View Slide

  12. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    12

    View Slide

  13. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    13

    View Slide

  14. 14

    View Slide

  15. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    15

    View Slide

  16. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    16

    View Slide

  17. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    17

    View Slide

  18. 1SPKFDU$BUBMZTUͱ͸
    w 88%$Ͱൃද͞ΕͨJ1BE04޲͚ͷΞϓϦΛNBD04޲
    ͚ʹϏϧυՄೳʹ͢Δٕज़
    w 6*,JU͕ར༻Ͱ͖ΔͷͰJ04Ͱഓ͖ٕͬͯͨज़͕ͦͷ··ར༻Մ

    w গͳ͍޻਺Ͱ഑෍Ͱ͖ΔϓϥοτϑΥʔϜ͕૿͑ΔͷͰϏδω
    εతʹ΋νϟϯε
    18

    View Slide

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

    View Slide

  20. J04ͱNBD04ͷେ͖ͳҧ͍
    w ϝχϡʔ

    w 5PVDI#BS

    w πʔϧόʔ
    20

    View Slide

  21. ϝχϡʔ
    21

    View Slide

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

    View Slide

  23. ࣮૷ํ๏
    23

    View Slide

  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

    View Slide

  25. 6*.FOV4ZTUFN
    w Ͳ͏͍͏࣌ʹݺ͹Ε͔ͨɺϝχϡʔΛ࠶ߏங͢Δඞཁ͕͋Δ͔
    ͳͲͷ৘ใΛอ͍࣋ͯ͠Δ
    IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJNFOVTZTUFN
    25
    UIMenuSystem ఆٛ
    .main ΞϓϦىಈ࣌ʹ౉͞ΕΔɻΞϓϦશମͷϝχϡʔΛߏங͢Δࡍʹར༻͢Δɻ
    .context ӈΫϦοΫϝχϡʔ(contextMenu)͕දࣔ͞ΕΔࡍʹ౉͞ΕΔɻ

    View Slide

  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

    View Slide

  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

    View Slide

  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)

    View Slide

  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)

    View Slide

  30. 6*,FZ$PNNBOE
    w ΩʔϘʔυγϣʔτΧοτΛՄೳʹ͢ΔΫϥε
    w 6*$PNNBOEΛܧঝ͍ͯ͠ΔͷͰ6*.FOVͷDIJMESFOʹ௥Ճ͢
    Δ͜ͱ͕Ͱ͖Δ
    30
    IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJLFZDPNNBOE

    View Slide

  31. DBO1FSGPSN"DUJPO @XJUI4FOEFS

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

    View Slide

  32. 5PVDI#BS
    32

    View Slide

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

    View Slide

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

    View Slide

  35. ࣮૷ํ๏
    35

    View Slide

  36. ࣮૷ํ๏
    • NSTouchBar.CustomizationIdentifierΛఆٛ͢Δ
    • Touch BarͷछྨΛࣝผ͢Δ
    36
    extension NSTouchBar.CustomizationIdentifier {
    static let myTouchBar = NSTouchBar.CustomizationIdentifier(
    "me.fromkk.CatalystSampler.MyTouchBar"
    )
    }

    View Slide

  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ʹදࣔ͢Δ߲໨ͷछྨΛࣝผ͢Δ

    View Slide

  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

    View Slide

  39. NSTouchBarͷϓϩύςΟ
    • customizationIdentifier:Touch BarΛࣝผ͢ΔͨΊͷ஋
    • customizationAllowedItemIdentifiers:ΧελϚΠζΛڐՄ͢Δࣝผࢠ
    • customizationRequiredItemIdentifiers:ΧελϚΠζ࣌ʹ࡟আͰ͖ͳ͍ࣝผࢠ
    • defaultItemIdentifiers:ΧελϚΠζ͢Δલʹදࣔ͢Δࣝผࢠ
    • itemIdentifiers:ొ࿥ࡁΈͷࣝผࢠ
    • principalItemIdentifier:தԝʹදࣔ͞ΕΔॏཁͳࣝผࢠ
    • escapeKeyReplacementItemIdentifier:Esc ΩʔΛࠩ͠ସ͑Δ৔߹ͷࣝผࢠ
    • templateItems:ࣝผࢠ͔ΒΠϯελϯεԽ͞Ε߲ͨ໨Λอ࣋͢ΔϓϩύςΟ
    • delegate: ࣝผࢠ͔ΒΠϯελϯεΛੜ੒͢ΔॲཧΛҠৡ
    39

    View Slide

  40. ΧελϚΠζ
    w ʮදࣔʯϝχϡʔ͔Βʮ5PVDI#BSΛΧελϚΠζʜʯΛબ୒
    ͢Δ͜ͱͰදࣔ͢Δ߲໨΍ฒͼॱͷઃఆ͕Մೳ
    w DVTUPNJ[BUJPO"MMPXFE*UFN*EFOUJpFST΍
    DVTUPNJ[BUJPO3FRVJSFE*UFN*EFOUJpFSTΛࢦఆ
    40

    View Slide

  41. ࣮૷ํ๏
    • NSTouchBarDelegateΛ࣮૷͢Δ
    • func touchBar(_ touchBar: NSTouchBar,
    makeItemForIdentifier identifier:
    NSTouchBarItem.Identifier) -> NSTouchBarItem?
    • identifierʹࣄલʹఆٛͨ͠஋͕౉͞ΕΔͷͰNSTouchBarItem
    ͷαϒΫϥεΛੜ੒ͯ͠ฦ͢
    • NSTouchBarItemʹ͸customizationLabelΛઃఆ͓ͯ͘͠ͱΧ
    ελϚΠζ࣌ʹϥϕϧ͕දࣔ͞ΕΔ
    41

    View Slide

  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

    View Slide

  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

    View Slide

  44. πʔϧόʔ
    44

    View Slide

  45. πʔϧόʔ
    w πʔϧόʔ͸ΞϓϦέʔγϣϯͷ্෦ʹݻఆͰදࣔ͞ΕΔόʔ
    ͷ͜ͱ
    w Ϙλϯ΍ϥϕϧɺϝχϡʔΛઃஔ͢Δ͜ͱ͕Մೳ
    w .BD$BUBMZTU͔Βݕࡧόʔ΍ηύϨʔλʔ΋ઃஔՄೳ
    w XJOEPX4DFOFUJUMFCBS UPPMCBSΛ௚઀ૢ࡞͢ΔͷͰը໘͝ͱ
    ʹදࣔ͢Δ߲໨Λૢ࡞͢Δ༷ͳ໨తʹ͸޲͍͍ͯͳ͍
    45

    View Slide

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

    View Slide

  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"
    )
    }

    View Slide

  48. /45PPMCBS
    w πʔϧόʔࣗମͷΫϥε
    w XJOEPX4DFOFUJUMF#BS UPPMCBSʹ౉͢͜ͱͰදࣔ͞ΕΔ
    w /45PPMCBS%FMFHBUFͰπʔϧόʔͷ߲໨ͳͲΛฦ͢͜ͱͰϘ
    λϯͳͲ͕දࣔ͞ΕΔ
    w JOTFSU*UFN΍SFNPWF*UFNͰ߲໨ͷ௥Ճɾ࡟আ΋Մೳ
    48

    View Slide

  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)
    }

    View Slide

  50. දࣔܗࣜ
    w UPPMCBSEJTQMBZ.PEFΛมߋ͢Δ͜ͱͰදࣔΛมߋ͢Δ͜ͱ͕
    Ͱ͖Δ
    w JDPO"OE-BCFM
    w JDPO0OMZ
    w MBCFM0OMZ
    50

    View Slide

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

    View Slide

  52. πʔϧόʔͷΧελϚΠζ
    • toolbar.allowsUserCustomization = true
    Λઃఆ͢Δ͜ͱͰϢʔβʔ͕ࣗ༝ʹΧελϚΠζ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ
    • toolbar.autosavesConfiguration = true
    Λઃఆ͢Δ͜ͱͰઃఆ߲ͨ͠໨Λࣗಈతʹอଘ͓ͯ͘͜͠ͱͰ࣍ճҎ߱อଘ͠
    ͨઃఆ͕൓ө͞ΕΔ
    52

    View Slide

  53. #JH4VSͰͷਐԽ
    w πʔϧόʔͷදࣔελΠϧΛมߋ͢Δ͜ͱ͕Մೳʹ
    53
    IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  57. #JH4VSͰͷ$BUBMZTUͷਐԽ
    w $BUBMJOBͰ͸ॖখ͞Ε͍͕ͯͨɺ#JH4VS͔Β͸͞ΒʹNBD04
    ʹ࠷దԽͤͨ͞දࣔʹ΋ରԠ
    w Ϙλϯ΍εϥΠμʔͳͲ͕ΑΓNBD04Β͘͠
    w 4XJGU6*ͰίϚϯυɺπʔϧόʔʹରԠ
    w ϥΠϑαΠΫϧ͕ΑΓࡉ͔͘ϋϯυϦϯάՄೳʹʢ࠷খԽɺόοΫά
    ϥ΢ϯυεϖʔεɺඇදࣔͳͲʣ
    w Ϟʔμϧ΍ϙοϓΦʔόʔ͕ಠཱͨ͠XJOEPXʹ
    57

    View Slide

  58. #JH4VSͰͷ$BUBMZTUͷਐԽ
    w ࣸਅฤू֦ுػೳʹରԠ
    w ΞϓϦ಺՝ۚΛݸผʹઃఆ͢Δ͜ͱ͕Մೳʹ
    w ΞΫηϯτΧϥʔΛઃఆ͢Δ͜ͱ͕Մೳʹ
    58

    View Slide

  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

    View Slide

  60. ·ͱΊ
    w 1MBUGPSN͕૿͑Δ͜ͱ͸Ϗδωεతʹ΋νϟϯε͕޿͕Δ͸ͣ
    w ϝχϡʔɺπʔϧόʔɺ5PVDI#BS͸J04ʹ͸ແ͍͕NBD04Ͱ͸
    ॏཁͳػೳͳͷͰੋඇ࣮૷͠Α͏
    w NBD04#JH4VSͷਐԽʹ΋ظ଴
    60

    View Slide

  61. 61

    View Slide

  62. 62

    View Slide

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

    View Slide