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

karmaを使ったSPA向けE2Eテスト技法

kyo_ago
February 27, 2017

 karmaを使ったSPA向けE2Eテスト技法

kyo_ago

February 27, 2017
Tweet

More Decks by kyo_ago

Other Decks in Programming

Transcript

  1. karmaΛ࢖ͬͨSPA޲͚
    E2Eςετٕ๏

    View Slide

  2. ࣗݾ঺հ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ɾ@kyo_ago
    ɾChatworkͷதͷਓ
    ɾझຯ͸Local Proxy੡࡞
    ɾUnder30͡Όͳ͍ΤϯδχΞ
    ɾਪ͠API͸Application Cache

    View Slide

  3. ·ͣ͸ँࡑ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  4. ࠓճ௨Γ͕͍͍ͱࢥͬͯʮ&&ςετʯͬͯݴͬͯ·͕͢
    *OUFHSBUJPOςετͬͯݴ͏ํ͕ਖ਼֬ͩͬͨΓ͠·͢ɻ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  5. ࠓճ఻͍͑ͨ͜ͱ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  6. 41"ͷςετʹ
    8FC%SJWFS͸޲͔ͳ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  7. 8FC%SJWFSͱ͸
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  8. 4FMFOJVN͔Βൃలͨ͠πʔϧ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  9. ϒϥ΢β͝ͱͷυϥΠόͱ
    ͦͷυϥΠόͱ௨৴͢Δ"1*
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  10. LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ChromeDriver FirefoxDriver IEDriver SafariDriver
    JSON Wire Protocol

    View Slide

  11. "1*ʹରԠͨ͠ΫϥΠΞϯτΛ
    ࢖͏͜ͱͰ൚༻తͳςετ͕Ͱ
    ͖Δ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  12. ྺ࢙͋Δ&&ςετͷ
    మ൘πʔϧ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    2004೥։ൃ։࢝

    View Slide

  13. Ͱ͸ͳͥʮ41"ͷςετʹ
    8FC%SJWFS͸޲͔ͳ͍ʯͷ͔
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  14. 8FC%SJWFS͸͋͘·Ͱ΋ը໘
    ΛભҠ͍ͯ͘͠ʮ8FCαΠτʯ
    ͷͨΊͷςετπʔϧ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  15. 41"޲͚ͷςετπʔϧͰ͸ͳ
    ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  16. 41"Λ8FC%SJWFSͰςετ͢
    Δͷ͸೉͍͠
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  17. 8FC%SJWFS͸௨ৗͷ։ൃπʔ
    ϧͱ͸ҧ͏֓೦Ͱಈ͘
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  18. LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ChromeDriver FirefoxDriver IEDriver SafariDriver
    JSON Wire Protocol
    ಠࣗϓϩτίϧͷੈք

    View Slide

  19. ௨ৗͷ։ൃϑϩʔͱͷ
    ࠩҟ͕େ͖͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  20. ྫ͑͹
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  21. /PEFDPOUFYUͱ
    #SPXTFSDPOUFYUͷ෼அ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    Electron͕ղܾ͔ͨͬͨ͠΍ͭ

    View Slide

  22. let webdriver = require('selenium-webdriver');


    let driver = new webdriver.Builder()

    .forBrowser('chrome')

    .build();


    driver.executeScript('return 2').then((res) => {

    console.log('returned ', res);

    });


    driver.get('https://www.google.co.jp/').then(() => {

    driver.quit();

    });
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ͚ͩ͜͜#SPXTFSDPOUFYU

    View Slide

  23. %FWFMPQQFS5PPMTͱڝ߹
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    DriverʹΑͬͯ͸

    View Slide

  24. DPOTPMFMPHͷ಺༰͕UFSNJOBM
    Ͱ͔֬͠ೝͰ͖ͳ͍
    ʢ0CKFDUల։ͱ͔ग़དྷͳ͍ʣ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  25. OPEFJOEFYKT
    UIFOBCMF8FC%SJWFS1SPYZ\
    [email protected]
    $POUSPM'MPX\
    [email protected]
    [email protected]
    5BTL2VFVF\
    [email protected]
    [email protected]
    [email protected]<0CKFDU>
    [email protected]
    [email protected]
    [email protected]
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ͜Ε͕ਏ͍ʂ

    View Slide

  26. ը໘ΛભҠ͍ͯ͘͠ʮ8FCα
    ΠτʯͰ͋Ε͹ͦΕ΄Ͳ໰୊ͳ
    ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  27. 41"ͷ৔߹ɺ͜ΕΒͷπʔϧ͕
    ࢖͑ͳ͍ͷ͸ඇৗʹ೉͍͠
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  28. ·ͨɺ8FC%SJWFS͸ϖʔδͷ
    ಡΈࠐΈ΍ΫϦοΫޙͷભҠΛ
    ࣗಈͰ଴ͭػೳ͕͋Δ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  29. var webdriver = require('selenium-webdriver'),

    By = webdriver.By,

    until = webdriver.until;


    var driver = new webdriver.Builder()

    .forBrowser('firefox')

    .build();

    driver.get('http://www.google.com/');

    driver.findElement(By.name(‘q')).sendKeys('webdriver');

    driver.findElement(By.name('btnG')).click();

    driver.wait(until.titleIs('webdriver - Google Search'),
    1000);

    driver.quit();
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ଴ͬͯ͘ΕΔ

    View Slide

  30. ͕ɺ41"Ͱ͸௨ৗ͜ΕΒͷػೳ
    ͸࢖༻͠ͳ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  31. ͦ͜Ͱ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  32. 41"ͷ*OUFHSBUJPOςετʹ͸
    ,BSNB
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  33. ,BSNB
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  34. ɾɾɾͬͯ͠·͢ʁ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  35. ࣾ಺Ͱฉ͍ͯΈͨ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  36. ʮLBSNBͷ࿩͢ΔΜͰ͢Αʯ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  37. ʮ͋Εɺ"OHVMBS+4ઐ༻Ͱ͢Α
    Ͷʁʯ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  38. ʮ·ͩ͋ͬͨΜͰ͔͢ʁʯ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  39. ʮ1SPUSBDUPSʹͳͬͨͱࢥͬ
    ͯ·ͨ͠ʯ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  40. ɾɾɾ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  41. ΋ͱ΋ͱ"OHVMBS+4ͷςετ༻
    ʹ։ൃ͞Εͨςετπʔϧ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  42. ݱࡏ͸ී௨ʹ൚༻తͳπʔϧ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ʢͱݴ͏͔Ή͠ΖAngularͱͷ૬ੑྑ͘ͳ͍Α͏ͳɻɻɻʣ

    View Slide

  43. ·ͩ·ͩ։ൃ͸׆ൃ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ʢ5೔લʹver 1.5.0ެ։ʣ

    View Slide

  44. 1SPUSBDUPSͱ͸ҧ͏
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ʢProtractor͸WebDriverܥʣ

    View Slide

  45. ͬ͘͟Γ͍͏ͱ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  46. ϒϥ΢β্Ͱಈ͘
    6OJUςετϥϯφʔ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  47. describe('Assert', () => {

    it('should true', () => {

    expect(true).toEqual(true);

    });

    });
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ͜Ε͕ϒϥ΢β্Ͱಈ͘

    View Slide

  48. ࠓճ͸7FSͰ௥Ճ͞Εͨ
    ػೳΛ࢖ͬͯ*OUFHSBUJPOςε
    τͷ࢓ํΛ঺հ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  49. DVTUPN$POUFYU'JMF
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  50. ςετΛࢦఆ͞ΕͨIUNM্Ͱ
    ߦ͏ػೳ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide





  51. 
<br/>%CLIENT_CONFIG%
<br/>window.__karma__.setupContext(window);
<br/>%MAPPINGS%
<br/>

    %SCRIPTS%

    Inside Frontend



    
<br/>window.__karma__.loaded();
<br/>



    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ͜͜ʹLBSNBDPOGKTͷ'JMF͕ల։͞ΕΔ
    ͔͜͜Β࣮ߦΛ։࢝

    View Slide

  52. ·ΔͰαΠτ্Ͱ6OJUUFTUΛ
    ૸Β͍ͤͯΔ͔ͷΑ͏ʹॻ͚Δ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  53. describe('Document title', () => {

    it('should be', () => {

    expect(document.title).toEqual('Inside Frontend');

    });

    });
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  54. Β͍͘ʂ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  55. ͔͠͠ɻɻɻ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  56. DVTUPN$POUFYU'JMFʹ΋
    ෺଍Γͳ͞͸͋Δ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  57. ෺଍Γͳ͞
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  58. ಡΈࠐΈ৔ॴ͕MPDBMIPTU
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  59. LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ෺଍Γͳ͞

    View Slide

  60. ࣮ࡍςετ͍ͨ͠υϝΠϯͰಡ
    Έࠐ·ΕΔΘ͚Ͱ͸ͳ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  61. LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ͜͏͍ͨ͠

    View Slide

  62. ௐ΂ͯΈͨ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  63. ɻɻɻͪΐͬͱແཧͬΆ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  64. LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    ͜͏͢Δ

    View Slide

  65. ໰୊
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  66. ผυϝΠϯ௨৴
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  67. ϒϥ΢βΛͩ·͢
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  68. खॱ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  69. ௨৴ͷॻ͖׵͑
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  70. -PDBMQSPYZΛ࢖͏
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  71. $ npm install --save-dev karma-proxy-plugin
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  72. customContextFile: "custom-context-file.html",

    proxyValidateSSL: false,

    client: { clearContext: false },

    middleware: ['proxy'],

    proxy: {

    '/inside-frontend/': {

    'target': 'http://inside-frontend.com/',

    'changeOrigin': true

    }

    },
    proxyReq: (proxyReq, req, res, options) => {

    },

    proxyRes: (proxyRes) => {

    },
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    LBSNBDPOGKT 44-1SPYZ࣌ͷূ໌ॻΤϥʔΛແࢹ
    ςετ࣮ߦ͝ͱʹ؀ڥΛΫϦΞ͠ͳ͍
    LBSNBQSPYZQMVHJO࢖༻
    LBSNBඪ४ͷQSPYJFTͰͳ͍͜ͱʹ஫ҙ
    ૹ৴Πϕϯτ
    ड৴Πϕϯτ

    View Slide

  73. JOTJEFGSPOUFOE΁ͷ௨৴Λ
    IUUQJOTJEFGSPOUFOEDPN
    ΁సૹ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  74. ௨৴ͷ޲͖ઌͷมߋ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  75. IUNM΍+4಺ͷ௨৴ͷ޲͖ઌΛ
    JOTJEFGSPOUFOEʹ޲͚͍ͨ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    1Ͱ͸Proxyϓϩηε্ཱ͕͕͚ͪͬͨͩͰɺ
    ϒϥ΢βͷProxyઃఆΛߦͬͨΘ͚Ͱ͸ͳ͍

    View Slide

  76. let base = document.createElement('base');

    base.href = '/example/';

    document.head.insertAdjacentElement('afterbegin', base);
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    DVTUPNDPOUFYUpMFIUNM

    View Slide

  77. XMLHttpRequest = () => {/* … */};

    fetch = () => {/* … */};
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    DVTUPNDPOUFYUpMFIUNM

    View Slide

  78. ؆୯
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  79. ଞʹ͍Ζ͍Ζ͍ͨ͠৔߹
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  80. 3FGFSFSΛॻ͖׵͍͑ͨ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  81. proxyReq: (proxyReq, req, res, options) => {

    proxyReq.setHeader('Referer', 'https://example.com/');

    },
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    LBSNBDPOGKT

    View Slide

  82. $PPLJFΛॻ͖׵͍͑ͨ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  83. proxyRes: (proxyRes) => {

    if (proxyRes.headers['set-cookie']) {

    proxyRes.headers['set-cookie'] =
    proxyRes.headers['set-cookie'].map((cookie) => {

    // karma಺͸httpͳͷͰsecureΛফ͢

    return cookie.replace(/\s*secure;?/i, '');

    })

    }

    },
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    LBSNBDPOGKT

    View Slide

  84. ϦμΠϨΫτઌΛมߋ͍ͨ͠
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  85. proxyRes: (proxyRes) => {

    if (proxyRes.headers['location']) {

    // ϦμΠϨΫτઌΛมߋ

    proxyRes.headers['location'] =
    proxyRes.headers['location'].replace(/^https:\/\/
    example.com/i, '/example/');

    }

    },
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    LBSNBDPOGKT

    View Slide

  86. ϩάΠϯ͍ͨ͠
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  87. fetch('/example/login', {

    method: 'POST',

    body: new FormData(document.getElementById('#login'))

    }).then((response) => response.text()).then((text) => {

    // ϨεϙϯεʹToken͕͋Ε͹ม਺ʹอଘ

    // Cookie͸อ࣋͞ΕΔ

    window.__karma__.loaded();

    });
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    DVTUPNDPOUFYUpMFIUNM

    View Slide

  88. ͜͏͍ͬͨํ๏Λ࢖͏͜ͱͰผ
    υϝΠϯͰಡΈࠐ·ΕΔ໰୊Λ
    ղফ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  89. QSPYZ3FRɺQSPYZ3FTͷҾ਺
    ͸ҎԼࢀর
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    IUUQTHJUIVCDPNOPEFKJUTVOPEFIUUQQSPYZ

    View Slide

  90. ͜͜·ͰདྷΔͱςετΛॻ͘ͷ
    ͸ඇৗʹ؆୯
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  91. ී௨ʹαΠτ্ͷ%FW5PPMT্
    Ͱݕূ͢ΔͷͱมΘΒͳ͍Ϩϕ
    ϧͰςετ͕ॻ͚Δ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  92. LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏
    const assert = require("power-assert");


    describe('index page', () => {

    it('Google map', () => {

    assert(google.maps);

    });

    it('copyright', () => {

    assert(document.querySelector('.copyright'));

    });

    });

    View Slide

  93. ඇৗʹ͓͢͢Ί
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  94. ࣮ࡍ΍ͬͯΈͯͲ͏͔ͩͬͨ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  95. ςετ͸ඇৗʹॻ͖΍͍͢
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  96. ͨͩɺϒϥ΢βʹىҼ͢Δෆ҆
    ఆ͞͸Ͳ͏͠Α͏΋ͳ͔ͬͨ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  97. %0.ͱ͍͏޿Ҭม਺΍͹͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  98. ঢ়ଶͷΫϦΞ͕ࣗ෼ͷ੹೚ʹͳ
    ΔͷͰਏ͍

    ʢָʹͳΔ෦෼΋͋Δ͚Ͳʣ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  99. ࣗ෼Ͱ੍ޚͰ͖Δൣғ͕޿͕Δ
    ͷ͸خ͍͠
    ʢ8FC%SJWFSͷϒϥοΫϘο
    Ϋεײ͕ͳ͍ʣ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  100. ͦ΋ͦ΋
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  101. 8FC%SJWFS͸ड͚ೖΕςετ
    ͷπʔϧͰ͋ͬͯɺ։ൃऀ޲͚
    πʔϧͰ͸ͳ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  102. ։ൃ͠ͳ͕Βςετ͢ΔͷͰ͋
    Ε͹ผͷํ๏Λݕ౼͢Δํ͕͍
    ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  103. ͨͩɺड͚ೖΕςετͳΒ
    8FC%SJWFSͷ΄͏͕ྑ͍͔΋
    ͠Εͳ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  104. 8FC%SJWFS͸ߴੑೳ͚ͩͲɺ
    ෆཁͳػೳ΋ଟ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  105. ࠷ޙʹ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  106. &&ςετ͸
    ॻ͔ͳ͍ʹӽͨ͜͠ͱ͸ͳ͍
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  107. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  108. ࣭͝໰͸ʁ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    View Slide

  109. ࣭͝໰͸ʁ
    LBSNBΛ࢖ͬͨ41"޲͚ͷ&&ςετٕ๏

    ɾ࣮ߦ࣌ؒ͸ʁ
    ɾ࣮ࡍͲ͏͍͏;͏ʹಈ͔ͯ͠Δʁ
    ɾଞͷϝϯόʔͷ൓Ԡ͸ʁ
    ɾ΍ͬͯΑ͔ͬͨʁ
    ɾͲ͏͍͏ͱ͖ʹ͓͢͢Ίʁ
    ɾCIͱͷ࿈ܞ͸ʁ

    View Slide