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

JavaScript で OS X を自動操作

JavaScript で OS X を自動操作

AppleScript の代替となる JavaScript for Automation (JXA) の説明。
kanazawa.rb meetup 48 発表資料。

Tomokazu Kiyohara

August 20, 2016
Tweet

More Decks by Tomokazu Kiyohara

Other Decks in Technology

Transcript

  1. +BWB4DSJQUד
    049׾荈⹛乼⡲
    ,BOB[BXBSCNFFUVQ


    View Slide

  2. "QQMF4DSJQU
    ˖ 049ך乼⡲׾荈⹛⻉ׅ׷׋׭ךأؙٔفز鎉铂
    ˖ 4ZTUFN 䎃
    ַ׵䲿⣘ׁ׸גְ׷
    ˖ 㹋遤橆㞮׮ְ׹ְ׹֮׷
    ˖ ،فٖحز
    ˖ ءٕؑ
    ˖ "VUPNBUPS

    View Slide

  3. "QQMF4DSJQU
    ˖ 蕯䎁暴䗙ך֮׷鎉铂➬圫
    ˖ 㷕统؝أزכװװ넝׭

    View Slide

  4. "QQMF4DSJQU4BNQMF
    set urls to {"https://www.google.co.jp","http://www.yahoo.co.jp","https://www.apple.com"}
    set countOfUrls to count urls
    tell application "Safari"
    activate
    tell window 1
    set firstTab to current tab
    repeat with i from 1 to countOfUrls
    set URL of document 1 to (item i of urls)
    if i = countOfUrls then exit repeat
    set current tab to (make new tab)
    end repeat
    set current tab to firstTab
    end tell
    end tell
    4BGBSJ׾Ꟛְג

    ةـ׾鷄⸇׃אא

    אך63-׾Ꟛֻ

    View Slide

  5. ˊ+BWB4DSJQUGPS"VUPNBUJPO3FMFBTF/PUF

    IUUQTEFWFMPQFSBQQMFDPNMJCSBSZNBDSFMFBTFOPUFT*OUFSBQQMJDBUJPO$PNNVOJDBUJPO3/
    +BWB4DSJQU'PS"VUPNBUJPO"SUJDMFT*OUSPEVDUJPOIUNM
    +BWB4DSJQUGPS"VUPNBUJPO
    QSPWJEFTUIFBCJMJUZUPVTF+BWB4DSJQU
    GPSJOUFSBQQMJDBUJPODPNNVOJDBUJPO
    CFUXFFOBQQTJO049

    View Slide

  6. +BWB4DSJQUGPS"VUPNBUJPO
    +9"

    ˖ "QQMF4DSJQUך➿剏ה׃גך+BWB4DSJQU
    ˖ את׶"QQMF4DSJQUך㹋遤橆㞮ָ+BWB4DSJQU׾
    ؟ه٦ز׃׋הְֲ鑧
    ˖ 049 :PTFNJUF
    ַ׵䲿⣘

    View Slide

  7. +9"4BNQMF
    var urls = [
    "https://www.google.co.jp",
    "http://www.yahoo.co.jp",
    "https://www.apple.com"
    ]
    var safari = Application("Safari")
    safari.activate()
    var w = safari.windows[0]
    var firstTab = w.currentTab()
    for (var i in urls) {
    w.tabs[0].url = urls[i]
    if (i == urls.length - 1) { break }
    var _tab = new safari.Tab()
    w.tabs.push(_tab)
    w.currentTab = _tab
    }
    w.currentTab = firstTab
    4BGBSJ׾Ꟛְג

    ةـ׾鷄⸇׃אא

    אך63-׾Ꟛֻ

    View Slide

  8. )FMMP8PSME
    أؙٔفزؒر؍ةBQQ

    View Slide

  9. )FMMP8PSME

    View Slide

  10. )FMMP8PSME

    View Slide

  11. )FMMP8PSME

    View Slide

  12. +9"ך剅ַֹ׋

    -FWFM
    ˖ "QQMJDBUJPOؙٓأך؎ٝأةٝأ׾⡲׷
    ˖ فٗػذ؍׾铣׫鴥׬
    ˖ فٗػذ؍׾剅ֹ䳔ִ׷
    ˖ ًاحس׾ㄎן⳿ׅ

    View Slide

  13. -FWFM
    var safari = Application("Safari")
    safari.activate()
    var w = safari.windows[0]
    console.log(w.tabs[0].url())
    w.tabs[0].url = "https://www.google.co.jp"
    4BGBSJ׾Ꟛְג

    植㖈ך63-׾⿫撑׃

    63-׾刿倜ׅ׷

    View Slide

  14. +9"ך剅ַֹ׋

    -FWFM
    ˖ ءأذي؎كٝز׾ⵃ欽ׅ׷
    ˖ وؐأؙٔحؙװؗ٦ن٦سⰅ⸂
    ˖ ِ٦ؠ٦؎ٝةؙٓءّٝ"1*׾ⵃ欽ׅ׷
    ˖ ㉏ְさ׻ׇت؎،ؚٗ
    ˖ /PUJDBUJPO
    4BNQMF䖓鶢

    View Slide

  15. +9"ך剅ַֹ׋

    -FWFM
    ˖ ⴽղך"QQMJDBUJPO؎ٝأةٝأず㡦׾鸬䵿
    ˖ 4BGBSJך63-׾.FTTBHFד鷏⥋הַ
    ˖ ؙٔحفن٦سⰻ㺁דٔو؎ٝت涫ꐮהַ
    ➙㔐כ䪔׻זְָ䩛갫כ知⽃

    View Slide

  16. +9"ד⢪ִ׷"1*
    ˖ "QQMJDBUJPO嫣ח⢪ִ׷"1*ָ殯ז׷
    ˖ וֲװ׏ג锃ץ׷ַ˘
    ˖ չأؙٔفزؒر؍ةBQQպךչٓ؎ـٓٔպ
    ˖ ًصُ٦ך<ؐ؍ٝسؐ>̔<ٓ؎ـٓٔ>

    View Slide

  17. ˖ ⵃ欽׃׋ְ،فٔ׾鼅䫛ׅ׷
    ٓ؎ـٓٔ

    View Slide

  18. ˖ ،فָٔ䲿⣘ׅ׷"1*ָ然钠דֹ׷
    ٓ؎ـٓٔ

    View Slide

  19. ٓ؎ـٓٔך铣׫ַ׋ד
    כת׏׋הֿ׹

    View Slide

  20. ٓ؎ـٓٔך铣׫ַ׋ד
    כת׏׋הֿ׹
    ˖ 剑ⴱך؎ٝرٝزָًاحسせַ
    ˖ 如ך؎ٝرٝزָ䒷侧׌ז
    ˖ 如ך؎ٝرٝزכ

    View Slide

  21. ٓ؎ـٓٔך铣׫ַ׋ד
    כת׏׋הֿ׹
    ˖ 瘶ִ剑穄䒷侧ד床ׅؔفءّٝ)BTI䕎䒭
    ˖ <>➰ֹכؔفءّشٕ
    ˖ ⢽EVQMJDBUF PCK \UPQBUI SFQMBDJOHUSVF^

    View Slide

  22. ٓ؎ـٓٔך铣׫ַ׋ד
    כת׏׋הֿ׹
    ˖ 痥♧䒷侧ךչⰻ㺁պָ剅ְגזְ
    ˖ זח׾䭷㹀׃׋׵ְְך

    View Slide

  23. ٓ؎ـٓٔך铣׫ַ׋ד
    כת׏׋הֿ׹
    ˖ 瘶ִ䭷㹀׃זְ
    ˖ )BTIך׫床ׅ
    ˖ ⢽NBLF \OFXPCK BUQBUI^

    View Slide

  24. "QQMF4DSJQUַ׵ך
    獳嗂儗ח涪欰׃׋
    ♶侭さָ鋅ִ׋孡ָׅ׷

    View Slide

  25. ٓ؎ـٓٔך鷄⸇
    ˖ ⵃ欽׃׋ְ،فָٔٓ؎ـٓٔחזְ㜥さ
    ˖ 鷄⸇ׅ׷ֿהָדֹ׷
    ˖ BQQؿ؋؎ٕ׾湫䱸䭷㹀ׅ׷

    View Slide

  26. ٓ؎ـٓٔך鷄⸇
    ˖ 鷄⸇نةַٝ׵BQQ׾䭷㹀ׅ׷

    View Slide

  27. +9"ךرغحؚ
    ˖ DPOTPMFMPHرغحؚ
    ˖ رغحؖ 4BGBSJ8FC*OTQFDUPS

    View Slide

  28. 4BGBSJדرغحؚ
    ˖ 049 &M$BQJUBO
    ַ׵䲿⣘
    ˖ IUUQTEFWFMPQFSBQQMFDPNMJCSBSZNBD
    SFMFBTFOPUFT*OUFSBQQMJDBUJPO$PNNVOJDBUJPO
    3/+BWB4DSJQU'PS"VUPNBUJPO"SUJDMFT
    049IUNM

    View Slide

  29. رغحؖך彊⪒
    ˖ 4BGBSJך8FC*OTQFDUPS׾剣⸬חׅ׷
    ˖ 4BGBSJך橆㞮鏣㹀歗꬗ַ׵鏣㹀
    ˖ <鑫稢>̔<ًصُ٦غ٦חꟚ涪ًصُ٦׾邌爙>

    View Slide

  30. رغحؖך彊⪒
    ˖ +9"ה4BGBSJ8FC*OTQFDUPS׾ꟼ鸬בֽ׷
    ˖ 4BGBSJךًصُ٦ַ׵鏣㹀
    ˖ <Ꟛ涪>̔< مأزせ
    >̔<+4$POUFYUTך8FC؎ٝ
    ألؙة׾荈⹛涸ח邌爙>

    View Slide

  31. رغحؖך饯⹛
    ˖ +9"ך؝٦س⚥חEFCVHHFSה鎸鶢
    ˖ 㹋遤ׅ׷
    ˖ 䔲鑩皘䨽דCSBLF׃ג8FC*OTQFDUPSָ饯⹛

    View Slide

  32. رغحؖך饯⹛
    var hoge = function() {
    debugger
    console.log("hoge")
    }
    debugger
    console.log("fuga")
    hoge()

    View Slide

  33. رغحؖך饯⹛

    View Slide

  34. رغحؖך岣䠐挿
    ˖ "QQMJDBUJPO 4BGBSJ
    ׾乼⡲׃גְ׷ה饯⹛׃ז
    ְ㜥さָ֮׷
    ˖ 4BGBSJ♳ד؝٦س׾剅ֹ䳔ִ׷ה✮劍׃זְ䮙⹛
    ׾ׅ׷㜥さָ֮׷

    View Slide

  35. 4UBOEBSE"EEJUJPOT
    ˖ זחַה⤑ⵃז堣腉׾鷄⸇ׅ׷ٓ؎ـٓٔ
    ˖ ت؎،ؚٗהַ/PUJDBUJPOהַ
    ˖ "QQMJDBUJPOؙٓأחغ؎ٝس׃ג⢪ֲ
    ˖ *ODMVEF4UBOEBSE"EEJUJPOTفٗػذ؍

    View Slide

  36. 4UBOEBSE"EEJUJPOT

    View Slide

  37. 4UBOEBSE"EEJUJPOT4BNQMF
    var app = Application.currentApplication()
    app.includeStandardAdditions = true
    app.displayAlert("֮׵٦ה")
    var Hello = function() {
    try {
    app.displayDialog("ֿ׿ח׍׻")
    console.log("כ׹٦")
    } catch(e) {
    console.log("ּ׏לְ")
    }
    }
    Hello()
    Hello()
    app.displayNotification("ק׿ע׿",{withTitle:"׋ְה׷",subtitle:"ׁע׋ְה׷"})

    View Slide

  38. 4UBOEBSE"EEJUJPOT
    ˖ ٓ؎ـٓٔ׾铣׮ֲ
    ˖ ⦐➂涸ח
    鋙ִגֶֻץֹ"1*
    ˖ ؿ؋؎ٕ SFBEXSJUF

    ˖ ؙٔحفن٦س TFU5IF$MJQCPBSE5PUIF$MJQCPBSE

    ˖ ؎ٝةؙٓءّٝ EJTQMBZ%JBMPH/PUJDBUJPOTBZ

    View Slide

  39. 4UBOEBSE"EEJUJPOT
    ˖ 窫㼎ח鋙ִגֶֻץֹ"1*
    ˖ ءٕؑأؙٔفزㄎן⳿׃ EP4IFMM4DSJQU

    View Slide

  40. EP4IFMM4DSJQU4BNQMF
    var app = Application.currentApplication()
    app.includeStandardAdditions = true
    var stdout = app.doShellScript("whoami")
    console.log(stdout)
    try {
    stdout = app.doShellScript("ls NOT_EXIST")
    } catch (e) {
    var stderr = e.message
    console.log(stderr)
    }

    View Slide

  41. 4ZTUFN&WFOUT
    ˖ ءأذي׾֮אֲַչ"QQMJDBUJPOպ
    ˖ ؗ٦ن٦سⰅ⸂הַ
    ˖ وؐأؙٔحؙהַ
    ˖ 049ך橆㞮鏣㹀הַ
    ˖ ؿٕؓت٦،ؙءّٝהַ

    View Slide

  42. 4ZTUFN&WFOUT

    View Slide

  43. 4ZTUFN&WFOUT4BNQMF
    var safari = Application("Safari")
    safari.activate()
    delay(2)
    var se = Application("System Events")
    se.keystroke("l", {using:"command down"})
    delay(2)
    se.keystroke("http://www.google.com")
    delay(2)
    se.keyCode(76)

    View Slide

  44. 4ZTUFN&WFOUT4BNQMF
    var se = Application("System Events")
    var safari = Application("Safari")
    safari.activate()
    delay(1)
    var toolbar = se.uiElements["Safari"].uiElements[0].uiElements[4]
    toolbar.uiElements[1].click()
    delay(1)
    toolbar.uiElements[5].click()
    delay(1)
    se.keyCode(125) // down arrow
    delay(1)
    se.keyCode(76) // enter

    View Slide

  45. 4ZTUFN&WFOUT
    ˖ ٓ؎ـٓٔ׾铣׮ֲ
    ˖ ⦐➂涸ח
    鋙ִגֶֻץֹ"1*
    ˖ (6*乼⡲ VJ&MFNFOUNFOV

    ˖ ؗ٦ن٦س LFZTUSPLFLFZ$PEF

    View Slide

  46. VJ&MFNFOUך岣䠐挿
    ˖ ،ؙإءؽٔذ؍
    ˖ VJ&MFNFOUך䱱׶倯

    View Slide

  47. ،ؙإءؽٔذ؍
    ˖ VJ&MFNFOU׾䪔ֲ儗חכ埄ꣲָ䗳銲חז׷
    ˖ ءأذي橆㞮鏣㹀
    ˖ <إُؗٔذ؍הفٓ؎غء٦>̔

    <فٓ؎غء٦>̔<،ؙإءؽٔذ؍>

    View Slide

  48. ،ؙإءؽٔذ؍鏣㹀

    View Slide

  49. ،ؙإءؽٔذ؍ت؎،ؚٗ
    ˖ ⴱ㔐㹋遤儗כֿ׿ז䠬ׄךت؎،ָؚٗ邌爙ׁ
    ׸׷

    View Slide

  50. ،ؙإءؽٔذ؍
    ثؑحؙ؝٦س
    var se = Application("System Events")
    if(se.uiElementsEnabled()) {
    console.log("،ؙإءؽٔذ؍ OK")
    } else {
    console.log("،ؙإءؽٔذ؍ NG")
    // ⟃♴כءأذي橆㞮鏣㹀ך،ؙإءؽٔذ؍鏣㹀׾Ꟛֻ؝٦س
    var pref = Application("System Preferences");
    var pane = pref.panes.byId("com.apple.preference.security")
    pane.anchors["Privacy_accessibility"].reveal();
    pref.activate()
    }

    View Slide

  51. VJ&MFNFOUך䱱׶倯
    ˖ 4ZTUFN&WFOUTךVJ&MFNFOUTꂁ⴨ַ׵׋ו׷

    View Slide

  52. ה֮׷⢽
    var se = Application("System Events")
    var app = se.uiElements[TARGET_APP_NAME].uiElements[TARGET_APP_NAME]
    var main_area = app.uiElements[5].uiElements["Box"].uiElements[0]
    var table1 = main_area.uiElements[0].uiElements[0]
    var tab = main_area.uiElements["Peers"]
    var table2 = main_area.uiElements[7].uiElements[0].uiElements[0]

    View Slide

  53. וֲװ׏ג鋅אֽ׷ך

    View Slide

  54. EVNQVJ&MFNFOUT
    var se = Application("System Events")
    se.uiElements[TARGET_APP_NAME].entireContents().forEach(function(v, i, a){
    console.log(`${Automation.getDisplayString(v)}`);
    console.log(`${v.name()} / ${v.description()}`);
    })

    View Slide

  55. EVNQVJ&MFNFOUT
    var se = Application("System Events")
    se.uiElements[TARGET_APP_NAME].entireContents().forEach(function(v, i, a){
    console.log(`${Automation.getDisplayString(v)}`);
    console.log(`${v.name()} / ${v.description()}`);
    })
    ׅץגך㶨銲稆
    VJ&MFNFOUךꥡ㾴׾邌爙
    㼎韋VJ&MFNFOUךفٗػذ؍
    邌爙ׁ׸גְ׷ذؗأز瘝

    View Slide

  56. EVNQ穠卓⢽
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@

    LBOB[[email protected]@垥彊ؐ؎ٝسؐ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    SBEJP(SPVQTBU

    OVMMٓإؚٓؔ٦ف
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    SBEJP(SPVQTBU
    SBEJP#VUUPOTCZ/BNF أٓ؎سٖ؎،ؐز

    أٓ؎سٖ؎،ؐزٓآؔنةٝ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    DIFDLCPYFTCZ/BNF وأة٦׾㢌刿

    وأة٦׾㢌刿ثؑحؙنحؙأ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TUBUJD5FYUTCZ/BNF ة؎زٕ皘勴剅ֹ

    ة؎زٕ皘勴剅ֹذؗأز
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU

    OVMMأؙٗ٦ٕ걄㚖
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    TUBUJD5FYUTCZ/BNF ،ؾ،ٓٝأ

    ،ؾ،ٓٝأذؗأز
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    DIFDLCPYFTCZ/BNF ة؎زٕ

    ة؎زٕثؑحؙنحؙأ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    DIFDLCPYFTCZ/BNF 劤俑

    劤俑ثؑحؙنحؙأ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    DIFDLCPYFTCZ/BNF أٓ؎س殢〾

    أٓ؎س殢〾ثؑحؙنحؙأ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    VJ&MFNFOUTBU

    OVMMꟚꟗ欽♲錬نةٝ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    TUBUJD5FYUTCZ/BNF 胜兝

    胜兝ذؗأز
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    CVUUPOTBU

    OVMMنةٝ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    QPQ6Q#VUUPOTBU

    OVMMهحف،حفنةٝ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    DPMPS8FMMTBU

    OVMMؕٓ٦ٕؐؑ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    CVUUPOTCZ/BNF وأة٦أٓ؎س׾箟꧊

    وأة٦أٓ؎س׾箟꧊نةٝ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU

    OVMMأؙٗ٦ٕ걄㚖
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU

    OVMMأؙٗ٦ٕ걄㚖
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    TDSPMM#BSTBU

    OVMMأؙٗ٦ٕغ٦
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    TDSPMM#BSTBU
    WBMVF*OEJDBUPSTBU

    OVMM⦼؎ٝآ؛٦ة
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    TDSPMM#BSTBU
    CVUUPOTBU

    OVMM♳ぢֹ濶⽩نةٝ
    "QQMJDBUJPO 4ZTUFN&WFOUT
    BQQMJDBUJPO1SPDFTTFTCZ/BNF ,FZOPUF
    XJOEPXTCZ/BNF LBOB[[email protected]@
    TDSPMM"SFBTBU
    TDSPMM#BSTBU
    CVUUPOTBU

    OVMM♴ぢֹ濶⽩نةٝ

    View Slide

  57. EVNQ穠卓⢽
    "QQMJDBUJPO 4ZTUFN&WFOUT

    BQQMJDBUJPO1SPDFTTFT
    CZ/BNF ,FZOPUF

    XJOEPXT
    CZ/BNF LBOB[[email protected]@

    TDSPMM"SFBT
    BU

    CVUUPOT
    CZ/BNF وأة٦أٓ؎س׾箟꧊

    وأة٦أٓ؎س׾箟꧊نةٝ

    View Slide

  58. זַזַא׵ְ

    View Slide

  59. ⯓➂ך濼䜋׾⦵׶׷
    ˖ +9"ך6*ًٖؒٝزךؙٔٝ׾《䖤ׅ׷أؙٔفز2JJUB

    IUUQRJJUBDPN[BLVSPJTIJLVSPJUFNTEFCBFD
    ˖ .BDךؗ٦ن٦سⰅ⸂ծوؐأؙٔحؙ׾+BWB4DSJQUד +9"
    2JJUB

    IUUQRJJUBDPN[BLVSPJTIJLVSPJUFNTBGBCFBECBGVJFMFNFOU

    View Slide

  60. ׌ְע⸔ַ׷
    ָ
    ת׌蕱遤

    View Slide

  61. ָ׿ל׷׃ַזְ
    قٕفى٦

    View Slide

  62. أؙٔفزך⥂㶷
    ˖ չأؙٔفزؒر؍ةBQQպד箟꧊׃׋׮ך׾

    ⥂㶷ׅ׷儗חכؿ؋؎ٕؿؓ٦وحز׾鼅ץ׷
    ˖ أؙٔفز
    ˖ أؙٔفزغٝسٕ
    ˖ ،فٔ؛٦ءّٝ
    ˖ ذؗأز

    View Slide

  63. أؙٔفزך⥂㶷
    ˖ չأؙٔفزؒر؍ةBQQպד箟꧊׃׋׮ך׾

    ⥂㶷ׅ׷儗חכؿ؋؎ٕؿؓ٦وحز׾鼅ץ׷
    ˖ أؙٔفز
    ˖ أؙٔفزغٝسٕ
    ˖ ،فٔ؛٦ءّٝ
    ˖ ذؗأز
    鑫稢ⶴ䠥

    View Slide

  64. 暴ⴽזꟼ侧
    ˖ 暴㹀ךة؎ىؚٝדㄎן⳿ׁ׸׷ꟼ侧
    ˖ 寸׭׵׸׋せ⵸ד㹀纏׃גֶֻ
    ˖ SVOׅץגךؿؓ٦وحز
    ˖ PQFO%PDVNFOUT QSJOU%PDVNFOUT JEMF
    SFPQFO RVJU،فٔ؛٦ءّٝؿؓ٦وحز

    View Slide

  65. SVO
    ˖ +9"㹋遤儗חㄎן⳿ׁ׸׷ꟼ侧
    ˖ 䒷侧׾《׶䪔ֲֿהָדֹ׷
    var run = function(argv) {
    console.log(`${argv[0]}`)
    }

    View Slide

  66. 暴ⴽזꟼ侧
    ˖ 暴㹀ךة؎ىؚٝדㄎן⳿ׁ׸׷ꟼ侧
    ˖ 寸׭׵׸׋せ⵸ד㹀纏׃גֶֻ
    ˖ SVOׅץגךؿؓ٦وحز
    ˖ PQFO%PDVNFOUT QSJOU%PDVNFOUT JEMF
    SFPQFO RVJU،فٔ؛٦ءّٝؿؓ٦وحز

    鑫稢ⶴ䠥

    View Slide

  67. ؝وٝسٓ؎ٝדך㹋遤
    ˖ PTBTDSJQU؝وٝس׾⢪ֲ
    ˖ TDQUז׵׉ךתת䭷㹀
    ˖ [email protected]
    ˖ ذؗأز䕎䒭ז׵ؿؓ٦وحز׾䭷㹀
    ˖ [email protected]

    View Slide

  68. ؎ٝةؙٓذ؍ـٌ٦س
    ˖ PTBTDSJQUJד饯⹛דֹ׷
    ˖ 㼎鑧涸؎ٝة٦ؿؑ؎أ
    ˖ JSC׫׋ְז׮ך
    ˖ DUSMEד䫙ֽ׷

    View Slide

  69. 㢩鿇ٓ؎ـٓٔךⵃ欽
    ˖ 0CK$JNQPSU׾⢪׏גٓ؎ـٓٔ׾铣׫鴥׭׷
    ˖ FYJUDPEF➰ֹד穄✪׃׋׶橆㞮㢌侧׾⿫撑׃׋׶ׅ
    ׷ךחTUEMJC׾铣׫鴥׬ֿהָ㢳ְ
    ˖ $PDPBךٓ؎ـٓٔ׾⢪ֲֿה׮״ֻ֮׷
    ˖ $PNNPO+4װ#SPXTFSJGZה鸬⹛ז׿גֿה׮דֹ׷
    鑫稢ⶴ䠥

    View Slide

  70. תה׭

    View Slide

  71. תה׭
    ˖ "QQMF4DSJQUד⳿勻׷ֿהכקרדֹ׷
    ˖ 荈⹛⻉⤑ⵃ

    View Slide

  72. תה׭
    ˖ سًُؗٝزָ㼰זְ
    ˖ "QQMF4DSJQUךسًُؗٝز׾׫זָ׵

    չ䱿庠պ׾⫴ַׇ׷ךָ״ְ
    ˖ ׋׌׃䗳׆׃׮鎸鶢倯岀ָوحؾؚٝ׃גְ
    ׷鏬דכזְךד岣䠐

    劤أٓ؎س剑ⴱך؟ٝفٕד4BGBSJךةـ
    ׾乼⡲׃גְ׷鿇ⴓהַ

    View Slide

  73. תה׭
    #BTIד⳿勻׷ֿהכ
    #BTIדװ׸

    View Slide

  74. תה׭
    #BTIד⳿勻׷ֿהכ
    #BTIדװ׸
    +9"ח⡦ד׮װ׵ׇ״ֲהׅ׷ךדכזֻծ䖤䩛♶䖤䩛ח
    䘔ׄגⳢ椚ⴓⶴ׃ծ׉ךֲִד鸬䵿ׇׁ׷ֿהָꅾ銲דׅ

    EP4IFMM4DSJQU׾崞欽׃ת׃׳ֲ

    View Slide

  75. 5PNPLB[V,JZPIBSB
    IUUQHJUIVCDPNLJZPIBSB
    IUUQGBDFCPPLDPNUPNPLB[VLJZPIBSB
    5IBOLZPV

    View Slide