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
TypeScriptを振り回せ!
Search
uhyo
December 17, 2021
Programming
9.9k
28
Share
TypeScriptを振り回せ!
2021-12-17 Harajuku.ts Meetup #1
uhyo
December 17, 2021
More Decks by uhyo
See All by uhyo
TypeScript 7.0の現在地と備え方
uhyo
7
2.5k
React 19時代のコンポーネント設計ベストプラクティス
uhyo
19
8.8k
型定義でAIと会話する:型を通じてAIに意図を伝えるテクニック
uhyo
1
66
タグ付きユニオン型を便利に使うテクニックとその注意点
uhyo
3
1k
ECMAScript仕様の最新動向: プロセスの変化と仕様のトレンド
uhyo
3
850
TypeScript 6.0で非推奨化されるオプションたち
uhyo
18
7.9k
Claude Code 10連ガチャ
uhyo
4
1.1k
AI時代、“平均値”ではいられない
uhyo
8
4.2k
意外と難しいGraphQLのスカラー型
uhyo
5
1.1k
Other Decks in Programming
See All in Programming
まかせられるPM・まかせられないPM / DevTech GUILD Meetup
yusukemukoyama
0
110
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
kentaroutakeda
5
2.5k
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
4
2.9k
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
550
存在論的プログラミング: 時間と存在を記述する
koriym
5
840
Rethinking API Platform Filters
vinceamstoutz
0
11k
感情を設計する
ichimichi
5
1.3k
iOS機能開発のAI環境と起きた変化
ryunakayama
0
170
3分でわかるatama plusのQA/about atama plus QA
atamaplus
0
120
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
320
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
150
ふりがな Deep Dive try! Swift Tokyo 2026
watura
0
140
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
110
Navigating Weather and Climate Data
rabernat
0
160
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
250
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
250
New Earth Scene 8
popppiees
3
2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
140
Building Applications with DynamoDB
mza
96
7k
What does AI have to do with Human Rights?
axbom
PRO
1
2.1k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
310
How Software Deployment tools have changed in the past 20 years
geshan
0
33k
Abbi's Birthday
coloredviolet
2
6.5k
Transcript
5ZQF4DSJQUΛৼΓճͤʂ VIZP )BSBKVLVUT
֓ཁ 5ZQF4DSJQUʹৼΓճ͞Ε͍ͯ·ͤΜ͔ʁ ʮܕΑ͔͘Βͳ͍͚ͲͱΓ͋͑ͣίϯύΠϧ௨͔ͬͨΒ0,ʯ ʮ5ZQF4DSJQU͕͋ΔԸܙΛ͋·Γײ͡ͳ͍ʯ ʮϩδοΫతʹOVMM͕དྷͳ͍ॴͳͷʹܕʹOVMM͕͍ͬͯΔʯ ʮؔͷฦΓ͕BOZͰίϯύΠϧΤϥʔʹ ͳΒͳ͍ͷͰؾʹ͠ͳ͍ʯ
֓ཁ 5ZQF4DSJQUΛ͍͜ͳ͢ஈ֊εςοϓΞοϓ͠Α͏ 5ZQF4DSJQUॳֶऀɾॳΊͯϓϩμΫγϣϯ͚5ZQF4DSJQU Λॻ͘ਓͳͲʹଃΔτʔΫ
ܕγεςϜͷׂͱత
ܕγεςϜͷׂʢҰൠʣ ܕݕࠪ ೖྗࢧԉ ίʔυੜ ਖ਼͕͠͞ূ໌Ͱ͖ͳ͍ϓϩάϥϜʹରͯ͠ ίϯύΠϧΤϥʔΛग़ͯ͘͠ΕΔ ܕใΛͱʹೖྗิͳͲΛఏڙͯ͘͠ΕΔ ܕใΛͱʹίϯύΠϧޙͷϝϞϦϨΠΞτ ͳͲ͕ܾ·Δ ʢi64ϏοτΈ͍ͨͳʣ
ܕγεςϜͷతʢҰൠʣ ܕݕࠪ ೖྗࢧԉ ίʔυੜ ਖ਼͕͠͞ূ໌Ͱ͖ͳ͍ϓϩάϥϜʹରͯ͠ ίϯύΠϧΤϥʔΛग़ͯ͘͠ΕΔ ϓϩάϥϜͷʢ͋Δछͷʣਖ਼͠͞Λอূ͢ΔͨΊʹར༻ ܕใΛͱʹೖྗิͳͲΛఏڙͯ͘͠ΕΔ ։ൃޮͷ্ͷͨΊʹར༻ ܕใΛͱʹίϯύΠϧޙͷϝϞϦϨΠΞτͳͲ
͕ܾ·Δ ͦͦίʔυΛίϯύΠϧͯ͠ಈ͔ͨ͢Ίʹඞཁ ʢ࣮ࡍʹEZOBNJDUZQFʹର͢ΔCPYJOHͱ͔͋Δ͕ʜʜʣ
ܕγεςϜͷతʢҰൠʣ ίʔυੜ ܕใΛͱʹίϯύΠϧޙͷϝϞϦϨΠΞτͳͲ ͕ܾ·Δ ͦͦίʔυΛίϯύΠϧͯ͠ಈ͔ͨ͢Ίʹඞཁ ʢ࣮ࡍʹEZOBNJDUZQFʹର͢ΔCPYJOHͱ͔͋Δ͕ʜʜʣ ίʔυੜʹܕ͕ඞཁͳݴޠͰͪΌΜͱܕΛ͚ͳ͍ͱ ϓϩάϥϜ͕ಈ͔ͳ͍ ίϯύΠϧΛ௨͢͜ͱ͕ͻͱͭͷΰʔϧʹͳΔ
Ұํɺ5ZQF4DSJQUͰ ܕݕࠪ ೖྗࢧԉ ίʔυੜ ਖ਼͕͠͞ূ໌Ͱ͖ͳ͍ϓϩάϥϜʹରͯ͠ ίϯύΠϧΤϥʔΛग़ͯ͘͠ΕΔ ϓϩάϥϜͷʢ͋Δछͷʣਖ਼͠͞Λอূ͢ΔͨΊʹར༻ ܕใΛͱʹೖྗิͳͲΛఏڙͯ͘͠ΕΔ ։ൃޮͷ্ͷͨΊʹར༻ 5ZQF4DSJQUͰ+BWB4DSJQUͷมʢτϥϯεύΠϧʣ
ʹܕใΛ༻͍ͳ͍ ʢ͔ͩΒ#BCFMͰมͰ͖Δʣ
Ұํɺ5ZQF4DSJQUͰ ίʔυੜ 5ZQF4DSJQUͰ+BWB4DSJQUͷมʢτϥϯεύΠϧʣ ʹܕใΛ༻͍ͳ͍ ʢ͔ͩΒ#BCFMͰมͰ͖Δʣ ʮಈ͚͍͍ʯͱ͍͏ߟ͑ํͩͱͲ͜·ͰམͪΔ͜ͱ͕Ͱ͖Δ ʢ࠷ѱશ෦BOZͰಈ͘ʣ
Ұํɺ5ZQF4DSJQUͰ ܕݕࠪ ೖྗࢧԉ ਖ਼͕͠͞ূ໌Ͱ͖ͳ͍ϓϩάϥϜʹରͯ͠ ίϯύΠϧΤϥʔΛग़ͯ͘͠ΕΔ ϓϩάϥϜͷʢ͋Δछͷʣਖ਼͠͞Λอূ͢ΔͨΊʹར༻ ܕใΛͱʹೖྗิͳͲΛఏڙͯ͘͠ΕΔ ։ൃޮͷ্ͷͨΊʹར༻ ϓϩάϥϜͷਖ਼͠͞Λ্͢Δͱ͍͏తҙ͕ࣝ 5ZQF4DSJQUΛ͏্Ͱॏཁ
5ZQF4DSJQUͰܕγεςϜΛ׆༻͢Δ ϓϩάϥϜͷਖ਼͠͞Λ্͢Δͱ͍͏తҙ͕ࣝ 5ZQF4DSJQUΛ͏্Ͱॏཁ ඞཁ࠷ݶͷܕ͚ͩॻ͘ͷͰͳ͘ɺೳಈతʹܕΛ׆༻͢Δ ͜ͱͰ5ZQF4DSJQUͷྗΛҾ͖ग़͢͜ͱ͕Ͱ͖Δ
5ZQF4DSJQUͰܕγεςϜΛ׆༻͢Δ 2ೳಈతʹܕΛ׆༻͢ΔͨΊʹඞཁͳͷʁ
5ZQF4DSJQUͰܕγεςϜΛ׆༻͢Δ 2ೳಈతʹܕΛ׆༻͢ΔͨΊʹඞཁͳͷʁ "Δؾͱ୳ڀ৺ͱࣝ
ܕΛ׆༻͢ΔͨΊʹඞཁͳ Δؾͱ୳ڀ৺ͱࣝ
ྫTUSJDU/VMM$IFDLTΛΕ͍ͯͨʂ // TypeScript + React ͷྫ // string ܕͷεςʔτͳͷʹॳظΛnullʹ͍ͯ͠Δʂ const
[name, setName] = useState<string>(null);
ྫTUSJDU/VMM$IFDLTΛΕ͍ͯͨʂ // TypeScript + React ͷྫ // string ܕͷεςʔτͳͷʹॳظΛnullʹ͍ͯ͠Δʂ const
[name, setName] = useState<string>(null); TUSJDUUSVFʹ͠ͳ͍ͱίϯύΠϧ͕௨ͬͯ͠·͏ มOBNFTUSJOHܕͳͷʹOVMM͕ೖ͍ͬͯΔঢ়ଶʹͳΔ ίʔυͷ҆શੑ͕͍ঢ়ଶ ˒ ίϯύΠϥΦϓγϣϯͳΔ͘ݫͯ͘͠͠5ZQF4DSJQUͷԸܙΛΑΓଟ͘ड͚Α͏ʂ
ࣝͰΛղܾ͢ΔγφϦΦ // TypeScript + React ͷྫ // string ܕͷεςʔτͳͷʹॳظΛnullʹ͍ͯ͠Δʂ const
[name, setName] = useState<string>(null); 5ZQF4DSJQUOVMM҆શੑΛඋ͑ͨݴޠͰ͋Δͱ͍͏ࣝΛ͍࣋ͬͯΔ ࠓճOVMM҆શੑ͕ಇ͍͍ͯͳ͍͜ͱʹٙΛ๊͘ TUSJDU/VMM$IFDLT͕ແޮʹͳ͍ͬͯΔ͜ͱʹؾͮ͘
Δؾͱ୳ڀ৺ͰΛղܾ͢ΔγφϦΦ // TypeScript + React ͷྫ // string ܕͷεςʔτͳͷʹॳظΛnullʹ͍ͯ͠Δʂ const
[name, setName] = useState<string>(null); TUSJOHܕͳͷʹOVMMͷՄೳੑ͕͋Δͱ͔͓͔͍͠ʂ ͬͱ҆શੑΛߴΊΔΓํ͕͋ΔͷͰʁʢΔؾʣ άάΔʢ୳ڀ৺ʣ TUSJDU/VMM$IFDLT͕ແޮʹͳ͍ͬͯΔ͜ͱʹؾͮ͘
5ZQF4DSJQUΛ͍͜ͳͨ͢Ίͷͭͷಓے ᶃ ͱʹ͔ࣝ͘Λ͚ͭͯϕετϓϥΫςΟεΛ࣮ફ͢Δ ᶄ ৗʹݱঢ়ʹٙΛ࣋ͪ͞Βʹ༏ΕͨΓํΛ୳ٻ͢Δ
5ZQF4DSJQUΛ͍͜ͳͨ͢Ίͷͭͷಓے ᶃ ͱʹ͔ࣝ͘Λ͚ͭͯϕετϓϥΫςΟεΛ࣮ફ͢Δ ᶄ ৗʹݱঢ়ʹٙΛ࣋ͪ͞Βʹ༏ΕͨΓํΛ୳ٻ͢Δ ͓͢͢Ί Δؾ͕͋Ε͕ࣝͳͯ͘Ͱ͖Δ lಈ͘z͜ͱ͕ελʔτͳ5ZQF4DSJQUͱ૬ੑ͕ྑ͍Γํ ݶք·Ͱ౸ୡ͢ΕᶃʹҠߦͰ͖Δ
ྫλϒΛΓସ͑Δͭ // TypeScript + React ͷྫ const [tab, setTab] =
useState<string>(“home”);
ྫλϒΛΓସ͑Δͭ // TypeScript + React ͷྫ const [tab, setTab] =
useState<string>(“home”); // λϒΓସ͑ setTab(“home”); setTab(“search”); // ίϯςϯπΛදࣔ switch (tab) { case “home”: return <HomeTab />; case “search”: return <SearchTab />; default: // ൃੜ͠ͳ͍ return null; }
ྫλϒΛΓସ͑Δͭ // TypeScript + React ͷྫ const [tab, setTab] =
useState<string>(“home”); // λϒΓସ͑ setTab(“home”); setTab(“search”); ϛε͍͢͠ setTab(“serach”); ൃੜ͠ͳ͍ذΛॻ͍͍ͯΔ // ίϯςϯπΛදࣔ switch (tab) { case “home”: return <HomeTab />; case “search”: return <SearchTab />; default: // ൃੜ͠ͳ͍ return null; }
5ZQF4DSJQU༻࣌ʹ͓͢͢Ίͷߟ͑ํ ʮਓ͕ؒؾΛ͚ͭͳ͚ΕͳΒͳ͍ʯ ͱ͍͏໘ʹग़ձͬͨΒٙʹࢥ͏ 5ZQF4DSJQUʹνΣοΫͯ͠Β͑ͳ͍͔ߟ͑Δ ͪΖΜ5ZQF4DSJQUʹݶք͋ΔͷͰແཧͳ͜ͱ͋Δ͕ɺ ͦΕͰߟ͑Δ͜ͱͰ5ZQF4DSJQUͷྗ͕͖·͢ Ϣχοτςετͷํ͕ద͍ͯ͠Δ߹͋Δ͕ɺͦΕΛݟ͚Δ ͷ5ZQF4DSJQUྗͷ͏ͪͰ͢
ྫλϒΛΓସ͑Δͭʢղܾฤʣ type Tab = “home” | “search”; const [tab, setTab]
= useState<Tab>(“home”); // λϒΓସ͑ setTab(“home”); setTab(“search”); // ίϯςϯπΛදࣔ switch (tab) { case “home”: return <HomeTab />; case “search”: return <SearchTab />; // default: // // ൃੜ͠ͳ͍ // return null; }
ྫλϒΛΓସ͑Δͭʢղܾฤʣ type Tab = “home” | “search”; const [tab, setTab]
= useState<Tab>(“home”); // λϒΓସ͑ setTab(“home”); setTab(“search”); UZQPίϯύΠϧΤϥʔʹʂ setTab(“serach”); ൃੜ͠ͳ͍ذॻ͘ඞཁ͕ͳ͍ // ίϯςϯπΛදࣔ switch (tab) { case “home”: return <HomeTab />; case “search”: return <SearchTab />; // default: // // ൃੜ͠ͳ͍ // return null; }
ίʔυʹҙਤΛࠐΊΑ͏
ྑ͍ίʔυҙਤ͕Θ͔Δ Ұൠ ྑ͍ίʔυಡΊҙਤ͕Θ͔Δ ίϝϯτίʔυຊମ͔ΒಡΈऔΕͳ͍ҙਤΛ ิ͏ͷͰ͋Δ ͨͩಈ͚ͩ͘ͷίʔυΑΓɺଞͷਓ͕ಡΜͰ ҙਤΛཧղ͍͢͠ίʔυΛॻ͖͘
ίʔυ͔ΒಡΈऔΒΕΔҙਤͷྫ const [tab, setTab] = useState<string>(“home”); // ίϯςϯπΛදࣔ switch (tab)
{ case “home”: return <HomeTab />; case “search”: return <SearchTab />; default: return null; } TUSJOHͳͷͰ͋ΒΏΔจࣈྻ Λड͚ೖΕΔTUBUFͰ͋Δ IPNF TFBSDIҎ֎Կදࣔ ͠ͳ͍ͱ͍͏༷Ͱ͋Δ
࣮ࡍͷҙਤ const [tab, setTab] = useState<string>(“home”); // ίϯςϯπΛදࣔ switch (tab)
{ case “home”: return <HomeTab />; case “search”: return <SearchTab />; default: return null; } TUSJOHͳͷͰ͋ΒΏΔจࣈྻ Λड͚ೖΕΔTUBUFͰ͋Δ IPNF TFBSDIҎ֎Կදࣔ ͠ͳ͍ͱ͍͏༷Ͱ͋Δ ಛఆͷจࣈྻ͔͠ೖΒͳ͍ ͚ͲTUSJOHͱॻ͍͍ͯΔ ࣮ࡍʹൃੜ͠ͳ͍έʔε͚ͩͲԿ͔ฦ͞ͳ ͍ͱίϯύΠϧΤϥʔʹͳΔͷͰॻ͍͍ͯΔ
࣮ࡍͷҙਤ const [tab, setTab] = useState<string>(“home”); // ίϯςϯπΛදࣔ switch (tab)
{ case “home”: return <HomeTab />; case “search”: return <SearchTab />; default: // ൃੜ͠ͳ͍ return null; } ίʔυ͔ΒಡΈऔΕͳ͍ҙਤΛ ิ͏ίϝϯτ
վྑ͞Εͨίʔυ͔ΒΘΔҙਤ type Tab = “home” | “search”; const [tab, setTab]
= useState<Tab>(“home”); // ίϯςϯπΛදࣔ switch (tab) { case “home”: return <HomeTab />; case “search”: return <SearchTab />; } ಛఆͷจࣈྻ͔͠ड͚͚ ͳ͍͜ͱ͕໌ࣔ͞Ε͍ͯΔ EFGBVMU͕ແ͍͜ͱͰ ཏੑΛΞϐʔϧ ʢEFGBVMU͕ແ͍ͷʹίϯύΠϧΤϥʔ͕ग़ͳ͍͜ͱ͔ΒܕͰཏੑ͕อূ͞Ε͍ͯΔͱཧղͰ͖Δʣ
ྑ͍5ZQF4DSJQUίʔυͱ ࣮ࡍͷҙਤͱίʔυ͔ΒಡΈऔΒΕΔҙਤ͕ Ұக͍ͯ͠Δίʔυ औΓಘΔΛਖ਼֬ʹهड़ͨ͠ܕΛ͏ ʢstringͰͳ͘TabͳͲʣ ࠷େݶMFUͰͳ͘DPOTUΛ͏ SFBEPOMZΛͳΔ͚͘Δ
ؔͷฦΓͷܕΛ໌ه͖͢໘Ͱ໌ه͢Δ ͳͲͳͲʜ
ྫແ͍͔͠Εͳ͍σʔλ type Session = { userId: string | null; userName:
string | null; userRole: “ADMIN” | “MEMBER” | null; // … }; ͋Γ͕ͪͳσʔλߏɿ ϩάΠϯ͍ͯͨ͠ΒVTFS*E VTFS/BNF VTFS3PMF͕શ෦ଘࡏ͢Δ
ྫແ͍͔͠Εͳ͍σʔλ // ϩάΠϯલ { userId: null, userName: null, userRole: null,
} ͋Γ͕ͪͳσʔλߏɿ ϩάΠϯ͍ͯͨ͠ΒVTFS*E VTFS/BNF VTFS3PMF͕શ෦ଘࡏ͢Δ // ϩάΠϯޙ { userId: “xxxxxxxx”, userName: “uhyo”, userRole: “MEMBER”, }
ྫແ͍͔͠Εͳ͍σʔλ // ϩάΠϯલ { userId: null, userName: null, userRole: null,
} ͋Γ͕ͪͳσʔλߏɿ ϩάΠϯ͍ͯͨ͠ΒVTFS*E VTFS/BNF VTFS3PMF͕શ෦ଘࡏ͢Δ // ϩάΠϯޙ { userId: “xxxxxxxx”, userName: “uhyo”, userRole: “MEMBER”, } " / 5 *1" 5 5 &3 /
ྫແ͍͔͠Εͳ͍σʔλ // ͜ΕԿʁ { userId: null, userName: “uhyo”, userRole: null,
} ɿ ͜ͷΑ͏ͳσʔλͷଘࡏΛڐͯ͠͠·͏ ʢຊདྷͷҙਤͱίʔυ͔ΒΘΔҙਤͷဃʣ
ྫແ͍͔͠Εͳ͍σʔλʢղܾฤʣ type Session = { user: { id: string; name:
string; role: “ADMIN” | “MEMBER”; } | null; }; ਖ਼͍͠σʔλߏɿ JE OBNF SPMFશ෦ଘࡏ͢Δ͔શ෦ଘࡏ͠ͳ͍͔ͷ
ྫͷϙΠϯτ ϙΠϯτɿ ϢχΦϯܕϦςϥϧܕΛ͏͜ͱͰຊདྷͷҙਤʹ͔ͳΓ͍ۙܕΛ දݱՄೳ ˒ ʮ%JTDSJNJOBUFE6OJPOʯΛ·ͩΒͳ͍ਓཁνΣοΫʂ ݕࡧͯ͠ΈΑ͏
ͳΔ͘5ZQF4DSJQUΛ׆༻͢Δ ί ồ υ ͷ ਖ਼ ͠ ͞ ܕͷਖ਼͠͞ ʢ5ZQF4DSJQU͕ܕνΣοΫ
ͯ͘͠ΕΔʣ ϩδοΫͷਖ਼͠͞ ʢਓ͕ؒؤுͬͯอূɾ ςετΛॻ͘ʣ ܕ͕Χόʔ͢ΔྖҬΛ ૿ͦ͏
ͳΔ͘5ZQF4DSJQUΛ׆༻͢Δ ί ồ υ ͷ ਖ਼ ͠ ͞ ܕͷਖ਼͠͞ ʢ5ZQF4DSJQU͕ܕνΣοΫ
ͯ͘͠ΕΔʣ ϩδοΫͷਖ਼͠͞ ʢਓ͕ؒؤுͬͯอূɾ ςετΛॻ͘ʣ ͳΔ͘ݫ͍͠ίϯύΠϥΦϓγϣϯʹ͢Δ ҙਤΛਖ਼֬ʹදͨ͠ܕΛॻ͘ͳͲ
ͳΔ͘5ZQF4DSJQUΛ׆༻͢Δ ί ồ υ ͷ ਖ਼ ͠ ͞ ܕͷਖ਼͠͞ ʢ5ZQF4DSJQU͕ܕνΣοΫ
ͯ͘͠ΕΔʣ ϩδοΫͷਖ਼͠͞ ʢਓ͕ؒؤுͬͯอূɾ ςετΛॻ͘ʣ ܕͷ΄͏͕ྑ͍ཧ༝ɿ • ܕγεςϜͷ΄͏͕ཧతഎܠʹ༏Εͯ ͓ΓɺཏతʹνΣοΫͰ͖Δ • ϢχοτςετΑΓܕऍͷ΄͏͕ υΩϡϝϯςʔγϣϯͱͯ͠༏Ε͍ͯΔ ʢҙਤ͕ΘΓ͍͢ʣ • ܕγεςϜͷ΄͏͕։ൃମݧ͕ྑ͍͜ͱ ͕ଟ͍
·ͱΊ
·ͱΊ5ZQF4DSJQUΛৼΓճͨ͢Ίʹ ϓϩάϥϜͷਖ਼͠͞ͷͨΊʹ5ZQF4DSJQUΛ׆༻͢Δ ͱ͍͏తҙࣝΛ࣋ͱ͏ ਓؒͰͳ͘5ZQF4DSJQU͕ؤுΔྖҬΛ૿ͦ͏ ͞Βʹ5ZQF4DSJQUΛ׆༻Ͱ͖ͳ͍͔ৗʹࡧ͠Α͏ 5ZQF4DSJQUॊೈͳݴޠͰ͋ΔͨΊɺΓํʹΑͬͯ҆શੑϨϕϧʹ͕ࠩग़Δ ݴޠͰ͢ɻΑΓߴ͍҆શੑϨϕϧΛࢦͯ͠ྗ͠·͠ΐ͏
͓·͚εϥΠυ'"2 2ݫ͍͠ίϯύΠϥΦϓγϣϯʹ͢Δͱ։ൃޮ͕མͪΔ 2͍͠ܕΛॻ͘ͷ։ൃޮ͕མͪΔ "ؾͷ͍ͤͰ͢ɻ ΦϓγϣϯܕΛ؇ͨ͘͜͠ͱͷπέɺʮෆ۩߹ͷ૿Ճʯ͔ ʮػցͷΘΓʹਓ͕ؒߟ͑Δ͜ͱͷ૿Ճʯͱݴ͏ܗͰݱΕ·͢ɻ લऀຊసͩ͠ɺޙऀͬͱ։ൃޮ͕མ͍ͪͯ·͢ɻ