Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
RailsのSystem specから 🎭Playwrightを使う
Yusuke Iwaki
June 18, 2021
Technology
2
3.2k
RailsのSystem specから 🎭Playwrightを使う
2021/06/18 銀座Rails#34の発表スライド(一部省略)
Yusuke Iwaki
June 18, 2021
Tweet
Share
More Decks by Yusuke Iwaki
See All by Yusuke Iwaki
Fukuoka.rb_0x100_LT.pdf
yusukeiwaki
0
120
Railsの システムテスト解剖学
yusukeiwaki
6
2.9k
puppeteer-ruby: Ruby/Railsのためのブラウザオートメーションツール
yusukeiwaki
0
970
20200730_Selenium+Capybaraで不安定なテストをPuppeteerで補強してみる
yusukeiwaki
0
2.3k
Other Decks in Technology
See All in Technology
20230123_FinJAWS
takuyay0ne
0
120
エアドロップ for オープンソースプロジェクト
epicsdao
0
360
ECテックカンファレンス2023 EC事業部のモバイル開発2023
tatsumi0000
0
250
API連携に伴う規制と対応 / Regulations and responses to API linkage
moneyforward
0
150
OpenShiftのリリースノートを整理してみた
loftkun
2
290
OpenShift.Run2023_create-aro-with-terraform
ishiitaiki20fixer
1
210
PCI DSS に準拠したシステム開発
yutadayo
0
300
20230121_データ分析系コミュニティ_サテライト企画
doradora09
0
520
GraphQLスキーマ設計の勘所
yukukotani
26
6.1k
証明書って何だっけ? 〜AWSの中間CA移行に備える〜
minorun365
3
2.1k
メドレー エンジニア採用資料/ Medley Engineer Guide
medley
3
5k
NGINXENG JP#2 - 3-NGINX Plus・プロダクトのアップデート
hiropo20
0
200
Featured
See All Featured
Docker and Python
trallard
30
1.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
338
18k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
152
13k
The Pragmatic Product Professional
lauravandoore
21
3.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
15
1.2k
Robots, Beer and Maslow
schacon
154
7.3k
Statistics for Hackers
jakevdp
785
210k
KATA
mclloyd
12
9.7k
Done Done
chrislema
178
14k
In The Pink: A Labor of Love
frogandcode
132
21k
Teambox: Starting and Learning
jrom
124
7.9k
Code Review Best Practice
trishagee
50
11k
Transcript
3BJMTͷ4ZTUFNTQFD͔Β 🎭1MBZXSJHIUΛ͏ !:VTVLF*XBLJ ۜ࠲3BJMT
ຊͷ֓ཁ w 3BJMTͷTZTUFNTQFDʹ͍͓ͭͯ͞Β͍ w $BQZCBSBͱ$BQZCBSBυϥΠόͷ֓ཁઆ໌ w 1MBZXSJHIUͱ3VCZΫϥΠΞϯτɾ$BQZCBSBυϥΠόͷհ ݸʑͷػೳ͋·Γઆ໌͠·ͤΜɻ ʮͳͥΘ͟Θ͟(FN࡞ͬͨͷ͔ʯʹ ϑΥʔΧεͯ͠આ໌͍͖ͯ͠·͢ʂ
ຊͷ֓ཁ w 3BJMTͷTZTUFNTQFDʹ͍͓ͭͯ͞Β͍ w $BQZCBSBͱ$BQZCBSBυϥΠόͷ֓ཁઆ໌ w 1MBZXSJHIUͱ3VCZΫϥΠΞϯτɾ$BQZCBSBυϥΠόͷհ
TZTUFNTQFD w3BJMT͔Β͑Δɻ w+BWB4DSJQUΛ;ΜͩΜʹͬͨϖʔδͰɺ 'BDUPSZ#PUϞοΫ͕ޮ͍ͨঢ়ଶͰɺ ϒϥβͱରͤͯࣗ͞ಈࢼݧ $* Ͱ͖ΔεάϨϞϊ
8IZTZTUFNTQFD
[email protected]
ʜSFNPUFUSVF w "KBY௨৴ͰύʔγϟϧϏϡʔΛΒ͖ͬͯͯɺK2VFSZͰBQQFOEVQEBUF ˠύʔγϟϧϏϡʔͷςετΛॻ͍ͨͱ͜ΖͰɺ ɹύʔγϟϧϏϡʔ͕Ίࠐ·Εͨશମ͕ಈ͘ͱݶΒͳ͍ 8FCQBDLFS w
3FBDU7VFίϯϙʔωϯτΛz෦తʹz༻͢Δύλʔϯ ˠίϯϙʔωϯτͷ୯ମࢼݧ͕ॻ͚ͨͱͯ͠ɺ ɹϖʔδશମ͕յΕ͍ͯͳ͍͔Θ͔Βͳ͍ɻ
&&ςετ 'FBUVSFTQFD ड͚ೖΕςετ 4ZTUFNTQFD
&&ςετ ཧऀϩάΠϯͨ͠Βɺ μογϡϘʔυʹભҠ͠ɺ ৫ͷϢʔβͷΞϥʔτ͕දࣔ͞ΕΔ͜ͱ
&&ςετ 'FBUVSFTQFD ड͚ೖΕςετ 4ZTUFNTQFD ཧऀϩάΠϯͨ͠Βɺ μογϡϘʔυʹભҠ͠ɺ ৫ͷϢʔβͷΞϥʔτ͕දࣔ͞ΕΔ͜ͱ ʮཧऀʯʮ৫ʯʮΞϥʔτʯ͕ ͋Β͔͡Ί࡞ΒΕͨεςʔδϯάڥ ཧऀϩάΠϯ
μογϡϘʔυͷදࣔ֬ೝ
&&ςετ 'FBUVSFTQFD ड͚ೖΕςετ 4ZTUFNTQFD ཧऀϩάΠϯͨ͠Βɺ μογϡϘʔυʹભҠ͠ɺ ৫ͷϢʔβͷΞϥʔτ͕දࣔ͞ΕΔ͜ͱ ʮཧऀʯʮ৫ʯʮΞϥʔτʯ͕ ͋Β͔͡Ί࡞ΒΕͨεςʔδϯάڥ ཧऀϩάΠϯ
μογϡϘʔυͷදࣔ֬ೝ μογϡϘʔυͷදࣔ֬ೝ ʮཧऀʯʮ৫ʯʮΞϥʔτʯΛ 'BDUPSZ#PUͰ࡞ .PDLͰཧऀϩάΠϯঢ়ଶΛ࡞
&&ςετ 'FBUVSFTQFD ड͚ೖΕςετ 4ZTUFNTQFD ཧऀϩάΠϯͨ͠Βɺ μογϡϘʔυʹભҠ͠ɺ ৫ͷϢʔβͷΞϥʔτ͕දࣔ͞ΕΔ͜ͱ ʮཧऀʯʮ৫ʯʮΞϥʔτʯ͕ ͋Β͔͡Ί࡞ΒΕͨεςʔδϯάڥ ཧऀϩάΠϯ
μογϡϘʔυͷදࣔ֬ೝ ඞཁͳσʔλΛ'BDUPSZ#PUͰ༻ҙ͢Δ
&&ςετ 'FBUVSFTQFD ड͚ೖΕςετ 4ZTUFNTQFD ཧऀϩάΠϯͨ͠Βɺ μογϡϘʔυʹભҠ͠ɺ ৫ͷϢʔβͷΞϥʔτ͕දࣔ͞ΕΔ͜ͱ ʮཧऀʯʮ৫ʯʮΞϥʔτʯ͕ ͋Β͔͡Ί࡞ΒΕͨεςʔδϯάڥ ཧऀϩάΠϯ
μογϡϘʔυͷදࣔ֬ೝ ผ్DPOUSPMMFSTQFDͰ֬ೝ͢Δɻ TZTUFNTQFDͰNPDL
&&ςετ 'FBUVSFTQFD ड͚ೖΕςετ 4ZTUFNTQFD ཧऀϩάΠϯͨ͠Βɺ μογϡϘʔυʹભҠ͠ɺ ৫ͷϢʔβͷΞϥʔτ͕දࣔ͞ΕΔ͜ͱ ʮཧऀʯʮ৫ʯʮΞϥʔτʯ͕ ͋Β͔͡Ί࡞ΒΕͨεςʔδϯάڥ ཧऀϩάΠϯ
μογϡϘʔυͷදࣔ֬ೝ
&&ςετ 'FBUVSFTQFD 4ZTUFNTQFD ຊʹ֬ೝ͍ͨ͠ϙΠϯτΛߜΓɺ ҆ఆɾߴʹςετΛ͓͜ͳ͏ Ϣʔβ͕ߦ͏ૢ࡞Λ࣮ʹ࠶ݱ͢Δ
Ξϥʔτ͕දࣔ͞ΕΔ͜ͱ
'FBUVSFTQFD 4ZTUFNTQFD ຊʹ֬ೝ͍ͨ͠ϙΠϯτΛߜΓɺ ҆ఆɾߴʹςετΛ͓͜ͳ͏ Ϣʔβ͕ߦ͏ૢ࡞Λ࣮ʹ࠶ݱ͢Δ -PBEJOH͕ग़Δग़ͳ͍࣮߹ʹΑΔͷͰɺ Ϣʔβ͕࣮ࡍʹݟΔ෦ͷΈʹணͯ͠ ʮΞϥʔτͷද͕ࣔग़Δ·Ͱͭʯ͚ͩͰ֬ೝ͢Δ ͷ͕ϕετϓϥΫςΟε -PBEJOH͕ग़Δ͜ͱΘ͔͍ͬͯΔͷͰɺ
ʮ-PBEJOH͕ফ͑Δ·Ͱͭʯʮը໘ભҠ͢Δ·Ͱͭʯ ͳͲ҉తͳBVUPXBJUΛݮΒͯ҆͠ఆੑΛߴΊΔ ͷ͕ϕετϓϥΫςΟε ඵ͔͠Εͳ͍͠ ඵ͔͠Εͳ͍
ຊͷ֓ཁ w 3BJMTͷTZTUFNTQFDʹ͍͓ͭͯ͞Β͍ w $BQZCBSBͱ$BQZCBSBυϥΠόͷ֓ཁઆ໌ w 1MBZXSJHIUͱ3VCZΫϥΠΞϯτɾ$BQZCBSBυϥΠόͷհ
TZTUFNTQFDͷྫ $BQZCBSB͕ఏڙ͢ΔϝιουΛͬͯ ϒϥβΛࣗಈૢ࡞͢Δ
$BQZCBSB%4- ϒϥβυΩϡϝϯτશମ $BQZCBSB4FTTJPO %0.ཁૉ $BQZCBSB/PEF&MFNFOU BMM fi STU
[email protected]
fi
MFUFYUDIFDLDIPPTF
[email protected]
[email protected]
[email protected]
@
[email protected]
[email protected]
[email protected]
fi
[email protected]
fi OE fi
[email protected]
fi
[email protected]
fi
[email protected]
fi fi fi
[email protected]
UJUMFCPEZIUNMTPVSDF
[email protected]
[email protected]
D
[email protected]
[email protected]
WJTJUSFGSFTI
[email protected]
[email protected]
[email protected]
XJUIJO
[email protected]
[email protected]
fi FMETFU
[email protected]
[email protected]
[email protected]
@GSBNF
[email protected]
XJOEPXT
[email protected]
@XJOEPXTXJUD
[email protected]
[email protected]
@CZ
[email protected]
[email protected]
@
[email protected]
[email protected]
[email protected]
@
[email protected]
[email protected]
SFTQP
[email protected]
[email protected]
<>
[email protected]
DIFDLFE DMJDLEJTBCMFE
[email protected]
[email protected]
ESPQ
[email protected]
@TDSJQU
[email protected]
[email protected]
fl BTI IPWFS
[email protected]
JOTQFDUNVMUJQMF OBUJWF PCTDVSFE QBUISFBEPOMZ SFDUSFMPBE
[email protected]
[email protected]
[email protected]
TFMFDUFE
[email protected]
TFUTUZMF
[email protected]
UFYU USJHHFS
[email protected]
WBMVF WJTJCMF
$BQZCBSB%4-ͱυϥΠό ɾ$BQZCBSB4FTTJPO ɾ$BQZCBSB/PEF&MFNFOU $BQZCBSB%4- WJTJU DMJDL ʜ ૢ࡞༰Λهड़͢Δ͚ͩɻ ϒϥβͷૢ࡞ํ๏Βͳ͍ɻ
$BQZCBSB%4-ͱυϥΠό ɾ$BQZCBSB4FTTJPO ɾ$BQZCBSB/PEF&MFNFOU $BQZCBSB%4- WJTJU DMJDL ʜ $BQZCBSBυϥΠό͕ ϒϥβͷૢ࡞ํ๏Λఆٛ͢Δ
$BQZCBSB%4-ͱυϥΠό ɾ$BQZCBSB4FTTJPO ɾ$BQZCBSB/PEF&MFNFOU $BQZCBSB%4- WJTJU DMJDL ʜ TFMFOJVN DVQSJUF BQQBSJUJPO
GFSSVN $BQZCBSB υϥΠό
$BQZCBSB%4-ͱυϥΠό ɾ$BQZCBSB4FTTJPO ɾ$BQZCBSB/PEF&MFNFOU $BQZCBSB%4- WJTJU DMJDL ʜ TFMFOJVN DVQSJUF BQQBSJUJPO
GFSSVN $BQZCBSB υϥΠό
ओཁͳ$BQZCBSBυϥΠό 4FMFOJVN w 4FMFOJVN8FC%SJWFSΛར༻ͯ͠ϒϥβΛࣗಈૢ࡞ ˢར༻ϒϥβ͝ͱʹɺผ్8FCυϥΠόʔΛΠϯετʔϧ͢Δඞཁ͋Γ $VQSJUF w $ISPNF%FW5PPMT1SPUPDPMΛར༻ͨ͠'FSSVNͱ͍͏ϥΠϒϥϦΛར༻ͯ͠
&EHF$ISPNFΛࣗಈૢ࡞ "QQBSJUJPO w $%1Λར༻ͯ͠ɺ$ISPNFΛࣗಈૢ࡞ ɾɾɾ࣮࣭తʹσϑΝΫτελϯμʔυ
ͦͦ 4FMFOJVNҎ֎ͷυϥΠό ͳͥඞཁͳͷ͔ʁ🤔
:FU"OPUIFS$BQZCBSBυϥΠόͷඞཁੑ 4FMFOJVNυϥΠόʹର͢Δෆຬ w ʮηοτΞοϓ͕໘ʯͬͱ؆୯ʹ͑ΔΑ͏ʹ͍ͨ͠ $BQZCBSBࣗମͷػೳෆ w ʮϖʔδભҠ͢Δ·Ͱͭʯʮ-PBEJOHද͕ࣔফ͑Δ·Ͱͭʯ $BQZCBSB%4-Ͱॻ͚ͳ͍ͷͰɺυϥΠόಠࣗͷϝιουΛఏڙ͍ͨ͠ w
ʮͳΜ͔Α͘Θ͔ΒΜ͚Ͳɺ࣌ʑςετ͕མͪΔʯ %0.มߋݕ͕ෆશͳͷͰɺΑΓมߋݕʹڧ͍ํ๏Λఏڙ͍ͨ͠
$BQZCBSB%0.มߋݕ͕ෆશʁ w $BQZCBSBࣗମͷػೳෆ w ʮϖʔδભҠ͢Δ·Ͱͭʯ ʮಛఆͷཁૉ͕ݱΕΔ·Ͱফ͑Δ·Ͱͭʯ ˢ$BQZCBSB%4-Ͱॻ͚ͳ͍ɻ
w ෦తʹϛϦඵͷϙʔϦϯά ˠ%0.มߋݕ͕ෆશɻ λΠϚʔΛֻ͚ͯ ݺͼݩ͔Βࢦఆ͞Ε͓ͨࣄΛ͢Δ ཁૉ͕ݟ͔ͭΒͳ͍߹ʹ ɹλΠϚʔ͕Ε͍ͯͳ͔ͬͨΒ ɹඵ͔ͬͯΒ ࠶ɺཁૉͷऔಘΛࢼΈͯ ϦτϥΠ͢Δ
:FU"OPUIFS$BQZCBSBυϥΠόͷඞཁੑ ɾηοτΞοϓ໘ ɾ$BQZCBSB%4-Ͱॻ͚ͳ͍ ɹಠࣗػೳΛ͍͍ͨ ɾ%0.มߋݕ͕ऑ͘ɺ ɹςετ͕ෆ҆ఆ "QQBSJUJPO $VQSJUF
:FU"OPUIFS$BQZCBSBυϥΠόͷඞཁੑ ɾηοτΞοϓ໘ ɾ$BQZCBSB%4-Ͱॻ͚ͳ͍ ɹಠࣗػೳΛఏڙ͍ͨ͠ ɾ%0.มߋݕ͕ऑ͘ɺ ɹςετ͕ෆ҆ఆ "QQBSJUJPO $VQSJUF
ຊͷ֓ཁ w 3BJMTͷTZTUFNTQFDʹ͍͓ͭͯ͞Β͍ w $BQZCBSBͱ$BQZCBSBυϥΠόͷ֓ཁઆ໌ w 1MBZXSJHIUͱ3VCZΫϥΠΞϯτɾ$BQZCBSBυϥΠόͷհ
8IBUJT1MBZXSJHIU w ݩ(PPHMF$ISPNFνʔϜ ݱϚΠΫϩιϑτͷΤϯδχΞ͕։ൃͨ͠ Φʔϓϯιʔεͷϒϥβࣗಈૢ࡞πʔϧɻ
8IZ1MBZXSJHIU w ͋ΒΏΔγʔϯΛαϙʔτ w ՃͷυϥΠόʔͳͲෆཁͰɺ $ISPNF .4&EHF 'JSFGPY 4BGBSJΛࣗಈૢ࡞Ͱ͖Δ
w 8JOEPXT NBD04 -JOVYશରԠ w ϞόΠϧσόΠεͷΤϛϡϨʔγϣϯ w ϔουϨεʢը໘ͳ͠ʣϔουϑϧʢը໘͋Γʣ 👍 IUUQTQMBZXSJHIUEFWEPDTXIZQMBZXSJHIU͔ΒҾ༻ˍҰ෦ิ
8IZ1MBZXSJHIU w ͯ͘ߴਫ਼ w "VUPXBJUJOHʹΑΓɺ ɾఆͷ%0.ཁૉ͕ͨ·ͨ·ݱΕͳͯ͘ɺগͬͯ͘͠ΕΔ ɾXBJU'PS4FMFDUPSΛ͍͍ͪͪॻ͔ͳ͍͍ͯ͘ w
ωΠςΟϒͷϒϥβΠϕϯτۦಈͰಈ࡞͢ΔͷͰɺ ɾTMFFQͳͲ͕ෆཁ ɹˠෆ҆ఆͳςετ͕ݮΒͤΔ w ϒϥβࣗಈૢ࡞Λฒྻಈ࡞Մೳ 👍 👍 IUUQTQMBZXSJHIUEFWEPDTXIZQMBZXSJHIU͔ΒҾ༻ˍҰ෦ิ
࠶ܝ :FU"OPUIFS$BQZCBSBυϥΠόͷඞཁੑ ɾηοτΞοϓ໘ ɾ$BQZCBSB%4-Ͱॻ͚ͳ͍ ɹಠࣗػೳΛఏڙ͍ͨ͠ ɾ%0.มߋݕ͕ऑ͘ɺ ɹςετ͕ෆ҆ఆ "QQBSJUJPO
$VQSJUF
࠶ܝ :FU"OPUIFS$BQZCBSBυϥΠόͷඞཁੑ ɾηοτΞοϓ໘ ɾ$BQZCBSB%4-Ͱॻ͚ͳ͍ ɹಠࣗػೳΛఏڙ͍ͨ͠ ɾ%0.มߋݕ͕ऑ͘ɺ ɹςετ͕ෆ҆ఆ "QQBSJUJPO
$VQSJUF ͦΕɺ1MBZXSJHIUͳΒͰ͖ΔΑʂ 🎭 Playwright
ͱ͍͏ετʔϦʔʹ͢ΔͨΊʜ
(FN࡞Γ·ͨ͠
1MBZXSJHIU3VCZ͔Β͑Δ 1MBZXSJHIUϦϦʔεϊʔτ͔ΒҾ༻ લճͷϦϦʔεͰɺ/PEF͕ͳ͍ڥͰ1MBZXSJHIUΛαϙʔτ͢ΔͨΊͷ෦ϓϩτίϧΛಋೖ͠·ͨ͠ɻ ͜ͷϓϩτίϧɺ1MBZXSJHIUGPS1ZUIPOαʔυύʔςΟͷ1MBZXSJHIU4IBSQɺ1MBZXSJHIUGPS(Pͷ࣮Ͱ طʹ༻͞Ε͍ͯ·͢ɻ
1MBZXSJHIU3VCZ͔Β͑Δʂ 1MBZXSJHIU αʔόʔ 1MBZXSJHIUΫϥΠΞϯτ QMBZXSJHIUQZUIPO QMBZXSJHIUTIBSQ QMBZXSJHIUKBWB 1MBZXSJHIU ϓϩτίϧ
1MBZXSJHIU3VCZ͔Β͑Δʂ 1MBZXSJHIU αʔόʔ 1MBZXSJHIUΫϥΠΞϯτ QMBZXSJHIUQZUIPO QMBZXSJHIUTIBSQ QMBZXSJHIUKBWB 1MBZXSJHIU ϓϩτίϧ QMBZXSJHIUSVCZ
DMJFOU 1MBZXSJHIUϓϩτίϧΛ͠ΌΔ3VCZΫϥΠΞϯτ Λ࡞Εɺ1MBZXSJHIUͷػೳ͕ར༻Ͱ͖Δʂ
QMBZXSJHIUSVCZDMJFOU
DBQZCBSBQMBZXSJHIUESJWFS ɾ$BQZCBSB4FTTJPO ɾ$BQZCBSB/PEF&MFNFOU $BQZCBSB%4- WJTJU DMJDL ʜ QPMUFSHFJTU TFMFOJVN $BQZCBSB
υϥΠό QMBZXSJHIUTIBSQ DBQZCBSBQMBZXSJHIU ESJWFS
DBQZCBSBQMBZXSJHIUESJWFS IUUQTQMBZXSJHIUSVCZDMJFOUWFSDFMBQQEPDTBSUJDMFHVJEFT
[email protected]
ˢ͜Μͳ͔Μ͡Ͱ$BQZCBSBυϥΠόΛొͨ͠ΒɺͨͿΜ͑·͢ ˣυΩϡϝϯτɻʢগ͠ؤுͬͯॻ͖·ͨ͠ʣ
DBQZCBSBQMBZXSJHIUESJWFS IUUQTQMBZXSJHIUSVCZDMJFOUWFSDFMBQQEPDTBSUJDMFHVJEFT
[email protected]
ʮ࣌ʑམͪΔςετͱʹΒΊͬ͜ʯ ͔Βղ์͞Ε·͢ʢͨͿΜʣ
ຊͷ֓ཁ w 3BJMTͷTZTUFNTQFDʹ͍͓ͭͯ͞Β͍ w $BQZCBSBͱ$BQZCBSBυϥΠόͷ֓ཁઆ໌ w 1MBZXSJHIUͱ3VCZΫϥΠΞϯτɾ$BQZCBSBυϥΠόͷհ
͓Ͷ͕͍ w ͪΌΜͱಈ͔͘Θ͔Γ·ͤΜ͕ɺͨͿΜಈ͘ͷͰɺ TZTUFNTQFDΛӡ༻͞Ε͍ͯΔํͥͻͬͯΈ͍ͯͩ͘͞ɻ w ʮ4FMFOJVNͩͱಈ͘ͷʹɺ1MBZXSJHIUͩͱಈ͔ͳ͍Αʯ Έ͍ͨͳ࣮ӡ༻ϑΟʔυόοΫɺͥͻ͍ͩ͘͞ɻ w
ʮ1MBZXSJHIUͷ˓˓ػೳ͕3BJMTͰ͑ͨΒ࠷ߴ͡Όͳ͍ʁʯ Έ͍ͨͳఏҊɺͥͻ͍ͩ͘͞ υΩϡϝϯτIUUQTQMBZXSJHIUSVCZDMJFOUWFSDFMBQQ *TTVFIUUQTHJUIVCDPN:VTVLF*XBLJQMBZXSJHIUSVCZDMJFOUJTTVFT
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