Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
第9回SenchaUG@札幌「Siestaで中の人に頑張ってもらう」
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Tanaka Yuuya
June 10, 2013
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
第9回SenchaUG@札幌「Siestaで中の人に頑張ってもらう」
Tanaka Yuuya
June 10, 2013
More Decks by Tanaka Yuuya
See All by Tanaka Yuuya
Sencha いろはの「い」
tnker
0
870
第9回SenchaUG@札幌「Senchaが創造するRIA開発プラットフォームとサービス」
tnker
1
150
第9回SenchaUG@札幌「Sencha Learning Place No.2」
tnker
0
160
第8回SenchaUG@東京
tnker
0
150
第3回SenchaUG@東京
tnker
0
150
第2回SenchaUG@東京
tnker
1
230
第1回SenchaUG@東京
tnker
0
430
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
350
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
400
Balancing Empowerment & Direction
lara
6
1.3k
Code Reviewing Like a Champion
maltzj
529
40k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
520
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
710
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
520
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Transcript
SiestaΛͬͯɺதͷਓʹؤுͬͯΒ͓͏ גࣜձࣾθϊϑΟ খఅ Ұ߂
SiestaͬͯԿʁ w +4ΦϒδΣΫτͷൺֱ w %0.্ͷΤϨϝϯτͷଘࡏ֬ೝ w ϑΥʔϜͳͲͷೖྗςετ w υϥοάυϩοϓͳͲͷϢʔβૢ࡞ w
ͦͷଞFUD ؆୯ʹઆ໌͢Δͱɺ+4্ͷίʔυ͕ਖ਼ৗʹ ಈ࡞͍ͯ͠Δ͔Ͳ͏͔ΛࣗಈͰςετͯ͠ ͘ΕΔπʔϧͰ͢ɻ βοΫϦઆ໌͢ΔͱɺҎԼͷΑ͏ͳ͜ͱ͕ ग़དྷ·͢ɻ
ʮඦฉҰݟʹ͔ͣ͠ʯͰ͢
ࠓճ ࠓճ4FODIB&YU+4ͱɺ͜ͷͱͬͯૉఢͳ4JFTUBΛͬͯ؆୯ ͳΞϓϦέʔγϣϯΛ࡞Γɺ࣮ࡍʹͦͷΞϓϦέʔγϣϯͷࣗಈςετΛ͢ ΔҝͷςετέʔεΛ࡞͍͖ͬͯ·͢
αϯϓϧΞϓϦέʔγϣϯ
ࠓճ͏ΞϓϦέʔγϣϯ ͔ͤͬ͘ͳͷͰɺ4FODIB$NEΛͬ ͯΞϓϦέʔγϣϯΛ࡞͍͖ͬͯ·͠ΐ ͏ɻ 4FODIB$NEͰϓϩδΣΫτΛ࡞͢ ΔલͷσΟϨΫτϦߏ࣍ͷ௨Γɻ TELσΟϨΫτϦɺ&YU+4ͷ4%,͕ ೖ͍ͬͯΔσΟϨΫτϦʹͳΓ·͢ɻ
ࠓճ͏ΞϓϦέʔγϣϯ ४උ͕ग़དྷͨΒɺΈΜͳେ͖ࠇ͍ը໘ ʢλʔϛφϧʣ͔ΒίϚϯυͰϓϩδΣ ΫτΛੜ͠·͢ $ cd {project root dir} $
ls sdk/ $ sencha -sdk ./sdk/ generate app \ Siesta ./siesta [enter] Sencha Cmd v3.x.xxxx [INF] xxxx . . . $ ls sdk/ siesta/ w 4%,σΟϨΫτϦ w ໊લۭؒ w ੜ͢ΔϓϩδΣΫτσΟϨΫτϦ ࣍ͷΑ͏ʹ Λࢦఆͯ͋͛͠Δ͜ͱʹΑΓɺεέϧτ ϯͷΞϓϦέʔγϣϯ͕ੜ͞Ε·͢ɻ
ࠓճ͏ΞϓϦέʔγϣϯ ࠓճ༻͢ΔαϯϓϧΞϓϦέʔγϣ ϯɺӈͷΑ͏ͳͷΛ༻͠·͢ɻ ߏͱͯ͠ w ೖྗϑΥʔϜʢ&YUGPSN1BOFMʣ w σʔλΛදࣔ͢Δ(SJEʢ&YUHSJE1BOFMʣ ʹͳΓ·͢ɻ
ࠓճ͏ΞϓϦέʔγϣϯ ࣮ࡍɺ'PSNʹೖྗͨ͠Λ(SJEʹ Ճ͢ΔͷͰ͕͢ɺࠓճςετέʔ εΛಈ͔͢ҝʹ༻͢ΔͷͰɺ(SJE ͷՃͳͲͷॲཧೖΕͯ͋Γ·ͤ Μɻ อଘϘλϯΛԡͨ͠ࡍɺ୯७ʹอଘ ࣌ͷΠϕϯτ͕ൃՐ͢Δ͚ͩʹͳͬͯ ͍·͢ɻ
4JFTUBͷ४උ
·ͣɺμϯϩʔυ 4JFTUBΛ͏ʹɺΛμϯϩ ʔυ͢Δඞཁ͕͋Γ·͢ɻ ʢࠓճແྉ൛Λ͍͖ͬͯ·͢ʣ ແྉ൛ͷμϯϩʔυɺฐࣾϖ ʔδʹϦϯΫ͕ுͬͯ͋ΔͷͰɺͦͪ Β͔Βμϯϩʔυ͠·͢ɻ http://www.xenophy.com/product/ bryntum/siesta
ઃஔ͢Δ μϯϩʔυͯ͠ղౚͨ͠ΒɺσΟϨ ΫτϦ໊ΛʮTJFTUBʯͳͲʹϦωʔ Ϝͯ͠ɺΞϓϦέʔγϣϯͷϧʔτσ ΟϨΫτϦʹઃஔ͠·͢ɻ
ςετը໘ͷ४උ ςετͷىͱͳΔϖʔδͷ४උΛ͢ ΔҝʹɺUFTU@IBSOFTTIUNMΛ࡞ ͠·͢ɻ
ςετը໘ͷ४උ த͜Μͳײ͡Ͱɺදࣔʹඞཁͳ$44ͱ4JFTUBͷಈ࡞ʹඞཁͳ+4ͷಡΈ ࠐΈΛߦ͍ɺ࠷ޙʹςετέʔεͰ͋ΔUFTU@IBSOFTTKTΛಡΈࠐΈ·͢ <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css"
href="./resources/default/app.css"/> <link rel="stylesheet" type="text/css" href="./siesta/resources/css/siesta-all.css"> <script type="text/javascript" src="./ext/ext-all.js"></script> <script type="text/javascript" src="./siesta/siesta-all.js"></script> <script type="text/javascript" src="./test_harness.js"></script> </head> <body> </body> </html>
ςετը໘ͷ४උ ଓ͍ͯɺઌ΄Ͳͷ)5.-ͰಡΈࠐ· ͍ͤͯͨɺςετέʔεͷىͱͳΔ UFTU@IBSOFTTKTΛ࡞͠·͢ɻ
ςετը໘ͷ४උ ͪ͜Βͷதɺ4JFTUBͷॳظ ઃఆͱɺ͜Ε͔Β֎෦ϑΝΠϧͰ هड़͢Δ֤ςετέʔεͷఆٛΛ ߦ͍·͢ɻ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({
title: 'Siesta Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] });
ςετը໘ͷ४උ ςετͷ࣮ߦʹ༻͍ΔΠϯελϯ εͷऔಘ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta
Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] });
ςετը໘ͷ४උ ଓ͍ͯɺ4JFTUBຊମͷઃఆΛߦ ͍͖ͬͯ·͢ɻ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta
Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] }); w UJUMF ςετը໘ͷλΠτϧ w MPBEFS1BUI ΞϓϦέʔγϣϯͷ໊લۭؒͷղܾ ʢ&YU-PBEFSͱಉ༷ͷઃఆʣ
ςετը໘ͷ४උ ଓ͍ͯɺQSFMPBEͷઃఆ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta Test',
loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js' ] }); w QSFMPBE ֤ςετͰඞཁʹͳΔ+4ϑΝΠϧ܈
ςετը໘ͷ४උ ֎෦ϑΝΠϧʹఆ͍ٛͯ͠Δɺ֤ ςετέʔεͷಡΈࠐΈઃఆ var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title: 'Siesta
Test', loaderPath: { 'Siesta': 'app' }, preload: [ './ext/resources/css/ext-all.css', './ext/ext-all-debug.js' ] }); Harness.start({ group: 'Sample', items: [ 'tests/010_sample.t.js' ] }); w HSPVQ JUFNTʹఆ͍ٛͯ͠Δ֤ςετέ ʔεͷάϧʔϓ໊ w JUFNT ֎෦ϑΝΠϧʹఆ͍ٛͯ͠Δςετ έʔε܈
ςετը໘ͷ४උ ࠷ޙʹɺ࣮ࡍͷςετέʔεೖΕ͓ͯ ͘UFTUTσΟϨΫτϦΛ࡞͠ɺ·ͣ w UFTUT@TBNQMFUKT Λ࡞͍͖ͯ͠·͢ɻ
ςετը໘ͷ४උ @TBNQMFUKTͷίʔυ ࣍ͷΑ͏ͳܗʹͳΓ·͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS is
here’); t.requireOk(‘Siesta.controller.Main’); });
ςετը໘ͷ४උ ςετίʔυݪଇ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS is here’);
t.requireOk(‘Siesta.controller.Main’); }); StartTest(function(t) { ... }); Ͱϥοϓͯ͠هड़͍͖ͯ͠·͢ɻ
ςετը໘ͷ४උ 4UBSU5FTUʹ͞ΕΔҾͷU ɺ4JFTUB5FTUͷΠϯελϯε Ͱ͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS
is here’); t.requireOk(‘Siesta.controller.Main’); }); ͜ͷ4JFTUB5FTUΠϯελϯε ͍͔ͭ͘ͷΞαʔγϣϯϝιου ͕༻ҙ͞Ε͓ͯΓɺͦΕΒΛ༻ ͯ͠ςετίʔυΛهड़͍͖ͯ͠ ·͢ɻ
ςετը໘ͷ४උ EJBHϝιουɺςετέʔε Λ࣮ߦͨ͠ࡍͷɺ݁Ռදࣔ෦ʹ λΠτϧͷΑ͏ͳܗͰจࣈྻΛද ࣔͤ͞ΔҝͷϝιουͰ͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext,
‘ExtJS is here’); t.requireOk(‘Siesta.controller.Main’); });
ςετը໘ͷ४උ PLϝιουɺୈҾʹ༩͑ͨ ͕USVFͷ߹ςετΛύε ͠ɺୈҾʹ༩͑ͨจࣈྻΛς ετ݁Ռʹग़ྗ͠·͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext,
‘ExtJS is here’); t.requireOk(‘Siesta.controller.Main’); }); ӈͷίʔυͷ߹ɺ&YUΦϒδΣ Ϋτ͕ଘࡏ͢ΕςετΛύε͠ ·͢ɻ
ςετը໘ͷ४උ SFRVJSF0LϝιουɺͦͷΫϥ ε͕ਖ਼ৗʹSFRVJSF͞ΕΕςε τΛύε͠·͢ɻ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS
is here’); t.requireOk(‘Siesta.controller.Main’); }); ·ͨɺ͜ͷޙ৮Ε͍͖ͯ·͕͢ɺ ୈҾʹίʔϧόοΫؔΛη οτ͢Δ͜ͱͰɺΫϥεΛϩʔυ ޙॲཧΛ࣮ߦ͢Δ͜ͱग़དྷ·͢
ςετը໘ͷ४උ ͜ͷଞʹ StartTest(function(t) { t.diag(‘Hello World!!’); t.ok(Ext, ‘ExtJS is here’);
t.requireOk(‘Siesta.controller.Main’); }); w EPOFϝιου w JTϝιου ͍͔ͭ͘ͷϝιου͕༻ҙ͞Εͯ ͍·͕͢ɺ͜͜Ͱ·ͣӈͷίʔ υΛ࣮ߦͯ͠Έ·͠ΐ͏ɻ
4JFTUBΛಈ͔ͯ͠ΈΔ
ઃஔͨ͠63-ʹΞΫηε ४උͷࡍʹ࡞ͨ͠ɺ UFTU@IBSOFTTIUNMʹΞΫηε͢ Δ͜ͱͰɺ4JFTUBͷςετը໘Λ։ ͘͜ͱ͕ग़དྷ·͢ɻ IUUQ\QSPKFDU3PPU%JS^UFTU@IBSOFTTIUNM
4JFTUB࣮ߦը໘ ΞΫηε͢ΔͱӈͷΑ͏ͳը໘͕։͖ ·͢ɻࠨͷπϦʔϏϡʔʹදࣔ͞Εͯ ͍Δͷ͕ɺ४උͷࡍʹ࡞ͨ͠ɺ UFTU@IBSOFTTKTʹهड़ͨ͠ɺςε τέʔεҰཡͰ͢ɻ
4JFTUB࣮ߦը໘ ςετΛ࣮ߦ͢ΔʹɺπϦʔϏϡʔ ʹදࣔ͞Ε͍ͯΔςετέʔεΛμϒ ϧΫϦοΫ͢Δ͜ͱͰ࣮ߦͰ͖·͢ɻ
4JFTUB࣮ߦը໘ ςετΛ࣮ߦ͢Δͱɺઌ΄Ͳهड़ͨ͠ ςετέʔε͕ΓӈͷΑ͏ͳ߲͕ ग़ྗ͞Ε·͢ɻ
4JFTUB࣮ߦը໘ t.diag(‘Hello World!!’);
4JFTUB࣮ߦը໘ t.ok(Ext, ‘ExtJS is here’);
4JFTUB࣮ߦը໘ t.requireOk('Siesta.controller.Main');
4JFTUB࣮ߦը໘ ͜Ε͕؆୯ͳςετͷํ๏ʹͳΓ· ͢ɻͦΕͰɺ಄Ͱ৮Εͨαϯϓϧ ΞϓϦέʔγϣϯΛݩʹɺ·ͣσʔ λ.PEFMͷςετέʔεΛॻ͍ͯΈ ·͠ΐ͏ɻ
.PEFMͷςετέʔεΛॻ͍ͯΈΔ
ςετέʔεͷՃ UFTU@IBSOFTTKTʹ৽ͨʹ߲ ΛՃ͠·͢ɻ ... Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js'
] }, { group: ‘Model’, items: [ ‘tests/021_product.t.js’ ] });
.PEFMͷςετέʔε ϞσϧͷςετέʔεԼهͷΑ͏ʹɺSFRVJSF0Lϝιουͷίʔϧόο ΫͰνΣοΫΛߦͬͨΓग़དྷ·͢ɻ ͜͜Ͱɺɹ1SPEVDUϞσϧΛಡΈࠐΈσʔλΛੜɺͦͷσʔλ͕ੜͰ ͖͍ͯΔ͔ΛJTϝιουͰνΣοΫ͍ͯ͠·͢ɻ StartTest(function(t) { t.requireOk('Siesta.model.Product', function() {
var model = Ext.create('Siesta.model.Product', { id: 10, name: 'Siesta Test Model' }); t.is(model.get('id'), 10, 'Create Siesta Test Model!!'); }); });
4UPSFͷςετέʔε ·ͨɺࠓճߦ͍·ͤΜ͕4UPSFͷςετέʔεΛॻ͘ࡍɺ CFHJO"TZOD͓ΑͼFOE"TZODΛར༻ͯ͠ɺ4UPSFͷಡΈࠐΈ͕ྃ͢ Δ·Ͱɺςετͷ࣮ߦΛࢭΊ͓ͯ͘ඞཁ͕͋Γ·͢ɻ StartTest(function(t) { t.requireOk('Siesta.store.Products', function() { var
store = Ext.create('Siesta.store.Products'), sync = t.beginAsync(); store.load({ callback: function() { // check code here... t.endAsync(sync); } }); });
ଓ͍ͯ7JFXͷςετέʔεͰ͢
ςετέʔεͷՃ UFTU@IBSOFTTKTʹ7JFX༻ ͷɺςετέʔεΛՃ͠·͢ɻ ... Harness.start({ group: 'Sample', items: [ 'tests/010_sanity.t.js'
] }, { group: ‘Model’, items: [ ‘tests/021_product.t.js’ ] }, { group: ‘View’, items: [ ‘tests/031_grid.t.js’ ] });
7JFXͷςετέʔε 7JFXͷςετέʔεΛߦ͏ͨΊʹʢࠓճ(SJEͷέʔεʣ w දࣔʹඞཁͳΫϥεͷSFRVJSFνΣοΫ w දࣔʹඞཁͳΠϯελϯεͷੜʢࠓճ(SJEͳͷͰ4UPSF͕ඞཁʣ 4UPSFੜ࣌ʹTUPSF*EϓϩύςΟΛઃఆ͢Δඞཁ༗ w 7JFXͷੜ
SFOEFS5PϓϩύςΟͰඳըઌΛ&YUHFU#PEZ ʹઃఆ w ্هྃޙʹ֤ςετॲཧΛهड़ ίʔυ͕গ͘͠ͳΔͷͰɺ࣍ͷεϥΠυʹࡌͤ·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); });
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEΛදࣔ͢ΔͷʹඞཁͳΫϥεͷSFRVJSFν ΣοΫΛߦ͍·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEʹදࣔ͢ΔͨΊͷ4UPSFΛੜ͠·͢ɻ ͜ͷࡍʹɺ(SJEʹఆٛͨ͠4UPSF*%ͷઃఆΛ ߦΘͳ͍ͱ(SJEʹσʔλ͕දࣔͰ͖ͳ͍ͷͰ ҙ͍ͯͩ͘͠͞ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEͦͷͷΛੜ͠·͢ɻ ඳըઌΛɺ&YUHFU#PEZϝιουͰઃఆ͠· ͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); (SJEͷ͕දࣔ͞ΕΔ·Ͱػ͢ΔϝιουͰ ͢ɻ͜ΕΛར༻ͯ͠ɺ(SJEͷ༰͕දࣔ͞Ε ͔ͯΒςετΛߦ͍·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); ͜͜Ͱߦ͍ͬͯΔͷɺ4UPSFͷσʔλ ͱɺ(SJEʹ࣮ࡍදࣔ͞Ε͍ͯΔσʔλ͕ಉ ͔͡Ͳ͏͔ΛνΣοΫ͍ͯ͠·͢ɻ
7JFXͷςετέʔε StartTest(function(t) { t.requireOk([ 'Siesta.model.Product', 'Siesta.store.Products', 'Siesta.view.Grid' ], function() {
var grid; Ext.create('Siesta.store.Products', { storeId: 'Products' }); grid = Ext.create('Siesta.view.Grid', { renderTo: Ext.getBody() }); t.waitForRowsVisible(grid, function() { t.is(grid.store.getCount(), grid.getView().getNodes().length, 'Rendered Items OK'); t.matchGridCellContent(grid, 0, 1, grid.store.first().get('name'), 'Found full name in first cell'); }); }); }); ˞͜͜ޙͰॻ͘
͓͔ͪͶͷϢʔβೖྗγϛϡϨʔτ
function() { function() { function() { function() { // ...
} } } } Ϣʔβૢ࡞γϛϡϨʔτͷྲྀΕ 4JFTUBͰߦ͑ΔϢʔβૢ࡞ͷ γϛϡϨʔτɺ 4JFTUB5FTU4JNVMBUFԼͷ ϝιουɺ 4JFTUB5FTU"DUJPOΫϥε͕ ৭ʑͱߦͬͯ͘Ε·͢ɻ ಈ࡞ͷྲྀΕͱͯ͠ɺ֤ΞΫγ ϣϯྃޙʹίʔϧόοΫΛݺ ͼग़͢ͱ͍͏ඇಉظͳܗʹͳΓ ·͢ɻ ਂ͘ͳͬͯ·͏ŋŋŋ
ͦΜͳ͋ͳͨʹ DIBJOϝιουͱ͍͏ͷ͕༻ҙ͞Ε ͍ͯ·͢ɻ͜ΕɺDIBJOͷҾʹॱ ࣮࣍ߦ͍ͨؔ͠Λ͠ɺͦͷؔͷ தͰςετΛߦ͏ࡍʹɺҾʹೖͬͯ ͘ΔΠϯελϯεΛςετϝιουʹ ͯ͋͛͠·͢ɻ ͜ͷΑ͏ʹɺॱ൪ʹؔΛͯ͋͛͠ Δ͚ͩͰɺ؆୯ʹॱ࣮࣍ߦ͢Δ͜ͱ͕ Ͱ͖·͢ʂ
t.chain( function (next) { t.type(userNameField, 'username', next) }, function (next) { t.type(passwordField, 'secret', next) }, function (next) { t.click(loginButton, next) }, function () { // done } });
ͦΜͳ͋ͳͨʹ ·ͨɺ͜ͷDIBJOϝιου"DUJPO ͱݺΕΔΦϒδΣΫτΛͯ͋͛͠ Δ͜ͱͰɺςετέʔεΛ࡞Δ͜ͱ ͕ग़དྷ·͢ɻ t.chain({ action : 'type', target
: userNameField, text : 'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton });
ͦΜͳ͋ͳͨʹ ࢦఆͰ͖Δ༰ͱͯ͠ t.chain({ action : 'type', target : userNameField, text
: 'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton }); w BDUJPO ࣮ߦ͢ΔΞΫγϣϯ໊ʢDMJDLʣ w UBSHFU ΞΫγϣϯͷରͱͳΔΤϨϝϯτ ʢ࣍ͷεϥΠυͰ͏গ͠ৄ͘͠ʣ w UFYU BDUJPOUZQFͷ߹ɺςΩετϑΟʔϧ υʹೖྗ͢Δจࣈྻɺ͜ͷଞʹBDUJPO ຖʹࢦఆͰ͖ΔΦϓγϣϯ͋Γ·͢ ͕ɺৄ͘͠"1*υΩϡϝϯτΛ͝ཡ͘ ͍ͩ͞ɻ
UBSHFUʹ͍ͭͯ 4JFTUBͰɺ͍Ζ͍Ζͳํ๏ͰΞΫγ ϣϯͷରͱͳΔΤϨϝϯτΛࢦఆͰ ͖ΔΑ͏ʹͳ͍ͬͯ·͢ɻ t.chain({ action : 'type', target :
userNameField, text : 'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton }); w BDUJPO ࣮ߦ͢ΔΞΫγϣϯ໊ʢDMJDLʣ w UBSHFU ΞΫγϣϯͷରͱͳΔΤϨϝϯτ ʢ࣍ͷεϥΠυͰ͏গ͠ৄ͘͠ʣ w UFYU BDUJPOUZQFͷ߹ɺςΩετϑΟʔϧ υʹೖྗ͢Δจࣈྻɺ͜ͷଞʹBDUJPO ຖʹࢦఆͰ͖ΔΦϓγϣϯ͋Γ·͢
UBSHFUʹ͍ͭͯ t.chain({ action : 'type', target : userNameField, text :
'username' },{ action : 'type', target : passwordField, text : 'secret' },{ action : 'click', target : loginButton }); w 4JFTUB5FTU#SPXTFS )5.-ΤϨϝϯτ <Y Z>ܗࣜͷྻͰ࠲ඪࢦఆ %0.ΫΤϦʔΛද͢$44ηϨΫλ w &YU+4͓Αͼ5PVDI &YUEPN&MFNFOUͷΠϯελϯε &YU$PNQPOFOUͷΠϯελϯε ίϯϙδοτΫΤϦʔจࣈྻ ίϯϙʔωϯτΫΤϦʔจࣈྻ ʢ͜ΕͰࢦఆ͢Δ߹ɺઌ಄ʹ ʠʡΛ͚ͭΔඞཁ͕͋Γ·͢ʣ
Ϣʔβૢ࡞ΛγϛϡϨʔτ͢Δςετίʔυ 4JFTUBͰߦ͑ΔϢʔβૢ࡞ͷγϛϡϨʔτɺ4JFTUB5FTU4JNVMBUF Լͷϝιουɺ4JFTUB5FTU"DUJPOΫϥε͕৭ʑͱߦͬͯ͘Ε·͢ɻ શମΛࡌͤΔͱ͘ͳͬͯ͠·͏ͷͰɺϙΠϯτຖʹઆ໌͍͖ͯ͠·͢ɻ ࠓճͷϢʔβૢ࡞Ͱߦ͍ͷҎԼ w ͭͷUFYUpFMEʹΛೖྗͤ͞Δ w ೖྗͨ͠Λอଘ͢ΔͨΊʹɺอଘϘλϯΛΫϦοΫͤ͞Δ w
อଘϘλϯ͕ΫϦοΫ͞ΕͨࡍͷΠϕϯτΛर͍ɺೖྗͨ͠ͷνΣοΫΛߦ͏
γϛϡϨʔτ ·ͣɺඞཁͳΫϥεͷಡΈࠐΈ͓ Αͼੜ͕ྃͨ͠ΒɺGPSNί ϯϙʔωϯτͷɺςετέʔε ʹ͏ཁૉΛલͬͯऔಘ͓ͯ͠ ͖·͢ɻ ... Ext.create('Siesta.store.Products', { storeId:
'Products' }); form = Ext.create('Siesta.view.Form', { width: 500, renderTo: Ext.getBody() }); nameFld = form.down('textfield[name=name]'); idFld = form.down('textfield[name=id]'); saveButton = form.down('button[text=อଘ]'); ...
γϛϡϨʔτ ͜ͷ෦Ͱ͢Ͷɻ ੜͨ͠GPSN͔ΒEPXOϝιου Λར༻ͯ͠ɺͦΕͧΕͷίϯϙʔ ωϯτΛऔಘ͓͖ͯ͠·͢ɻ ... Ext.create('Siesta.store.Products', { storeId: 'Products'
}); form = Ext.create('Siesta.view.Form', { width: 500, renderTo: Ext.getBody() }); nameFld = form.down('textfield[name=name]'); idFld = form.down('textfield[name=id]'); saveButton = form.down('button[text=อଘ]'); ...
γϛϡϨʔτ ଓ͍ͯɺอଘϘλϯΛΫϦοΫ͞ ΕͨࡍͷςετॲཧΛॻ͍͓͖ͯ ·͢ɻ ... nameFld = form.down('textfield[name=name]'); idFld =
form.down('textfield[name=id]'); saveButton = form.down('button[text=保存]'); form.on('saveCommand', function(form) { var values = form.getValues(); t.diag('保存ボタンがクリックされました'); t.is(values.name, nameValue, 'nameフィールド の⼀一致'); t.is(values.id, idValue, 'idフィールドの⼀一致'); t.endAsync(sync); }); form.loadRecord(rec); ...
γϛϡϨʔτ POϝιουΛར༻ͯ͠ɺGPSN͕ ൃՐ͍ͯ͠Δɺอଘ࣌ͷ TBWF$PNNBOEΠϕϯτΛϦ οεϯ͠·͢ɻ ͦͯ͠ɺͦͷதͰߦ͍ͬͯΔͷ GPSNʹೖྗ͞Ε͕ͨ߹͍ͬͯ Δ͔Ͳ͏͔ͷνΣοΫͰ͢ɻ ... nameFld
= form.down('textfield[name=name]'); idFld = form.down('textfield[name=id]'); saveButton = form.down('button[text=保存]'); form.on('saveCommand', function(form) { var values = form.getValues(); t.diag('保存ボタンがクリックされました'); t.is(values.name, nameValue, 'nameフィールド の⼀一致'); t.is(values.id, idValue, 'idフィールドの⼀一致'); t.endAsync(sync); }); form.loadRecord(rec); ...
γϛϡϨʔτ GPSNʹରͯ͠ɺ࠷ॳʹ࡞͓ͬͯ ͍ۭͨͷ.PEFMΛϩʔυͤͯ͞ ͓͖·͢ɻ ... nameFld = form.down('textfield[name=name]'); idFld =
form.down('textfield[name=id]'); saveButton = form.down('button[text=保存]'); form.on('saveCommand', function(form) { var values = form.getValues(); t.diag('保存ボタンがクリックされました'); t.is(values.name, nameValue, 'nameフィールド の⼀一致'); t.is(values.id, idValue, 'idフィールドの⼀一致'); t.endAsync(sync); }); form.loadRecord(rec); ...
γϛϡϨʔτ ͦͯ͠ɺ࠷ޙʹ֤ΞΫγϣϯΛఆ ͍͖ٛͯ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ·ͣ࠷ॳɺ*%ͷUFYUpFMEʹ Λೖྗ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ࣍ʹɺ໊લͷUFYUpFMEʹΛೖ ྗ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ͦͯ͠ɺ࠷ޙʹ֤ΞΫγϣϯΛఆ ͍͖ٛͯ͠·͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target: idFld,
text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
γϛϡϨʔτ ࠷ޙʹɺอଘϘλϯΛΫϦοΫ͞ ͤΔΞΫγϣϯΛೖΕͨΒςετ έʔεͰ͢ɻ ... form.loadRecord(rec); t.chain({ action: 'type', target:
idFld, text: idValue }, { action: 'type', target: nameFld, text: nameValue }, { action: 'click', target: saveButton // fire ‘saveCommand’ }) ...
ݟͯΈΑ͏ʂ
4JFTUBΛར༻ͨ͠4FODIB5PVDIͷςετέʔε
ςετը໘ͷ४උ ४උ͢ΔϑΝΠϧʹ͍ͭͯɺ &YU+4ͱԿΒมΘΓͳ͍ͷͰ w UFTU@IBSOFTTIUNM w UFTU@IBSOFTTKT ্هͭͷۭϑΝΠϧΛઌʹՃͯ͠ ͓͖·͠ΐ͏ɻ
αϯϓϧΞϓϦέʔγϣϯ ͜͜Ͱςετʹ༻͢ΔΞϓϦέʔγ ϣϯɺ4FODIB5PVDIͰॳظϓϩδ ΣΫτΛ࡞ͨ͠ࡍʹੜ͞ΕΔΞϓ ϦέʔγϣϯΛɺςετ༻ͷαϯϓϧ ΞϓϦέʔγϣϯͱͯ͠ར༻͠·͢ɻ
ςετը໘ͷ४උ UFTU@IBSOFTTIUNMͷத΄ͱΜͲมΘΓ·ͤΜɺಡΈࠐΉϦιʔε͕ 4FODIB5PVDI༻ͷͷʹͳ͙ͬͨΒ͍Ͱ͢Ͷɻ <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css"
href="./touch/resources/css/sencha-touch.css"/> <link rel="stylesheet" type="text/css" href="./siesta/resources/css/siesta-touch-all.css"> <script type="text/javascript" src="./touch/sencha-touch-all.js"></script> <script type="text/javascript" src="./siesta/siesta-touch-all.js"></script> <script type="text/javascript" src="./test_harness.js"></script> </head> <body> </body> </html>
ςετը໘ͷ४උ ࣍ɺUFTU@IBSOFTTKTͷதΛ ॻ͍͍͖ͯ·͢ɻ ߏ&YU+4ͱಉ͡Ͱɺͪ͜Β Ϧιʔε͕มΘ͙ͬͨΒ͍Ͱ ͢ɻ var Harness = Siesta.Harness.Browser.SenchaTouch;
Harness.configure({ title: 'Siesta Test', loaderPath: { 'Siesta': 'app' }, preload: [ './touch/resources/css/sencha-touch.css', './touch/sencha-touch-all-debug.js' ] }); Harness.start({ group: 'View', items: [ 'tests/010_tabview.t.js' ] });
ςετέʔεΛॻ͍ͯΈΔ ॳظϓϩδΣΫτͰੜ͞ΕΔΞϓϦέʔγϣϯɺ୯७ͳ7JFX͕༻ҙ͞ Ε͍ͯΔλϒߏͷΞϓϦέʔγϣϯʹͳ͍ͬͯ·͢ɻ ࠓճɺॳظͰੜ͞ΕΔΞϓϦέʔγϣϯͷεΫϩʔϧͷ֬ೝͱɺλϒ Γସ͕͑ਖ਼ৗʹߦ͑Δ͔Ͳ͏͔ͷςετΛͬͯΈ͍ͨͱࢥ͍·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); }
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ςετʹ༻͢Δ7JFXΛੜ͠·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ࢦఆͨ͠ηϨΫλΛࢀরͰ͖Δঢ়ଶʹͳΔ· Ͱɺػͯ͘͠ΕΔXBJU'PS4FMFDUPSϝιο υΛར༻ͯ͠ɺඞཁͳηϨΫλʔΛࢦఆ͠· ͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } &YU+4ଆͰ༻ͨ͠ɺॱ࣍"DUJPOΛ࣮ߦ͢Δ ͨΊͷɺDIBJOϝιουΛར༻֤ͯ͠ςετέ ʔεΛՃ͍͖ͯ͠·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, // 2秒待機 {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, // 1秒待機 {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, // 1秒待機 {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, // 1秒待機 {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} // 1秒待機 ); }); XBJUΞΫγϣϯɺEFMBZϓϩύςΟʹϛϦඵ Λࢦఆ͢Δ͜ͱͰɺ࣍ͷΞΫγϣϯΛ࣮ߦ͢Δ ·ͰػΛߦ͏ΞΫγϣϯʹͳΓ·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ESBHΞΫγϣϯɺը໘Λٖࣅతʹυϥοά͠ ͯ͘ΕΔΞΫγϣϯʹͳΓ·͢ɻ UBSHFUϓϩύςΟͰυϥοά͢ΔରΛࢦఆɺ CZϓϩύςΟʹ<Y Z>Λࢦఆ͢Δ͜ͱͰɺରͷ த৺͔ΒͲͷ͘Β͍υϥοά͢Δ͔ࢦఆ͠·͢
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', target: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ESBHΞΫγϣϯɺը໘Λٖࣅతʹυϥοά͠ ͯ͘ΕΔΞΫγϣϯʹͳΓ·͢ɻ UBSHFUϓϩύςΟͰυϥοά͢ΔରΛࢦఆɺ CZϓϩύςΟʹ<Y Z>Λࢦఆ͢Δ͜ͱͰɺରͷ த৺͔ΒͲͷ͘Β͍υϥοά͢Δ͔ࢦఆ͠·͢ ͜͜ͰɺUJUMFϓϩύςΟʹ8FMDPNFͱ͍͏จ ࣈྻ͕ࢦఆ͞Ε͍ͯΔίϯϙʔωϯτʹର͠ ͯɺը໘தԝ͔ΒԼʹQYυϥοάͨ͠ޙʹ ࠓ্ʹQYυϥοά͍ͯ͠·͢ɻ
ςετέʔεΛॻ͍ͯΈΔ StartTest(function(t) { t.diag('View Test'); t.requireOk( ['Siesta.view.Main'], function() { Ext.create('Siesta.view.Main',
{fullscreen: true}); t.waitForSelector('.x-container', function() { t.chain( {action: 'wait', delay: 2000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, 200]}, {action: 'wait', delay: 1000}, {action: 'drag', source: '>>container[title=Welcome]', by: [0, -200]}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .action'}, {action: 'wait', delay: 1000}, {action: 'tap', target: '.x-tab .home'}, {action: 'wait', delay: 1000} ); }); } ࠷ޙʹɺ5BCͷϘλϯΛަޓʹλοϓͤ͞Δ͜ ͱͰɺը໘ͷΓସ͕͑ਖ਼ৗʹߦΘΕΔ͔Λ֬ ೝ͍ͯ͠·͢ɻ
ͦΕͰɺݟͯΈ·͠ΐ͏ʂ
Ҏ্ɺ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