Slide 1

Slide 1 text

.PDIBUFTUJOH JO5JUBOJVN

Slide 2

Slide 2 text

ү෦޾྄ʢ͍ͦ΂͜͏͚͢ʣ 4PDLFUCBTF*ODɹ$50$PGPVOEFS ȍ ɹ LTVLFZ ͜͡͠ΐ͏͔͍

Slide 3

Slide 3 text

͜͡͠ΐ͏͔͍ w "MMPZϓϩδΣΫτͷ։ൃΛͪΐͬͽΓָʹ ͢Δ LTVLFZBMMPZTNFMUFS w ൥ࡶʹͳΓ΍͍͢UTTΛ͖Ε͍੔ྻ͠௚͢ LTVLFZUTTGPSNBUUFS ͳΜ͔Λ࡞͍ͬͯ·͢

Slide 4

Slide 4 text

5JUBOJVNɺςετ ͍ͯ͠·͔͢ʁ

Slide 5

Slide 5 text

Titanium ͷςετͱ͍͑͹ w ༰қʹςετͰ͖ͳ͍ w γϛϡʢΤϛϡʣϨʔλʗ࣮ػ͡Όͳ͍ͱςετͰ͖ͳ͍ w "QQDFMFSBUPS1MBUGPSNͷςετ͸ߴֹɻ͜Εɺ6* "VUPNBUJPOΛϦϞʔτͰಈ͔ͯ͠Α͏ͳ΋ͷͩ͠ w Ϣχοτςετ͕͍ͨ͠ΜͰ͢ w ͭ·Γɺ༰қʹςετͰ͖ͳ͍

Slide 6

Slide 6 text

͜Ε͘Β͍ͳΒ w KTIJOU w KTCFBVUJpFS w ςετ͡Όͳͯ͘จ ๏νΣοΫͰ͢Ͷ // gulplfile.js var gulp = require(‘gulp’), plugin = require(‘gulp—load—plugins’)(); gulp.task(‘jshint’, function(){ return gulp.src(‘app/controllers/**/ *.js’) .pipe(plugin.jshint()) .pipe(plugin.jshint.reporter(‘jshint— stylish’)) .pipe(plugin.jshint.reporter(‘fail’)); }); gulp.task(‘jsbeautifier’, function(){ return gulp.src(‘app/controllers/**/ *.js’) .pipe(plugin.jsbeautifier({ logSuccess: false, mode: ‘VERIFY_ONLY’ })); });

Slide 7

Slide 7 text

΅͘͸5JUBOJVNίʔυͷ
 Ϣχοτςετ͕͍ͨ͠ʂ

Slide 8

Slide 8 text

Titanium ͷςετͱ͍͑͹ w UJNPDIB w UJUBOJVNKBTNJOF w UJP w %SJMMCJU

Slide 9

Slide 9 text

γϛϡʢΤϛϡʣϨʔλʗ࣮ػ ͡Όͳ͍ͱςετͰ͖ͳ͍ λʔϛφϧͰ׬͍݁ͨ͠Ͱ͢ʜ

Slide 10

Slide 10 text

ͳͥͰ͖ͳ͍ͷ͔ w ͦ΋ͦ΋ର৅ͷ࣮ߦ؀ڥʢ/PEFKTʣʹ5JUBOJVN"1*͕ ͳ͍Ͱ͢͠ w ਓͷख͕հࡏͯ͠ྑ͍΋ͷ͔ɻ׬શࣗಈԽ͍ͨ͠ w .BD͡Όͳ͍ͱJ04ͷςετ͕ʜ w 5JUBOJVN4%,("͔Β8JOEPXT1IPOF΋͖ ·ͨ͠Ͷɻ8JOEPXT͍࣋ͬͯͳ͍Ͱ͢

Slide 11

Slide 11 text

5SBWJT$*ͱ͔$JSDMF$*Ͱ ࠓ෩ʹ$*͍ͨ͠ΜͰ͢ ָ͍ͨ͠

Slide 12

Slide 12 text

