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
960
組み込み開発でテスタビリティを支える / 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
58
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
12
4.1k
高品質と高スピードを両立させるテストアプローチ/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
7
4.2k
テスト自動化の成果をどう評価し、どう次につなげるか/Test Automation Next Step
goyoki
1
890
Teams and Systems for Successful Test Automation
goyoki
0
290
Other Decks in Programming
See All in Programming
複雑なフォームと複雑な状態管理にどう向き合うか / #newt_techtalk vol. 15
izumin5210
4
3k
snacks.nvim内のセットアップ不要なプラグインを紹介 / introduce_snacks_nvim
uhooi
0
340
新卒から4年間、20年もののWebサービスと 向き合って学んだソフトウェア考古学
oguri
7
6.7k
ベクトル検索システムの気持ち
monochromegane
30
8.9k
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
910
WordPress Playground for Developers
iambherulal
0
120
goにおける コネクションプールの仕組み を軽く掘って見た
aronokuyama
0
140
生成AIの使いどころ
kanayannet
0
100
PsySHから紐解くREPLの仕組み
muno92
PRO
1
520
SideKiqでジョブが二重起動した事象を深堀りしました
t_hatachi
0
230
体得しよう!RSA暗号の原理と解読
laysakura
3
530
Devinのメモリ活用の学びを自社サービスにどう組み込むか?
itarutomy
0
1.7k
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
The Cost Of JavaScript in 2023
addyosmani
48
7.6k
Java REST API Framework Comparison - PWX 2021
mraible
29
8.5k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
RailsConf 2023
tenderlove
29
1k
Bash Introduction
62gerente
611
210k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.6k
Documentation Writing (for coders)
carmenintech
69
4.7k
Fireside Chat
paigeccino
37
3.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
12
610
Practical Orchestrator
shlominoach
187
10k
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