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
28
9.7k
TypeScriptを振り回せ!
2021-12-17 Harajuku.ts Meetup #1
uhyo
December 17, 2021
Tweet
Share
More Decks by uhyo
See All by uhyo
AI時代、“平均値”ではいられない
uhyo
7
1.7k
意外と難しいGraphQLのスカラー型
uhyo
5
800
RSCの時代にReactとフレームワークの境界を探る
uhyo
13
4.1k
知られざるprops命名の慣習 アクション編
uhyo
12
3.2k
libsyncrpcってなに?
uhyo
0
700
Next.jsと状態管理のプラクティス
uhyo
7
14k
10ヶ月かけてstyled-components v4からv5にアップデートした話
uhyo
5
660
更新系と状態
uhyo
9
3.8k
React 19アップデートのために必要なこと
uhyo
8
2.8k
Other Decks in Programming
See All in Programming
CSC305 Lecture 09
javiergs
PRO
0
300
AI駆動で0→1をやって見えた光と伸びしろ
passion0102
1
740
なぜあの開発者はDevRelに伴走し続けるのか / Why Does That Developer Keep Running Alongside DevRel?
nrslib
3
420
エンジニアインターン「Treasure」とHonoの2年、そして未来へ / Our Journey with Hono Two Years at Treasure and Beyond
carta_engineering
0
400
アメ車でサンノゼを走ってきたよ!
s_shimotori
0
230
CSC509 Lecture 07
javiergs
PRO
0
240
ソフトウェア設計の実践的な考え方
masuda220
PRO
4
630
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
390
Flutterで分数(Fraction)を表示する方法
koukimiura
0
140
Reactive Thinking with Signals and the Resource API
manfredsteyer
PRO
0
100
CSC509 Lecture 06
javiergs
PRO
0
260
デミカツ切り抜きで面倒くさいことはPythonにやらせよう
aokswork3
0
260
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
79
6k
Producing Creativity
orderedlist
PRO
347
40k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
630
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
31
2.7k
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
10
880
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
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͍͠ܕΛॻ͘ͷ։ൃޮ͕མͪΔ "ؾͷ͍ͤͰ͢ɻ ΦϓγϣϯܕΛ؇ͨ͘͜͠ͱͷπέɺʮෆ۩߹ͷ૿Ճʯ͔ ʮػցͷΘΓʹਓ͕ؒߟ͑Δ͜ͱͷ૿Ճʯͱݴ͏ܗͰݱΕ·͢ɻ લऀຊసͩ͠ɺޙऀͬͱ։ൃޮ͕མ͍ͪͯ·͢ɻ