࡞Γ·ͨ͠

Slide 13

Slide 13 text

ΞʔΩςΫνϟ w /PEFKTͷ7.Ϟδϡʔϧ w 5JUBOJVN"1*Λಈ͔͢ʢೝࣝͤ͞Δʣ w ΈΜͳେ޷͖.PDIB

Slide 14

Slide 14 text

7.Ϟδϡʔϧͱ͸

Slide 15

Slide 15 text

VM Ϟδϡʔϧ w ؆୯ʹݴ͏ͱɺ҆શͳFWBM w αϯυϘοΫεͳίϯςΩετΛ࡞Γɺͦͷ தͰ+BWB4DSJQUΛ࣮ߦͰ͖Δ w ͦ΋ͦ΋FYQPSUTͱ͔SFRVJSF͑͞΋ແ͍

Slide 16

Slide 16 text

VM Ϟδϡʔϧ w ͜Μͳײ͡Ͱ࣮ߦ؀ڥ Λ࡞ͬͯ͋͛·͢ w WNSVO*O$POUFYUͷ ฦ٫஋͸࣮ߦ݁Ռͷί ϯςΩετ˺Ξαʔ γϣϯͰ͖Δ͡Όͳ͍ var vm = require(‘vm’), context = vm.createContext({ require: require, module: module, exports: exports, console: console, setTimeout: setTimeout, setInterval: setInterval, clearTimeout: clearTimeout, clearInterval: clearInterval, JSON: JSON, alert: function(e) { console.log(e); } }), result = vm.runInContext(‘console.log(\’ Hello, world.\’);’, context);

Slide 17

Slide 17 text

VM Ϟδϡʔϧ w WNDSFBUF$POUFYUʹ 5JUBOJVN"1*Λ౉ͯ͠ ͋͛Ε͹࣮ߦͰ͖Δʁ w Ͳ͏ߟ͑ͯ΋ಈ͖·͢ ΑͶɺ͜ΕɻΑ͠ɺ5Jʙ ͳ"1*શ෦ॻ͔͘ʜ var vm = require(‘vm’), context = vm.createContext({ Ti: { UI: { createWindow: function(){} } } }), result = vm.runInContext(‘var win = Ti.UI.createWindow();’, context);

Slide 18

Slide 18 text

શ5JUBOJVN"1*Λ Ͳ͏ʹ͔͢Δ

Slide 19

Slide 19 text

Titanium API w ͦ΋ͦ΋ɺ͍ͭ͋͘Δͷ͔ղΒͳ͍Ϩϕϧ w ໭Γ஋΋ΦϒδΣΫτͰ͝·͔ͤͳ͍ w શ෦खॻ͖͸ࢮ๢ϑϥά w ϦϑΝϨϯεΛεΫϨΠϐϯά͢Δ͔ʁ

Slide 20

Slide 20 text

Titanium API w ެࣜϦϑΝϨϯε͋ Γ·͢ΑͶ w Αʔʔʔ͘ݟͯ΋Β ͍͍ͨɻ͜ͷล

Slide 21

Slide 21 text

ϦϑΝϨϯε͕+40/Ͱ ఏڙ͞Ε͍ͯΔʂʂʂ̍

Slide 22

Slide 22 text

Titanium API w ϦϑΝϨϯε+40/Λ࢖ͬͯ/PEFKTͷ࣮ ߦ؀ڥͰಈ͘5JUBOJVNGBLFS"1*Λࣗಈੜ ੒͠·͢ w ͍ͭ͜Λ7.ϞδϡʔϧͷίϯςΩετʹ౉ ͯ͠͠·͑͹ʜ

Slide 23

Slide 23 text

/PEFKT্Ͱ5JUBOJVNͷ ίʔυ͕࣮ߦͰ͖·ͨ͠❤

Slide 24

Slide 24 text

