Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
組み込み開発でテスタビリティを支える / Testability in Embedded So...
Search
Hiroki Iseri
February 17, 2018
Programming
0
970
組み込み開発でテスタビリティを支える / Testability in Embedded Software
テスト自動化研究会の活動で作成した資料の公開用簡略版
Hiroki Iseri
February 17, 2018
Tweet
Share
More Decks by Hiroki Iseri
See All by Hiroki Iseri
高品質と高スピードを両立させるソフトウェアQA/Software QA that Supports Agility and Quality
goyoki
11
4.3k
高スピードと高品質を支えるソフトウェアQA(開発変革セミナー)
goyoki
1
63
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
12
4.2k
高品質と高スピードを両立させるテストアプローチ/Test Approach that Improves Quality and Agility Together
goyoki
17
18k
プレイヤーとしてのチームのテスト力UP/Improving team skills for testing
goyoki
3
1.7k
テスト設計チュートリアル/Test Design Tutorial
goyoki
12
6.4k
自動テストを活躍させるための基礎作りとテスト設計の工夫
goyoki
8
4.3k
テスト自動化の成果をどう評価し、どう次につなげるか/Test Automation Next Step
goyoki
1
900
Teams and Systems for Successful Test Automation
goyoki
0
290
Other Decks in Programming
See All in Programming
PHP で学ぶ OAuth 入門
azuki
1
190
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
1.5k
Bedrock×MCPで社内ブログ執筆文化を育てたい!
har1101
6
1k
エンジニア未経験が最短で戦力になるためのTips
gokana
0
270
アプリを起動せずにアプリを開発して品質と生産性を上げる
ishkawa
0
2.8k
AIコーディングワークフローの試行 〜AIエージェント×ワークフローでの自動化を目指して〜
rkaga
2
3.6k
AI時代の開発者評価について
ayumuu
0
150
SEAL - Dive into the sea of search engines - Symfony Live Berlin 2025
alexanderschranz
1
130
サービスクラスのありがたみを発見したときの思い出 #phpcon_odawara
77web
4
640
タイムゾーンの奥地は思ったよりも闇深いかもしれない
suguruooki
1
640
ウォンテッドリーの「ココロオドル」モバイル開発 / Wantedly's "kokoro odoru" mobile development
kubode
1
110
AI Agents with JavaScript
slobodan
0
230
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
119
51k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.2k
KATA
mclloyd
29
14k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
5
540
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
Statistics for Hackers
jakevdp
798
220k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Embracing the Ebb and Flow
colly
85
4.6k
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.6k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Transcript
1
)43.&/ • 4 • D@AFID=;DKH1*/"D@E;':<GJK B9 ; (: •
• ;8:,84;>AIC?0 # L4DKH31-/3235!;M • 04$D@AFID=%5"+6/$D@E3 1-/4D@AFID=%; *7+# 2
WWfkiab_RQNOheiS hegjmh`T • %'( CZ[hei ^H\IQRVK LZD • Cfkiab_hei&)'SDn+38
7093;oA • hegjmh`SPBcei^PG\ • Chegjmh`S PWWfkiab_Scei F%$ J]\D Chei^ETBVKhegjmh`^[XUGD • Chei SMYSdehlD!*39-6923;<" /3<=10;736=<094:;23;>9539 09263.:4=?0;3#!.=3409,>9580@;" 3
4 " #!
746:<7.+, >5;8/0-1=39-<=2? • >%& ! (*? • >'&)
! (*? • >$#(&$!! ! (*? • >$"%$' ! (*? • > "%! (*? • >( ! (*? • >#&'(# ! (*? !" ( S.) $ # 5
)[Y\P[YZ]_[WMQ • *"c3@:A67;<;CEd • )*I • +!c37B:AD67;<;CEd • [Y\&P b
.V) JSKH • c1?>CA?<<67;<;CEd • [Y\-V)JSKH • , (c2:8?=@?B67;<;CEd • [Y\-PTJSF[Y\$ RP/'I • %c4;=@<;8;CEd • )[Y\SLP$ VXa^`OJSKH • c4C67;<;CEd • )[Y\O0GUINH • #,c5>9:ABC6>967;<;CEd • [Y\-V#,JSKH 6
" 0,.4:0% • 0,1 • 0,1,*>6#"
• 0,.4:0% • 0,1 "0,.4:0%#" • +,08<7;0,.4:0% • 0,.4:0%#3>2&'$! # • -51&'$$>(0)/90,.4:0% • 0,.4:0%= • 0,.4:0% 7
• /+0 • /+0+)=5" ! • /+-39/$
• /+0 !/+-39/$" ! • *+/7;6:/+-39/$ • /+-39/$"2=1%&# " • ,40%&##='/(.8/+-39/$ • /+-39/$< • /+-39/$ 8 $ # % ! "
UQVGUQSY_ULG KNV^Mb *( UQSY_ULJ CI • ) ) +(
UQSY_ULJBIKcOUPT\JCI • FHI"!)$G% • `M]cKcOUPT\A-=<86=KcOUPT\ ,( UQSY_ULJBIEZaRQJCI • ,DGKZacTAUQV&# • UQSY_ULG • UQVG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • UQV#ZaRQ • /0/1)GX^WPQA_QP[cQWUQV 9
TOQY`TFE&?D • TOV% E>DGdQeZHeO • • TOV)E% ?D=E#>D= •
-LdZFKbeN_d<UXSI<.10Lea< • ' • TOV)B E% ?D='E#>D= • -cK<]^`Rd[<VbeM • • "!E% !ACD=% A+@Ld\eWdV E,?D=( $E#>D • -`dJ*<[`[cPSM*</49473472; 07642:587 10
?9:DH?43(1 • ?9@3 '1,?9@FJ?4H?4 • ?9@ • 8B?4<6=7 •
.-2)?9@;EI • #$&$%"0?9@ • %$ $! +* • ?9@ • ?9@>JI,)/,AG5C+* 11
12 )' % )' /
)' ,+! ! )' % )' / . "- )'($ #&*
13 .* ( .*
!6 .* 31# # .* ( .* !6 5 $4 .*,' %)0 2/ +&/ "-/
" • #$ $ • •
• • !$" 14
^Z`) EI^Z`Oq[sfPsZI&4v @G&4I*E (HBL • # I+Oq[sfPsZ • u
tRXpJpYNbGF,M!ALu? tTkg\kJ"-u?+0rWseZ!pU • %G+Oq[sfPsZ • # HCDOq[sfPsZ • uQilos[ ?Xilos[ ?. I • 3%GOq[sfPsZ • ^Z`!IOq[sfPsZ • u_d]S t:=68'u?^Z`!/ t>6<=? =7;59;'u?12$!pUrjc[mqU • 1Oq[sfPsZ • VsaohnI1IOq[sfPsZ • u6;9IK?Upsdn 15
YUV]cYOH HPf_W[ YU[D GBA • YU[>J >LK • IXgdH C
? MK • !FPfVg^QgU • &9-/+928/"# '754*<8154CZ\WRCC@K • )*($%# +&(CTabegVH@NC@K • (249;`gU# 0.-USc_[ ,:3=6<8154FE!CC@K 16 " "" "$' "")% $' * ( & #!
856:?80** • ( • /B3847=, '#%!)856:? 80. • 859&$+"2>B,*
• 859 *) $-A • * ( • ;@<1@9* • *856:?80. 17
aZ]fnaSH +H-#v +?: 2OQPH=,L0L • &H + • 8'AC;P&N`to=D>P< •
hq[ZH + • 8Trh_bHIOQP< • jdYlrbH + • 8.' I<9^tkHZVoI < • /EHbptcUg • u *) • (&<O5AC;F;<:3s4nZWIF;< • 8 $JH6 • %R1@BF;<:n\tZR!.AF;< • 87JH6 • GAF;<:eXRM0KF;< • 8[VmnaS • -"#=[VmnaSitoEFOF;< 18
aZ]fnaSH +H-#v +?: 2OQPH=,L0L • &H + • 8'AC;P&N`to=D>P< •
hq[ZH + • 8Trh_bHIOQP< • jdYlrbH + • 8.' I<9^tkHZVoI < • /EHbptcUg • u *) • (&<O5AC;F;<:3s4nZWIF;< • 8 $JH6 • %R1@BF;<:n\tZR!.AF;< • 87JH6 • GAF;<:eXRM0KF;< • 8[VmnaS • -"#=[VmnaSitoEFOF;< 19 /79-;>6 4:# $# !%(#@10 ?8/793<5( $)+ @1* /79.= '#"&2,/79.=
, "Syktn]th , "[ohq`bPMZ • gbh+RNKOI, "[hfme^tP/-R 'V2W )RQZU
PS1 5T HHPJZ clh^_\ S1 5Tz o]topq &3 Tz opq&3T HHPJZ S o]topqS &$ sviLY\]i r#UPS1 5 6!=<LYsviU PS1 5 1 5S .4) sviS opq&$S ) %Sopq&$ Spjdqta) :D?B w7)+X 0qb`S( LYx ohq`b /-R'V2W , " >G@EFADC :>;PSohq`bS ohq`b- [ /-u*R'V2W 98
0 • .!-$'%&) #+-/
• ,"!(!-$'%&),"* $"' %! 2/%! -5.* :4)93 +; # A+>?8 -5)9 =6(# -5)9 -507 &1@assertion $'IF ,< 21
9!:C@CM B?K • =;LE7M <JG"IK8 BMBG"HF>8 • C • Tg^
• acaeY[U # • cfS # • Q`WPS] #(%bOfZ # • *331% • $@C\XZ_c\N@D7B C= >A &BAK • dRVgTg^ RO^h+0-/,.2').,6/.45i 22
$V S)T$LUT] 0EE=DF@BA !V • otvUQJRV0EE=DF@BA • -*0763504V8:F;?<B>*2:A:>=D • "V0EE=DF@BAL(&\
N^PK_# • (_%YTM^XT[TJmvlcd`Z&V $_ UO] • gunbr'0EE=DF@BA • - ;BAEF9=GCD +*EF:F@;9:EE=DF,1..//- • gunbrS`hvipu_ HeqvZVI] gvlWgunbrUO] • guoafsvipu'kvjV$_ UO] 23
01%,*')(:>G[PU]LOIV[=AC 24 • %,*')(:G[PU]LOIV[>4 ?MJN> ;69ZSY;<892C -F]R[K]J>WEQWX4 ->A3< D29MJN
7CHJMTD! \ 5B2: @C .%,"+*)#&$%,*')(WEQWX=AC /
UQVGUQSY_ULG KNV^Mb 25 *( UQSY_ULJ CI • ) )
+( UQSY_ULJBIKcOUPT\JCI • FHI"!)$G% • `M]cKcOUPT\A-=<86=KcOUPT\ ,( UQSY_ULJBIEZaRQJCI • ,DGKZacTAUQV&# • UQSY_ULG • UQVG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • UQV#ZaRQ • /0/1)GX^WPQA_QP[cQWUQV
;79@F;0&(/I4;5:E' " • /I4;5:EHBG%$)#;79@F;0 • ;79@F;0 .$-?I=12/* ' •
;7<HBG"$-;79@F;0'D3>8C* ' • ;79@F;0.,*$ .;7<'76IA&% #-+!. 26
RmV^W]hFJ+IMN0/73J 4 +IMN0/K^Z_- 'J( • #&J1 QH@>?C=Q+5 "l "l"6GAE!)BN: +ID;EXkfmak_LSk\mcTmZQ0/
BN • "p1 K;>?C: • "p1 KPON>?C: • UdYTW_2 *8% lXk[e_nbmjk`lgSimo • .$9,9Q <N 27 " !
'#*" ,$ )
'.*" ,$- 0 ,$2+ ,$ (4 3 /1!% (4 &5 28
4* '#*" ,$ )
'.*" ,$- 0 ,$2+ ,$ (4 3 &6 # /1!% (4 &5 -! <+ 4* 20" $ 3> :';) = .0"$ 4* /5, 7(% 29 <+ 4* 20" $ ; ? 8 9& 6 1
4* 62:0 <3!*9
6@:0 <3!= C%(<3F; "&"#)' <3! "7H+ "G &6 # AD/4 " "7H+5J -! <+ 4* 20" $ 3> :';) = .0"$ 4* /5, 7(% 30 <+ 4* 20" $ ; ? 8 9& 6 1 -K>.1 '"E $' 8I ?ML ,B
Vt[d\cnMP ORS#"-'P( 'P(Nd`e#"P • aieYZVP!u^j_`dlvO& Pr kqu7=G=@*B>*4BA;=DAE+T# JrkqKNOd`eP QT$LS oXimtb_`dl
\o`w) iUXps] ^j_`dl \o`w gtfYZV ^j_`dl \o`w) " ^j_`dl \o`w) ^j_`dl \o`w Pd`e w)Jd`bhpdWO%LS d`e w) d`bhpdWO%LS d`e w) d`e w d`e w 654*2/0.13/..2*8=<?;:@*<=G?;=*EB>FH:D=*, 9B>FH:D=*@?>=*;I;@=*CDB;=EE=E 31
!LRS('5/M 1T$C + Q/T 1ESHOM('M 64 !-TGPGPDFKB • ('p%I# •
3fqdWXULRS 0AYg^lAn`ZKJ$* 74 !-T&ES • 9??:>@;=<LRS!._X`Z • [eaVa]cM, 84 !-T ESgn^]T"N • a]cp2 a]cT • IM) T • 3iblAibl\hjmq\ko 32 "' )$ # ! %* $$&(
+NUW10>8O 9Y-B 5 T8Y 9GWHRO10O • .:M10O &*YFICVGW • lmq(*TgvdO4
• FICVTW • ;'/u '/fvr) 2!S@WOK"&GW • _pvu%10w4)x • FICVTW • tvs\nvOkio[rYFICV3ZK*GW • -%10wkredb`?krea[?<7)x • $N YAXJFICVTW • ,6Qcjh]^[KP?EEO=K#FNMWELDA 33
?;@5%46L9?:>F. • ?;@.K5*)53/ • ?;@JCI')4?;=BH?75 • K K •
?;@GL?7H?7 • .!#E8A<D5 -0/ • ",&2?;=BH?75+(41$- 34
jfk$ ZOXgok^_[[|ajbisU x]t|[|ajbismh|z}2=<9;2:~ • gok^_[Zlr]zZ(Tx]t*R • "W)WR%Kjfhnwj\!S'P-N [pwc|euz :<5 3;>
q]by dzky|v| Ix]t,76V& QJZ I x]t,T({ Z }wz b +Rx]tZYOK45<1458` v|R(~ H2=<9;2:.2@@BDG?C@B.<BFGRVx]t R[pwc|euzSq]bydzky|v x]tZjfkT# L2=<9;2:.;G?CA?EAFM/2=<9;2:0 35
LGM ;.:HRM>?<<_ALBJV8 Q_LFYO^C `")(%'"&! • \=W; 7- 9;19202:- 36 <S[D_FY^
&($ #'* U=B]E^M]_Z_ System Service OS Service Abstraction Hardware Driver +#'*\=W514 5/:,]C9>@KJ NKC;73 XOKMLGM9 LGM 55/:61 4 +BZGI614 7E ^T_P^M; XOKMLGM9 LGM 8 72:
NHO</;JSO@A==_CNDMX8 )('&)=_CNDMXQK_] 37 Broker
*F_RH9=UZ8"! <U\CG514, 8 < * )('&)QK_]7:3+ =LUN>T6=_CND MXWBPIV`c a <2;5+NHKRZN> 0 76; -Z=[K?V%$#b.T[_H^LEYH
4'+5ZVW\`ZRHBLHQcSZT X_DI19NH&$:0( • "K,KHQcSZTX_I2UVZ^deb]aH MYcaH!P ;<=O3 AH IHUVZ^QcSZTX_*)D JO3"K,KI9N
8G<6 • /P.G%7BLG2QcSZT[IE> C19NHZV[#H&$:9@F6 • UVZ^QcSZTX_*)D2ZVW\`ZRG ->C 6O9:2ZVW\`ZRP?O 38
WSXGWSU[dWLG KNXcMg 39 *( WSU[dWLJ CI • ) ) AQg\ahU[Rbg
+( WSU[dWLJBIKhOWPV_JCI • FHI"!)$G% • eM`hKhOWPV_A-=<86=KhOWPV_ ,( WSU[dWLJBIE]fTSJCI • ,DGK]fhVAWSX&# • WSU[dWLG • WSXG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • WSX#]fTS • /0/1)GZcYPSAdSP^hSYWSX
'$('$%)+'#! "*,-& "*,-&
40
]Z_I]Z[`g]VS?RUcjl\ , DKGIUcjl\@PQAM *) HQ"M • W]il]VbH]Z[`g]VSQAM> • %N
J]Z[`g]V S#BER> • (30=]Z_Icj_[WakY +) @PQ"M • O! H]Z[`g]VSQ"M • (]Z_&%=2f^h=.4;768'59:'14;<=f^h&] Z_=f^hdlZ]Z_ ,) CGQ"M • $H]Z[`g]VI SDR • WkXgek[hH]Z_SR • m-/HL"TF%]Z_ 41
".+/#,+ 647 • "./- • 647 (6459:621&)!'3<810
• ;*/- • +6471; $(*%0 (James W. Grenning) 42
UQVGUQSY_ULG KNV^Mb 43 *( UQSY_ULJ CI • ) )
+( UQSY_ULJBIKcOUPT\JCI • FHI"!)$G% • `M]cKcOUPT\A-=<86=KcOUPT\ ,( UQSY_ULJBIEZaRQJCI • ,DGKZacTAUQV&# • UQSY_ULG • UQVG G • 36>?'4>'.<5@:6;?4?7<;)36>?'2:699> • UQV#ZaRQ • /0/1)GX^WPQA_QP[cQWUQV
@<>BD@:8 "4(69CEF?1 • @<A/ .36 • @<>BD@:/&8@<A/+! • @<ACE=<.36
• @<A,@<A8!0$ &)6 • @<>BD@:#-,%7.@<A -,%7. @<A85*6 • @<A '2( @<A;F<86 • @<>BD@:86/6@<A8(6 44
856;?80(!/ 859( - +% • 859( %856;?80(!/. • 856;?80/- *&,'
• (1@6B=2B5'#$8594B: %)>7<@3"$ (/A 45
c`bhlcXRKV c`eRUJSN!H • UJSOLMF^`cj1aieZ[WRQ RI • 'Q o*o$ • ("T+R)q38;
F6599 r • #R,G • gbpnTYdX\jR% • 4598:QPc`e]pfR R% • 2A?<B-2C>?-W_kYmaieZ[W&R.8C=?DE-20-7<DE@B/ 46
/.0''*"( ' • -21' %#$ !+) &/.0-21', //
Excel! void test_1_1() { … expect1 = 1; expect2 = 0; … assert(expect1 == result1); assert(expect2 == result2); … } void test_userCreation_minusAgeIsInvalid(void) { … expectUser = createUser(“invalid usar”, -1); … EXPECT_EQUAL_USER(expectUser, result); … } … " Test as Documantation 47 xUnit Test Patterns: Refactoring Test Code(Gerard Meszaros)
/.0''*"( ' • -21' %#$ !+) &/.0-21', //
Excel! void test_1_1() { … expect1 = 1; expect2 = 0; … assert(expect1 == result1); assert(expect2 == result2); … } void test_userCreation_minusAgeIsInvalid(void) { … expectUser = createUser(“invalid usar”, -1); … EXPECT_EQUAL_USER(expectUser, result); … } … " Test as Documantation 48 xUnit Test Patterns: Refactoring Test Code(Gerard Meszaros)
Wvvltko~¼¬§®&+ flyzTeslrryTUT¬§®¥»¯·² ¢©·¹£ • YuklTeslrry • biyj{xlTflyzT¬§®)B9FP • YutkozouthrTflyzT_umojT¬§®µ¨«¯ $4HDO
• ]hxkVzuVflyzTYuklT¬§®P • flyzTYuklTZ{vrojhzoutT¬§®¥»¯¥±³ºID • flyzT_umojTotTcxuk{jzoutT¬§®G¬§®/ C¸¦«¢ • Xlnh|ouxTeslrry • WyylxzoutTdu{rlzzl¬§®¤»§-/hyylxzout- 7 • [xxhzojTflyz¬§®?2'- • ^tzlxhjzotmTflyzy¼:¬§®!";¬§®?2 • dlyu{xjlT_lhqhml¼·¨»§J, • autklzlxsotoyzojTflyz¼¶¹ª´º ?2>¼ • \xlynT\o~z{xl¼*18.\xhmorlTflyz6L 5¬§® • \xlw{ltzTZli{mmotm¬§®- R7°«¡; • `ht{hrT^tzlx|ltzout¬§®C(3%EA¬§®C • eru}Tflyzy¬§®C/K • cxupljzTeslrr • X{mmTflyzy N& M&R • Zl|lruvlxyTauzTgxozotmTflyzyJ<@¬§®0]omnT • flyzT`hotzlthtjlTYuyz¬§®¥§®S • cxuk{jzoutTX{my¬§®0# =¬§®°£Q xUnit Test Patterns: Refactoring Test Code(Gerard Meszaros) 49
*??6=59Dpe_fRR 26AB(1<6;;A()(e_f^ogRlhY[blm\ • 26AB 1<6;;Ap+@@3B94(26AB • e_f$ I • R
% • -=B6@34B9=7(26ABAp!URe_fSRIGF "Oe_f$ IWV • 06A>C@46(.63:376plao_&IHTJGLNGPG • />=56B6@<9=9AB94(26ABpkmcjnP XLNGNE$ IQPLNGV • #R %RM • ,@6A8(,9DBC@6p R`dfZdiXe_f]o_'O KPG 50
:68<>:31 .#/2=?@9+ • :6;) (-/ • :68<>:3)!1:6;) %
• :6;=?76(-/ • :6;&:6;1* !$/ • :68<>:3 '& 01:6;)65@=(#/ • :6;",#:6;4@61/ • :68<>:31/)/:6;1#/ 51
! •
"D1,>:E "D1$!&' " %$!&' "0A ;C " F2 6=4=( "& #" "68 /7 "-<. "*?@AG VSTeP+D (http://qualab.jp/vstep/) ) 1 9B) 53 52
?<@ 7?<>AC?;:/8 ?<@&BD=<37! )( ?<@ 7.:6 28 • ?<>AC?;7# 7'.409:E"
*( 287-8?<@:8 +( ?<@ 7$ :/8 • ?<>AC?;7 :1,%5 :/8 53
" g?bR " +SA " KGSA 6[PC
$ ," 0 ," 8Z MU XL MU 5] H; e`V PC_ aQ PC 1X @EH 5] H; ":YN :YJ "g?X> " + *!-0 "=cf "^J ) " 6[PC 5]H; " 6[PC 5]H; 6[F Oh 1 … 6[F -20℃ *# (. Oh /'. O21 <TB7 30s35s 54 VSTeP%" &JaSST'16\dJW 9JaSST\dID34
55 1 % 0
TRV H>KG BJ TRV HC@^KBJ !
! … ") ! …. ") (+)& $M]QWL\]OH%EA DTRV"K BJ;TRV HK BJ (,)HTRV"KA: TRV?FTRV"K: TRVH# GIDJ <TRV"HH= ^N[RY_R'XSP_QY_RH ZU\]O`53482) ^05!:/*.798`1-634a ! …. QA ! 56
7E@/ENKOHE !"!#H4E • NKO?14E!"!#!$+%$'&() '$+%$'&*-, • JRH6<C.5F9JR3BFE:4 • NKO3JR:>NKMPSNI@ 3BD.
3 • !"!#ANKOQTLK@@=7E H G8NKOA6;2D0 1"#A →24-B '6/;< ?!9. 1" ,%1" (3 (& ?!9. → 8?$ 1" *#A →50 :=@+)7> 57
B s¡£ 2C ¦©¤9wu • §£¡£2C ¦©¤ • ¡£D}to¡£¥xF z y
• q¡£$E?M0 \kmjfelhkjT`gngiT©¥ (,K4rU_cdbZV • B ¡£>O}x*oQA }y ¡£3RD}<z}u{xt • ]^]a~y¡£B L6 .! | • 2C ¦©¤¯ XW ¡£JH;<7 • ¡£/%)8p¡£ =' YW ¡£¬B &|yp # ¡£B Nv • 5"}t¡£JH¨¢ª • V:¡£¬«¬¤S ¡£ • B @¡£©ª¡£+/%®8 • V1G-@¨¢ª[c`IP 58
%#'" • %#' %#')&*%#'" %#' (+$# !" %
'P7 -*$! K:2I FBJ?% '3G+&. FB;H% '6> ;HN9K:% ' *-&OpenCVK: N9 <O5E ")/5 E*$! K: ;H2I % '3G -*$!K: N9=QN9 @ % '%#, % '/%( N9K:;H% ' % 'P7MA % '%#,C8 ;H1D0 % '3G % '6>4RL 59
• ! • "% '$ !
# &' 60