ti-slag w 5JUBOJVNGBLFS"1* w 5JUBOJVN4%,͕ଘࡏ͠ͳͯ͘΋/PEFKT্Ͱ 5JUBOJVN"1*ͷৼΔ෣͍ΛγϛϡϨʔτ͠·͢ w %FQSFDBUFEͳϓϩύςΟʗϝιουΛ͓৮Γ͢Δͱɺ ྫ֎͕౤͛ΒΕ·͢ w ΋ͪΖΜը໘ભҠ͸͠·ͤΜΑɻը໘ͳ͍Ͱ͢͠

Slide 25

Slide 25 text

slagʁ w ߭ᕥʢ͜͏͍͞ʣɻ߭ੴ͔Βਫ਼࿉͢Δࡍʹɺ ର৅ͷۚଐ͔Β෼཭ͨ߭͠෺੒෼ͳͲɻଏʹ ۚሬʢ΢ΟΩϖσΟΞௐ΂ʣ w ͭ·Γɺ࢒ΓΧε

Slide 26

Slide 26 text

LTVLFZUJTMBH

Slide 27

Slide 27 text

Mocha testing in ti-slag w ඞཁͳOQNύοέʔ δΛΠϯετʔϧ w QBDLBHFKTPO΁ς ετͷ࣮ߦεΫϦϓ τΛ௥Ճ $ cd path/to/yourapp $ npm init $ npm install mocha ti—slag lodash ——save—dev package.json { … “scripts”: { “test”: “mocha test.js” }, … }

Slide 28

Slide 28 text

Mocha testing in ti-slag w ·ͣ͸"MMPZίϯύΠ ϧ͠·͢ɻUJCVJMEʗ BQQDSVOͱ͔Ͱ΋0,ɻ ͱʹ͔͘3FTPVSDF഑ ԼʹίʔυΛు͔ͤ·͢ w ͦͯ͠OQNUFTU $ alloy compile ——config platform=ios $ npm test > [email protected] test /Users/ Kosuke/src/sandbox > mocha test.js iOS index.js ✓ should does not throw exception in the Controller 1 passing (10ms)

Slide 29

Slide 29 text

Mocha testing in ti-slag w "MMPZϓϩδΣΫτ͸ίϯύΠϧ͞ΕΔͱɺ3FTPVSDFT഑Լ ʹΫϥγοΫͳίʔυΛు͖ग़͠·͢ w ͜ͷίʔυΛUJTMBHʹ౉͢ͱ7.؀ڥͰ࣮ߦ͞Εɺ݁ՌΛ ίϯςΩετͱͯ͠ฦ٫͠·͢ w ίϯύΠϧ͞Εͨ"MMPZίϯτϩʔϥ͸NPEVMFFYQPSUTͰ $POUSPMMFSͱͯ͠ެ։͞Ε͍ͯΔͷͰɺ͍ͭ͜Λ࣮ߦ͠·͢

Slide 30

Slide 30 text

// Resources/…/index.js function Controller() { function doClick() { var next = Alloy.createController(‘next’ ), view = next.getView(); view.open(); } $.index.open(); } module.exports = Controller; // app/controllers/index.js function doClick() { var next = Alloy.createController(‘next’) , view = next.getView(); view.open(); } $.index.open(); Mocha testing in ti-slag

Slide 31

Slide 31 text

Mocha testing in ti-slag // test.js var _ = require(‘lodash’), assert = require(‘assert’), path = require(‘path’), slag = require(‘ti—slag); describe(‘iOS index.js’, function(){ var context = slag(‘./Resources/iphone/alloy/controllers/index.js’, { titanium: ‘4.0.0.GA’, platfrom: ‘ios’, module: { alloy: alloy, ‘alloy/controllers/BaseController’: BaseController } }); it(‘should does not throw exception in the Controller’, function(){ assert.doesNotThrow(function(){ context.Controller(); }); }); });

Slide 32

Slide 32 text

5JUBOJVN"1*͸ྑ͍͚Ͳɺ Ϟδϡʔϧ͸Ͳ͏͢ΔͷΑ໰୊

Slide 33

Slide 33 text

Mocha testing in ti-slag w ୈೋҾ਺ʹ͋ΔNPEVMF Ͱϐϯͱ͖͔ͨ΋͠Ε· ͤΜͶ w SFRVJSF͢ΔϞδϡʔϧ ͷ໊শΛ౉ͤ͹ͦͷ·· ಡΈࠐ·ΕΔͷͰɺ͓޷ ͖ʹͲ͏ͧ var context = slag(‘./ Resources/iphone/alloy/ controllers/index.js’, { titanium: ‘4.0.0.GA’, platfrom: ‘ios’, module: { ‘ti.map’: { // ࣗ෼Ͱ͕Μ͹Ε } } });

Slide 34

Slide 34 text

ͦ΋ͦ΋"MMPZͷ࣮ߦ؀ڥ͸ Ͳ͏ͳ͍ͬͯΔͷ໰୊

Slide 35

Slide 35 text

Mocha testing in ti-slag w "MMPZͬͯ5JUBOJVN4%,؀ڥԼͰಈ͍͍ͯ·͢ΑͶ w ΋ͪΖΜUJTMBH؀ڥԼͰ΋ಉ͡Α͏ʹ࣮ߦͰ͖·͢ w UJTMBHͷϞδϡʔϧʹ"MMPZίϯςΩετΛ౉ͯ͋͛͠ Ε͹0,Ͱ͢ʢਖ਼͘͠͸#BTF$POUSPMMFS΋ඞཁͰ͢ʣ w ৄ͘͠͸ɺ LTVLFZUJTMBHUFTUKTΛࢀর

Slide 36

Slide 36 text

είʔϓతʹߟ͑ͯ EP$MJDL͕࣮ߦͰ͖ͳ͍໰୊

Slide 37

Slide 37 text

Mocha testing in ti-slag w UJTMBH಺ʹ"MMPZίϯςΩ ετ͕ల։͞Ε͍ͯΔͷͰɺ "MMPZίϯτϩʔϥͷϝιο υ΋ͦͷ··࢖͑Δ w "MMPZ!͔Β௥Ճ͞Ε ͨΠϕϯτ௥Ճʗऔಘʗ࡟আ ϝιουͰΠϕϯτϦεφΛ औಘ͢Ε͹0, assert.doesNotThrow(function(){ context.Controller(); var listeners = context.getListener(); });

Slide 38

Slide 38 text

Mocha testing in ti-slag describe(‘iOS index.js’, function(){ var context = slag(‘./Resources/iphone/alloy/controllers/index.js’, { titanium: ‘4.0.0.GA’, platfrom: ‘ios’, module: { alloy: alloy, ‘alloy/controllers/BaseController’: BaseController } }), listeners; it(‘should does not throw exception in the Controller’, function(){ assert.doesNotThrow(function(){ context.Controller(); listeners = context.getListener(); }); }); it(‘should does not throw exception in the event listeners’, function(){ assert.doesNotThrow(function(){ _.each(listeners, function(listener){ listener.handler(); }); }); }); });

Slide 39

Slide 39 text

$JSDMF$*ͷ࣮ߦ؀ڥΛ ఆٛ͠·͢

Slide 40

Slide 40 text

circle.yml w UFTUQSFͰHVMQ KTIJOUKTCFBVUJpFS ͔ͯ͠Β"MMPZίϯ ύΠϧ w ͦͷίϯύΠϧ݁ՌΛ ࣋ͬͯςετΛ࣮ߦ machine: node: version: 0.10.34 dependencies: pre: — npm install —g alloy — npm install test: pre: — gulp jshint — gulp jsbeautifier — alloy compile ——config platform=ios — alloy compile ——config platform=android

Slide 41

Slide 41 text

 (JU)VCʹϓογϡ  $JSDMF$*Ͱ࣮ߦ  ݁ՌΛ4MBDLʹ
 ౤͛Δ
 ɹɹɹɹɹɹɹɹɹɹ΅͘͝ຬӻ CI

Slide 42

Slide 42 text

5IBOLZPV❤

Slide 43

Slide 43 text

2VFTUJPOʁ