Slide 1

Slide 1 text

ؔ਺ܕϓϩάϥϛϯάͱܕγεςϜͷϝϯλϧϞσϧ גࣜձࣾ Ұٳ ҏ౻ ௚໵

Slide 2

Slide 2 text

𝑓 ͱ͋Δू߹4 ·ͨଞͷू߹4 ͋Δू߹ʹଐ͢Δ஋Λɺؔ਺ GʹΑΓɺ·ͨଞͷू߹ʹଐ͢Δ஋ʹࣸ͢ ͜Ε͕ͲΜͳू߹͔هड़͢Δͷ͕ʮܕʯ

Slide 3

Slide 3 text

ͳͥ͜ͷ࿩ • ࡢࠓͷϓϩάϥϛϯάݴޠʹ͓͚ΔʮܕʯΛͲ͏ଊ͑Δ͔ – ͔͍͘͏ࢲ΋ɺ೥୅ࠒ͸ʮܕ෇͚ΊΜͲ͍͘͞ͳʔʯͱࢥ͍ͬͯͨ – ࠷ۙ͸ɺ౰࣌ͱ͸શ͘ҟͳΔϝϯλϧϞσϧΛ͍࣋ͬͯΔ • ϓϩάϥϛϯάݴޠɺϑϨʔϜϫʔΫʹ͓͚Δؔ਺ܕϓϩάϥϛϯά͔ΒͷӨڹ • )BTLFMMΛझຯͰॻ͘Α͏ʹͳͬͯɺϝϯλϧϞσϧ͕ߋ৽͞Εͨ – ੩తܕ෇͚ɺܕਪ࿦ɺؔ਺ܕϓϩάϥϛϯάɺจ຺ܭࢉʜ – ͳ͓ࠓ೔ͷ࿩͸ )BTLFMMಛ༗ͷ࿩Ͱ͸͋Γ·ͤΜɻͦͷͨΊओʹ 5ZQF4DSJQUͷྫ΋ަ͑ͯ࿩͠·͢

Slide 4

Slide 4 text

ϓϩάϥϛϯάͷʮϝϯλϧϞσϧʯ ࠓ೔ͷ࿩Λ໘ന͍ͱࢥ͍͚ͬͯͨͩͨΒɺͥͻҎԼͷจষʹ΋໨Λ௨ͯ͠ΈͯԼ͍͞ • ͸͡Ίʹ )BTLFMMr 2JJUB IUUQTRJJUBDPNSVJDDJUFNTEBCBDDGE ݱࡏɺϓϩάϥϛϯάͱ͍͏ྖҬ͸·ͩڭҭ͕੔͍ͬͯͳ͍ҝɺଟ͘ͷϢʔβ͕ಠྗ͔ͭ௕͍࣌ؒΛ͔͚ͯɺϓϩά ϥϛϯάΛʮ࢖͑ΔʯΑ͏ʹͯ͠དྷ·ͨ͠ɻͦͷͨΊͦΕͧΕ͕࣋ͭϝϯλϧϞσϧͷଟ͘͸ॳΊʹ৮ͬͨݴޠ΍ɺͦ ͷ࣍ʹ৮ͬͨݴޠ͋ͨΓʹେ͖͘ґଘ͍ͯ͠Δ͜ͱͰ͠ΐ͏ɻ ๻Β͸ϓϩάϥϛϯάͱ͍͏஌త׆ಈʹؔΘ͍ͬͯ·͕͢ɺͦͷϝϯλϧϞσϧͷߏங΍मਖ਼ͱ͍ͬͨաఔΛͣͬͱ ଓ͚Δඞཁ͕͋Γ·͢ɻ

Slide 5

Slide 5 text

΋ͱ͍ɺઌͷਤ͸ԿΛݴ͍ͬͯΔ͔ • ϓϩάϥϜΛʮܭࢉػ΁ͷ໋ྩʯͰ͸ͳ͘ʮؔ਺Λద༻ͯ͠஋ΛಘΔܭࢉʯͷఆٛͱଊ͑Δ • ؔ਺ G͸ɺ஋Λࣸ͢΋ͷ • ͲΜͳू߹͔ΒͲΜͳू߹ʹࣸ͞ΕΔ͔ɻͦͷू߹ΛܕͰදݱ͢Δ • ू߹ͷදݱɺͭ·ΓʮܕͱܕΛ૊Έ߹Θͤͨߏ଄Խʯ͕ΑΓྑ͘Ͱ͖Ε͹ɺϓϩάϥϜ͕ݎ࿚ʹͳΔ

Slide 6

Slide 6 text

஫ҙ • ؔ਺ܕϓϩάϥϛϯά͕ଞͷ͋ΒΏΔύϥμΠϜΑΓ΋༏Ε͍ͯΔɺͱ͍͏࿩Ͱ͸͋Γ·ͤΜ • ಛఆͷύϥμΠϜ͸μϝɺ͜Ε͸͔Β͸ؔ਺ܕɺΈ͍ͨͳ࿩Ͱ͸͋Γ·ͤΜ • ؔ਺ܕϓϩάϥϛϯάͷݟ஍͔Β͸ؔ਺΍ܕΛ͜Μͳ;͏ʹଊ͑Δ͜ͱ΋Ͱ͖Δ • ϓϩάϥϛϯάͷ͞·͟·ͳཁૉΛɺ໋ྩܕͱ͸ҟͳΔղऍ͕Ͱ͖ͯ໘ന͍ɻ໾ʹཱͭ ͔΋ ͱ͍͏࿩Ͱ͢

Slide 7

Slide 7 text

3FBDU • ؔ਺ܕϓϩάϥϛϯάͷΤοηϯεΛɺϑϩϯτΤϯυ։ൃʹద༻ɻ޿͘ීٴͨ͠ • %0.ʹঢ়ଶΛຒΊࠐΜͰ͍Δͱঢ়ଶ؅ཧ͕ෳࡶʹͳΔɻΞϓϦέʔγϣϯͷঢ়ଶΛʮॻ͖׵͑Δ΋ ͷʯͰ͸ͳ͘ʮؔ਺ʹΑΔঢ়ଶભҠɻෆมͳ΋ͷʯͱѻͬͨ

Slide 8

Slide 8 text

҉໧తͳঢ়ଶมԽ͕ݮΓɺϓϨθϯςʔγϣϯΛએݴతʹهड़Ͱ͖ΔΑ͏ʹͳͬͨ import { useState } from 'react'; export default function MyApp() { const [count, setCount] = useState(0); function handleClick() { setCount(count + 1); } return (

Counters that update together

); +BWB4DSJQU

Slide 9

Slide 9 text

&MNΞʔΩςΫνϟ https://guide.elm-lang.jp/architecture/

Slide 10

Slide 10 text

update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of ToggleLike -> ( { model | photo = Maybe.map toggleLike model.photo }, Cmd.none ) UpdateComment comment -> ( { model | photo = Maybe.map (updateComment comment) model.photo }, Cmd.none ) SaveComment -> ( { model | photo = Maybe.map saveNewComment model.photo }, Cmd.none ) LoadFeed (Ok photo) -> ( { model | photo = Just photo }, Cmd.none ) LoadFeed (Err _) -> ( model, Cmd.none ) viewLikeButton : Photo -> Html Msg viewLikeButton model = let buttonClass = if model.liked then ... div [ class "like-button" ] [ i [ class "fa fa-2x", class buttonClass, onClick ToggleLike ] [] ] &MN 7JFX͸ .PEFMΛඳըɻ Ϣʔβʔૢ࡞ʹԠͯ͡Πϕ ϯτΛૹΔͱŋŋŋ &MNϥϯλΠϜ͕ VQEBUFؔ਺ ΛݺͿɻؔ਺ʹ͸ΠϕϯτʹԠ ͨ͡Ϟσϧͷঢ়ଶભҠΛؔ਺Ͱ هड़͢Δ &MN

Slide 11

Slide 11 text

ঢ়ଶભҠͷؔ਺ ֎քͱ΍Γͱ Γ *0 イベント コマンド

Slide 12

Slide 12 text

ঢ়ଶͷߋ৽Λɺॻ͖׵͑Ͱ͸ͳ͘ɺ͋Δঢ়ଶ͔Β͋Δঢ়ଶ΁ͷભҠʹ͢Δͱྑ͍uuu • Πϛϡʔλϒϧʹ͢Δͱྑ͍uuu • એݴతʹ͢Δͱྑ͍uuu • ؔ਺ܕϓϩάϥϛϯά͸ྑ͍uuu 🤔

Slide 13

Slide 13 text

ʮؔ਺ʯΛͲ͏ଊ͑Δ

Slide 14

Slide 14 text

𝑠 = 1 + 2 + 3 + … + n • Ͳ͏ॻ͘  ࠷ۙݟ͔͚ͨ – GPSจ खଓతɺ໋ྩܕ – ౳ࠩ਺ྻͷެࣜ – ࠶ؼɺ৞ΈࠐΈ એݴతɺؔ਺ܕ

Slide 15

Slide 15 text

GPSจͰॻ͘ • ஝͑ΒΕ͍ͯΔ஋Λॻ͖׵͑Δ͜ͱΛ܁Γฦͯ͠ɺͦͷ஋͔Β݁ՌΛಘΔ • ݱࡏͷίϯϐϡʔλɾΞʔΩςΫνϟͷܭࢉϞσϧʹ͍ۙ – ϝϞϦ͔ΒϨδελʹσʔλΛϩʔυ͠ɺԋࢉΛ࣮ߦͯ͠ɺϝϞϦʹॻ͖ग़͢ int total = 0; for (int i = 1; i <= n; i++) { total += i; } ͱ͜ΖͰɺզʑ͸ίϯϐϡʔλΛ࢖ͬͯܭࢉΛ͍ͯ͠Δ͕ɺϓϩάϥϛϯά্ͷܭࢉϞσϧ·ͰͦΕʹ฿͏ ͜ͱ͸ඞਢͳͷ͔ 

Slide 16

Slide 16 text

Ҿ਺ʹؔ਺Λద༻͢Δ͜ͱΛ࠶ؼ ؔ਺ݺͼग़͠ Ͱ܁Γฦ͠ɺ஋ΛಘΔ sum [] = 0 sum (x : xs) = x + sum xs -- 関数 sum を再帰的に呼び (+) 関数を適用 )BTLFMM const sum = (ns: number[]): number => { if (ns.length == 0) return 0 const [x, ...xs] = ns return x + sum(xs) } 5ZQF4DSJQU

Slide 17

Slide 17 text

஋Λॻ͖׵͑ΔͷͰ͸ͳ͘ɺؔ਺ͷ໭Γ஋ʹؔ਺Λ࠶ؼతʹద༻ͯ͠஋ΛಘΔ f a b = a + b main = do print $ f 10 (f 9 (f 8 (f 7 (f 6 (f 5 (f 4 (f 3 (f 1 2)))))))) )BTLFMM

Slide 18

Slide 18 text

ʮ໭Γ஋ʹ܁Γฦؔ͠਺Λద༻͢ΔʯΛؔ਺ʹͨ͠ͷ͕ GPME΍ SFEVDF • ؔ਺Λద༻͢Δ͜ͱͰ஋ΛಘΔ͜ͱʹΑͬͯܭࢉΛ੒͢ͷ͕ɺؔ਺ܕϓϩάϥϛϯάͷߟ͑ํ • ࠜఈʹ͸ϥϜμܭࢉ uuuࠓ೔͸ͦͷ࿩͸͠ͳ͍ let s = foldl (+) 0 [1 .. n] )BTLFMM let s = [1, 2, 3, 4, 5].reduce((acc, i) => acc + i, 0)``` let s = [1, 2, 3, 4, 5].reduce((acc, i) => acc + i, 0) 5ZQF4DSJQU

Slide 19

Slide 19 text

จɺࣜ • จ 4UBUFNFOU – GPSจɺ JGจɺQSJOUจ  – ܭࢉػ΁ͷԿ͔͠Βͷಈ࡞໋ྩɺखଓ͖ɻ஋Λฦ͞ͳ͍ • ࣜ &YQSFTTJPO – ʮܭࢉΛ࣮ߦͯ݁͠ՌΛಘΔΑ͏ͳॲཧΛهड़͢ΔͨΊͷจ๏ཁૉʯ 8JLJQFEJB – ඞͣ஋Λฦ͢ – ؔ਺ܕϓϩάϥϛϯάʹ͓͚Δؔ਺͸ࣜ

Slide 20

Slide 20 text

࠶ܝ GPSจͰॻ͘ int total = 0; for (int i = 1; i <= n; i++) { total += i; } • GPSจͱ୅ೖจͰɺ܁Γฦ͠ԋࢉ݁ՌΛॻ͖ࠐΉ ୅ೖ͢Δ ໋ྩΛߦ͍ͬͯΔ • ܭࢉػ΁ͷ໋ྩ uuu໋ྩܕ • จͰܭࢉΛߏ੒͢Δͱɺ໋ྩతʹͳΔ

Slide 21

Slide 21 text

࠶ܝ ࠶ؼతʹؔ਺Λద༻͢Δ • ࣜʹΑΓܭࢉΛએݴ͢Δ • ࣜ͸ඞͣ஋Λ໭͢ɻͦͷ஋ʹ࠶ͼؔ਺Λద༻͢Δ • ࣜͰܭࢉΛߏ੒͢ΔͱɺએݴతʹͳΔ let s = foldl (+) 0 [1 .. n] )BTLFMM let s = [1, 2, 3, 4, 5].reduce((acc, i) => acc + i, 0)``` let s = [1, 2, 3, 4, 5].reduce((acc, i) => acc + i, 0) 5ZQF4DSJQU

Slide 22

Slide 22 text

ؔ਺ద༻ʹΑͬͯ஋ΛಘΔ ؔ਺ʹΑͬͯ஋Λม׵͢Δɾࣸ͢ ࣜ͸ඞͣ໭Γ஋Λฦ͢ɻҾ਺ͷ஋͔Β໭Γ஋ʹ஋Λม׵ͨ͠ɺࣸͨ͠ɺͱݟΔ͜ͱ΋Ͱ͖Δ 𝑓

Slide 23

Slide 23 text

໋ྩܕͱؔ਺ܕ • ໋ྩܕ uuu໋ྩʹΑͬͯɺܭࢉػʹɺঢ়ଶͦͷ΋ͷΛมԽͤ͞Δ • ؔ਺ܕ uuuؔ਺Λద༻͢Δ͜ͱͰ஋ΛಘΔɾ஋Λࣸ͢ ؔ਺ܕϓϩάϥϛϯά͸ίϯϐϡʔλͰ͸ͳ͘ܭࢉʹয఺Λ౰ͯΔ ܭࢉʹয఺Λ౰ͯΔʹ͸ɺࣜʹΑͬͯܭࢉΛߏ੒͢Δ ࣜʹΑͬͯܭࢉΛʮએݴʯ͢ΔͷͰɺએݴతʹͳΔ

Slide 24

Slide 24 text

վΊͯɺԿΛݴͬͯΔͷ͔ • ϓϩάϥϜΛʮܭࢉػ΁ͷ໋ྩʯͰ͸ͳ͘ʮؔ਺Λద༻ͯ͠஋ΛಘΔܭࢉʯͷఆٛͱଊ͑Δ • ؔ਺ G͸ɺ஋Λࣸ͢΋ͷ • ͲΜͳू߹͔ΒͲΜͳू߹ʹࣸ͞ΕΔ͔ɻͦͷू߹ΛܕͰදݱ͢Δ • ू߹ͷදݱɺͭ·ΓʮܕͱܕΛ૊Έ߹Θͤͨߏ଄Խʯ͕Γྑ͘Ͱ͖Ε͹ɺϓϩάϥϜ͕ݎ࿚ʹͳΔ

Slide 25

Slide 25 text

ؔ਺ʹΑΔঢ়ଶભҠͷදݱ

Slide 26

Slide 26 text

ؔ਺ʹΑΔঢ়ଶભҠͷهड़ ͋Δঢ়ଶ Tʹؔ਺ GΛద༻ͯ͠ɺผͷঢ়ଶ TΛಘΔ // 顧客をアーカイブ状態にする export const archiveCustomer = (customer: Customer): Customer => ({ ...customer, archived: true, })) 5ZQF4DSJQU 𝑠 𝑠′ 𝑓

Slide 27

Slide 27 text

customer.archive() 5ZQF4DSJQU const archived = archiveCustomer(customer) 5ZQF4DSJQU • ໋ྩతʹॻ͘ – ΦϒδΣΫτͷ಺෦ঢ়ଶΛॻ͖׵͑Δ໋ྩΛߦ͏͜ͱͰɺঢ়ଶΛมԽͤ͞Δ – ঢ়ଶͷมԽ͕҉໧త • ؔ਺తʹॻ͘ – Ҿ਺ͷΦϒδΣΫτʹؔ਺Λద༻ͯ͠ɺঢ়ଶભҠޙͷΦϒδΣΫτΛಘΔ – ભҠલͷঢ়ଶ͸ඞͣҾ਺ʹݱΕɺભҠޙͷঢ়ଶ͸໭Γ஋ʹݱΕΔɻঢ়ଶมԽ͕໌ࣔత

Slide 28

Slide 28 text

8FCΞϓϦέʔγϣϯͱ *0 • 8FCΞϓϦέʔγϣϯ։ൃͷଟ͘ͷ෦෼͸ɺίϯϐϡʔλ ֎ք ͱͷ΍ΓͱΓ – σʔλϕʔε͔ΒσʔλΛऔಘͯ͠ *0 – 8FC"1*Λίʔϧͯ͠ *0 – ୺຤ʹग़ྗ͢Δ *0 – *0͸ίϯϐϡʔλ΁ͷ໋ྩͳͷͰɺ໋ྩతʹهड़͢Δͷ͸ࣗવ Ͱ΋ΞϓϦέʔγϣϯ͕େ͖͘ͳͬͯ͘Δͱʜ IO -> ܭࢉ (ۀ຿ϩδοΫɺঢ়ଶભҠ) -> IO ͷਅΜதͷ෦෼͕େ͖͘ɺෳࡶʹͳ͖ͬͯ·ͤΜ͔

Slide 29

Slide 29 text

update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of ToggleLike -> ( { model | photo = Maybe.map toggleLike model.photo }, Cmd.none ) UpdateComment comment -> ( { model | photo = Maybe.map (updateComment comment) model.photo }, Cmd.none ) SaveComment -> ( { model | photo = Maybe.map saveNewComment model.photo }, Cmd.none ) LoadFeed (Ok photo) -> ( { model | photo = Just photo }, Cmd.none ) LoadFeed (Err _) -> ( model, Cmd.none ) ࠶ܝ &MN &MN

Slide 30

Slide 30 text

model -> model' model -> model' model -> model' ΠϕϯτΛܖػʹঢ়ଶ͕ભҠ͢Δ ŋŋŋ ࣌ܥྻʹج͍ͮͨ໌ࣔతͳঢ়ଶભҠ

Slide 31

Slide 31 text

ঢ়ଶભҠͷؔ਺ ϥϯλΠϜ΍ϑ ϨʔϜϫʔΫ イベント コマンド Πϕϯτʹ൐͍ؔ਺Ͱঢ়ଶΛભҠͤͯ͞ɺ͋ͱ͸ϑϨʔϜϫʔΫ΍ϥϯλΠϜʹ೚ͤΔ

Slide 32

Slide 32 text

*0ঢ়ଶભҠ *0 model -> model' *0 JOQVUMPBE *0 PVUQVU *0ͱ੾Γ཭ͤ͹ɺ͜͜Λίϯϐϡʔλ ΁ͷ໋ྩͰ͸ͳ͘ɺʮܭࢉʯͱͯ͠એ ݴ͢Δ͜ͱ΋Ͱ͖Δɻ͜͜ͷঢ়ଶ؅ཧ Λ͍͍ײ͡ʹͰ͖Ε͹

Slide 33

Slide 33 text

https://www.slideshare.net/ScottWlaschin/reinventing-the-transaction-script-ndc-london-2020

Slide 34

Slide 34 text

ΦχΦϯΞʔΩςΫνϟ ͳͲ Ͱಘ͍ͨ͜ͱ • ςελϏϦςΟ͕޲্͢Δ ෦඼ΛೖΕସ͑ՄೳʹͳΔ – ͦΕ͸ͦ͏ɻͰ΋ɺ෭࣍తͳ΋ͷͰ͋ͬͯओ໨తͰ͸ͳ͍ • ۀ຿ϩδοΫΛ *0͔Β੾Γ཭͠ɺܭࢉػ΁ͷ໋ྩͰ͸ͳ͘७ਮͳϩδοΫ ܭࢉ ͱͯ͠ߟ ͑ΒΕΔΑ͏ʹ͍ͨ͠ – ৭ʑͳύϥμΠϜΛద༻Ͱ͖ΔՄೳੑ͕ੜ·ΕΔ • ΦϒδΣΫτࢦ޲Ͱ΋ྑ͍͠ɺखଓܕͰ΋ྑ͍͠ɺؔ਺ܕϓϩάϥϛϯάͰ΋ྑ͍ • ͏ͪɺએݴతʹঢ়ଶ؅ཧ͢Δͷ͸ɺ ݱ࣌఺Ͱ͸ ྑ͍ϓϥΫςΟεͰ͸ͳ͍͔ ˡ ࠓ͜͜

Slide 35

Slide 35 text

3FBDUɺ&MNFUDʜݱ୅ͷϑϩϯτΤϯυ։ൃ • એݴతϓϩάϥϛϯά – ʮ಺෦ঢ়ଶΛॻ͖׵͑ΔʯͷͰ͸ͳ͘ʮঢ়ଶ͔Βঢ়ଶ΁ભҠͤ͞Δɻ࣍ͷঢ়ଶ΁ࣸ͢ʯ – ϑϩϯτΤϯυͷঢ়ଶ؅ཧΛ %0.͔Β෼཭͠ʮঢ়ଶΛॻ͖׵͑Δʯͱ͍͏໋ྩͰ͸ͳ͘ʮঢ়ଶ͕࣍ͷঢ়ଶʹભ Ҡ͢Δʯͱ͍͏ࣜͩͱଊ͑௚ͨ͠ – ঢ়ଶભҠΛએݴతʹهड़͢Δ͜ͱʹΑΓɺ҉໧తͳঢ়ଶΛҙࣝͤͣʹΞϓϦέʔγϣϯΛهड़Ͱ͖ΔΑ͏ʹͳͬ ͨ

Slide 36

Slide 36 text

ͩΜͩΜɺϝϯλϧϞσϧ͕Ξοϓσʔτ͞Ε͖ͯͨͰ͠ΐ͏͔ 𝑓

Slide 37

Slide 37 text

୤ઢ จΛ࢖͏ͱ͔ͦ͜ΒҶͮΔࣜతʹ໋ྩܕʹͳΔ • )BTLFMMͷ forM_ ࣜ ··· for จΈ͍ͨͳ΋ͷ (※࣮ࡍ͸จͰ͸ͳ͘ϢχοτܕΛฦࣜ͢) – ϛϡʔλϒϧͳ഑ྻΛॻ͖׵͑ͨΓɺܭࢉػͱೖग़ྗ͢Δͱ͖ʹ࢖͏ – ܭࢉػ΁ͷ໋ྩతͳࣜͳͷͰ໭Γ஋͕ͳ͍ – ͳ͓ )BTLFMM͔ͩΒͱ໋͍ͬͯྩతʹॻ͚ͳ͍Θ͚Ͱ͸ͳ͍͠ɺ໋ྩతʹهड़͢Δํ͕ྑ͍৔߹΋Α͋͘Δ main = do arr <- newListArray @IOArray (1, 10) [1 .. 10] forM_ [1 .. 10] $ ¥i -> do x <- readArray arr i writeArray arr i (x * 2) forM_ [1 .. 10] $ ¥i -> do readArray arr i >>= print )BTLFMM

Slide 38

Slide 38 text

ಉ͡໨తͷσʔλߏ଄ͷΠϛϡʔλϒϧ൛ɺϛϡʔλϒϧ൛Λ࢖͏ൺֱ main = do [n, m] <- getInts uvs <- replicateM m getTuple let uf0 = newUF (0, n - 1) -- 関数 f により uf を次の状態に遷移させる let (_, xs) = mapAccumL f uf0 uvs where f uf (u, v) = let same = isSame uf u v in if same then (uf, same) else (unite uf u v, same) … -- 状態の表現にイミュータブルなデータ構造 data UnionFind = UnionFind { parent :: IM.IntMap Int, size :: IM.IntMap Int } deriving (Show) )BTLFMM -- 状態の表現にミュータブルな配列 data UnionFind a v = UnionFind (a v v) (IOUArray v Int) )BTLFMM main = do [n, m] <- getInts uvs <- replicateM m getTuple uf <- newUF @IOUArray (0, n - 1) (-1) forM_ uvs $ ¥(u, v) -> do same <- isSame uf u v -- データ構造 uf に作用を起こして内部状態を変える unless same $ do unite uf u ϛϡʔλϒϧͳσʔλߏ଄Λ࢖͏ͱ஋ Λ໭͞ͳ͍ͷͰɺ੍ޚߏ଄΋ؚΊࣗવ ͱ໋ྩܕͷ࣮૷ʹͳΔ ͪͳΈʹࢲ͸ 6OJPO'JOE͸ͪ͜ΒΛ ৗ༻ͯ͠·͢ ؔ਺ͷ໭Γ஋͕࣍ͷঢ়ଶͷσʔλߏ଄ ͳͷͰɺ໭Γ஋ΛҾ͖ճؔ͢਺ܕతͳ ࣮૷ʹͳΔ

Slide 39

Slide 39 text

࠶ܝ ઌͷਤ͸ԿΛݴͬͯΔͷ͔ • ϓϩάϥϜΛʮܭࢉػ΁ͷ໋ྩʯͰ͸ͳ͘ʮؔ਺Λద༻ͯ͠஋ΛಘΔܭࢉʯͷఆٛͱଊ͑Δ • ؔ਺ G͸ɺ஋Λࣸ͢΋ͷ • ͲΜͳू߹͔ΒͲΜͳू߹ʹࣸ͞ΕΔ͔ɻͦͷू߹ΛܕͰදݱ͢Δ • ू߹ͷදݱɺͭ·ΓʮܕͱܕΛ૊Έ߹Θͤͨߏ଄Խʯ͕Γྑ͘Ͱ͖Ε͹ɺϓϩάϥϜ͕ݎ࿚ʹͳΔ

Slide 40

Slide 40 text

ܕΛू߹ΛͱΒ͑Δ

Slide 41

Slide 41 text

ؔ਺͸஋Λม׵͢Δɾࣸ͢΋ͷͱ͍͏ݟํ͕Ͱ͖Δ͜ͱ͕Θ͔ͬͨ ͦΕΛલఏʹɺ࣍͸஋͕ଐ͢ΔྖҬʹ͍ͭͯߟ͑ͯΈ·͢ 𝑓 ͜͜ ೖྗɺҾ਺ ͱʜ ͜͜ ໭Γ஋ɺҾ਺

Slide 42

Slide 42 text

𝑓 ͱ͋Δू߹4 ·ͨଞͷू߹4 ͋Δू߹ʹଐ͢Δ஋Λɺؔ਺ GʹΑΓɺ·ͨଞͷू߹ʹଐ͢Δ஋ʹࣸ͢ ͜Ε͕ͲΜͳू߹͔هड़͢Δͷ͕ʮܕʯ

Slide 43

Slide 43 text

೉͍͜͠ͱ͸ͳ͘ɺීஈॻ͍͍ͯΔܕΛͲ͏ΈΔ ͱ͍͏࿩ • ௿ϨΠϠʔࢹ఺Ͱ͸ʮϏοτྻͷσʔλΛιϑτ΢ΣΞʹͲ͏ղऍͤ͞Δ͔ʯҙຯ෇͚͢Δͷ͕ܕ • ผͷϝϯλϧϞσϧ uuuؔ਺ͷࢹ఺ͰݟΔͱʮܕ͸ू߹ʯͱ΋ଊ͑ΒΕΔ – ʮTUSJOHͷू߹ʹଐ͢Δ஋Λ OVNCFSͷू߹ʹଐ͢Δ஋ʹࣸ͢ʯ – ʮ͜ͷؔ਺ͷఆٛҬ͸ TUSJOHͰɺ஋Ҭ͕ OVNCFSʯ function parseHex(str: string): number { return parseInt(str, 16); } 5ZQF4DSJQU

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

ʮ5ZQF4DSJQUʹ͓͚Δܕͷू߹ੑͱ֊૚ੑʯΑΓҾ༻ https://zenn.dev/estra/articles/typescript-type-set-hierarchy

Slide 46

Slide 46 text

• ʮܕ͸ɺޓ͍ʹؔ࿈͢Δ஋ͷू߹Ͱ͢ʯ ϓϩάϥϛϯά )BTLFMM • ʮܕ UZQF ͋Δ͍͸σʔλܕ EBUBUZQF ͱ͸ɺσʔλ͕ͲͷΑ͏ͳੑ࣭ͷू߹ʹଐ͢Δ ͔Λࣔ͢΋ͷͰ͢ʯ ؔ਺ܕϓϩάϥϛϯά࣮ફೖ໳ • ʮ Մೳͳૢ࡞΍ԋࢉͳͲͷମܥͳͲ͕ ڞ௨͍ͯ͠Δ஋ͷू߹͕ܕͰ͋ΓɺͦΕͧΕͷ஋͸ ෳ਺ͷू߹ ܕ ʹଐ͢͜ͱ͕Ͱ͖Δʯ 5ZQF4DSJQUʹ͓͚Δܕͷू߹ੑͱ֊૚ੑ • ʮܕ͸஋΍ॲཧͷຬͨ͢΂͖ੑ࣭Λڧ͘ҙຯ෇͚͢ΔͨΊʹ࢖͏͜ͱ͕Ͱ͖ɺʮϓϩάϥϜ ͷਖ਼͠͞ʯΛอূ͢ΔͨΊͷॏཁͳϑΝΫλʔͰ͢ʯ

Slide 47

Slide 47 text

ܕ͸ίϯύΠϥͳͲͷιϑτ΢ΣΞ πʔϧ ͕ཧղͰ͖Δ • ஋ͷऔΓ͏ΔൣғΛΑΓݫີʹએݴͰ͖Ε͹ίϯύΠϧஈ֊Ͱ஋͕ͦͷൣғʹऩ·Δ͜ͱ͕อূͰ͖Δ • ͭ·ΓΞϓϦέʔγϣϯΛ࣮ࡍʹಈ࡞ͤ͞ͳͯ͘΋ɺ͋Γ͑ͳ͍ঢ়ଶ͕࡞ΒΕͳ͍͜ͱΛอূͰ͖Δ • ܕ৘ใΛ৭ʑͳπʔϧνΣΠϯ͕ಡΈऔͬͯɺ։ൃऀମݧΛվળ͍ͯ͠Δ TypeScript Origins: The Documentary https://www.youtube.com/watch?v=U6s2pdxebSo

Slide 48

Slide 48 text

ܕΛͲ͏ߟ͑Δ͔ • ιϑτ΢ΣΞ ίϯύΠϥ΍πʔϧνΣΠϯ ʹϓϩάϥϜߏ଄ͷ৘ใΛ༩͑Δ΋ͷ • ؔ਺ GͷఆٛҬͱ஋ҬͷऔΓ͏ΔൣғΛܾΊΔ΋ͷ ʮޙऀͰߟ͑ͯܕΛॻ͍ͨ݁ՌɺલऀʹΑͬͯϓϩάϥϜ͕ݎ࿚ʹͳΓ։ൃऀମݧ΋Α͘ͳΔ΋ͷʯͱ͍ ͏ͷ͕ࢲͷϏϡʔ

Slide 49

Slide 49 text

export function toColor(value: string): Result { return /^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(value) ? ok(value as Color) : err(new ValidationError('⾊の値が不正です。#FFFFFF形式で指定してください')) } 5ZQF4DSJQU ܕ͸ߏ଄Խ͢Δ͜ͱ͕Ͱ͖Δ

Slide 50

Slide 50 text

ܕͱܕΛ૊Έ߹ΘͤΔ uuu࿨ 03 Λ࢖͏

Slide 51

Slide 51 text

୅਺తσʔλܕ • )BTLFMMͳͲͷݴޠͰ͸৽͍͠σʔλߏ଄Λఆٛ͢Δͷʹ୅਺తσʔλܕͰදݱ͢Δ • ܕΛ૊Έ߹ΘͤΔͷʹ࿦ཧੵ "/% ͚ͩͰͳ͘ ࿦ཧ࿨ 03 ͕࢖͑Δ data Bool = True | False data Maybe a = Nothing | Just a )BTLFMM )BTLFMM data UnionFind = UnionFind { parent :: IM.IntMap Int, size :: IM.IntMap Int } )BTLFMM

Slide 52

Slide 52 text

ܕͷ૊Έ߹Θͤʹʮ࿨ 03 ʯ͕࢖͑Δ • ৽͍͠σʔλߏ଄ͷܗΛએݴ͢Δखஈ͸֤ݴޠ༷ʑͰ͋Δ͕ɺ͔ͭͯଟ͘ͷݴޠͰ͸ੵ "/% Ͱ૊Έ߹ ΘͤΔͷ͕ओͳํ๏ͩͬͨ – TUSVDU΍ DMBTTͳͲϨίʔυܕʹΑΔϓϩύςΟͷ૊Έ߹Θͤ͸ "/% • "/%͚ͩͰܕͱܕΛ૊Έ߹ΘͤΔͱɺෆࣗવͳ֊૚΍ෆඞཁͳ஋ͷ૊Έ߹Θ͕ͤൃੜ͠΍͍͢ – ௚ੵͷ֊૚ߏ଄ uuuྫ͑͹ DMBTTʹΑΔ֊૚ߏ଄ data Bool = True | False )BTLFMM

Slide 53

Slide 53 text

export interface ReservationHolder { kind: 'ReservationHolder' name: string nameKana: string | null phoneNumber: PhoneNumber email: EmailAddress | null } export interface Visitor { kind: 'Visitor' name: string nameKana: string | null phoneNumber: PhoneNumber } interface HolderAndVisitor { kind: 'HolderAndVisitor' holder: ReservationHolder visitor: Visitor } interface HolderOnly { kind: 'HolderOnly' holder: ReservationHolder } interface VisitorOnly { kind: 'VisitorOnly' visitor: Visitor } export type ReservationGuest = HolderAndVisitor | HolderOnly | VisitorOnly 5ZQF4DSJQU ߏ଄͕ҟͳΔ΋ͷΛʮ·ͨ͸ ࿨ 03 ʯͰ૊Έ߹ΘͤΔ

Slide 54

Slide 54 text

ੵ "/% ͚ͩͰܕͱܕΛ૊Έ߹Θ͍ͤͯ͘ͱ֊૚͕ඞཁʹͳΔ • ௚ੵ͚ͩͰ͸ʮࣅ͍ͯΔ͕গ͠ߏ଄͕ҧ͏΋ͷʯΛμϒΓͳ͘·ͱΊΔͷʹ֊૚͕ඞཁʹͳΔ • ࣅ͍ͯΔߏ଄Λநग़ͯ͠਌ʹ͢Δ uuu҆қʹ΍ΔͱʮܧঝʹΑΔࠩ෼ϓϩάϥϛϯάʯʹͳͬͯ͠·͏ • ࿨͕͋Δ͜ͱͰʮ֊૚ʹ͢Δ͔ɺฒ΂Δ͔ʯॊೈͳ૊Έ߹Θ͕ͤՄೳʹͳΔ

Slide 55

Slide 55 text

l.BLJOHJMMFHBMTUBUFTVOSFQSFTFOUBCMFz interface User { memberId: MemberId | undefined guestId: GuestId | undefined } interface Member { userId: MemberId } interface Guest { guestId: GuestId } type User = Member | Guest औΓಘΔ஋ͷछྨ਺͸֤ଐੑͷੵʹͳΔ ௚ੵ Y ɾ྆ํ VOEFGJOFE ɾ྆ํͷ஋͕ຒ·Δ ͱ͍͏࢓্༷͋Γಘͳ͍ঢ়ଶ͕ੜ·ΕΔ औΓಘΔछྨ਺͸֤ଐੑͷ࿨ ௚࿨   ࢓্༷͋Γಘͳ͍ঢ়ଶ͸දݱ͠ͳ͍ ˠ ͦͯ͠ίϯύΠϥ͕ͦΕΛཧղ͢Δ Ϩίʔυ͸ʮ͔ͭ "/% ʯ ϢχΦϯ͸ʮ·ͨ͸ 03 ʯ 5ZQF4DSJQU 5ZQF4DSJQU

Slide 56

Slide 56 text

type connection_state = | Connecting | Connected | Disconnected type connection_info = { state: connection_state; server: inet_addr; last_ping_time: time option; last_ping_id: int option; session_id: string option; when_initiated: time option; when_disconnected: time option; } type connecting = { when_initiated: time; } type connected = { last_ping : (time * int) option; session_id: string; } type disconnected = { when_disconnected: time; } type connection_state = | Connecting of connecting | Connected of connected | Disconnected of disconnected type connection_info = { state: connection_state; server: inet_addr; } 「なぜ次に学ぶ言語は関数型であるべきか - YAMAGUCHI::weblog」 より引用 https://ymotongpoo.hatenablog.com/entry/20111105/1320506449 0$BNM 0$BNM

Slide 57

Slide 57 text

ͪ͜ΒΑΓ΋ŋŋŋ export class Tag { state: 'Unvalidated' | 'Validated' | 'Created', id: TagId | undefined, groupId: RestaurantGroupId, label: string, icon: TagIcon | undefined, sortOrder: number | undefined, builtin: boolean | undefined } 5ZQF4DSJQU

Slide 58

Slide 58 text

interface UnvalidatedTag { kind: 'Unvalidated' groupId: string label: string icon?: { symbol: string; type: TagIconType; color?: string | null | undefined } | null | undefined } interface ValidatedTag { kind: 'Validated' groupId: RestaurantGroupId label: string icon: TagIcon } export interface CreatedTag { kind: 'Created' id: TagId groupId: RestaurantGroupId label: TagLabel icon: TagIcon sortOrder: number builtin: boolean } export type Tag = UnvalidatedTag | ValidatedTag | CreatedTag ͪ͜Βͷํ͕ɺ஋ͷ૊Έ߹Θͤύλʔϯ͕গͳ͘ݫີ 5ZQF4DSJQU

Slide 59

Slide 59 text

𝑓 • ͋Δঢ়ଶ͔Β͋Δঢ়ଶ΁ભҠ͢Δͱ͖ɺͦΕͧΕঢ়ଶ͕औΓ͏Δ஋ͷू߹ʹɺෆཁͳঢ়ଶ͕গͳ͚Ε͹গ ͳ͍΄Ͳؔ਺ Gͷਖ਼͠͞Λ ίϯύΠϥϨϕϧͰ อূ͢Δ͜ͱ͕Ͱ͖Δ • ௚ੵͱ௚࿨ʹΑΔ૊Έ߹ΘͤʹݶΒͣɺܕγεςϜͷදݱྗ͕ߴ͚Ε͹ɺू߹ΛΑΓਖ਼͍͠΋ͷʹ͢Δ͜ ͱ͕Ͱ͖Δ

Slide 60

Slide 60 text

࿨Ͱ૊Έ߹Θͤͯߏஙͨ͠΋ͷ͸ɺύλʔϯϚονͰ෼ղ main = do let someValue :: Maybe String someValue = ... case someValue of Just s -> putStrLn (s ++ ", naoya") Nothing -> putStrLn "Farewell" data Maybe a = Nothing | Just a )BTLFMM )BTLFMM +VTU4USJOH͔ /PUIJOHͷͲͪΒ͔ .BZCFܕΛύλʔϯϚονͰ෼ղ͢Δ

Slide 61

Slide 61 text

5ZQF4DSJQUͰ΋͍͚·͢ interface Empty { kind: "Empty" } interface Cons { kind: "Cons" head: T tail: List } export type List = Empty | Cons data List a = Empty | Cons a (List a) 5ZQF4DSJQU )BTLFMM ϦςϥϧܕͰλάΛ͚͓ͭͯ͘ ϢχΦϯͰ૊Έ߹Θͤͨܕ

Slide 62

Slide 62 text

// List への map 関数を実装 type map = (f: (a: T) => U, xs: List) => List export const map: map = (f, xs) => { switch (xs.kind) { case "Empty": return Empty() case "Cons": return Cons(f(xs.head), map(f, xs.tail)) default: assertNever(xs) } } export function assertNever(_: never): never { throw new Error() } console.log(map(i => i * 2, myList)) 5ZQF4DSJQU λάʹԠͯ͡෼ղ ϦςϥϧܕͳͷͰͪΌΜͱܕ͕ޮ͘

Slide 63

Slide 63 text

(SBQI2-ʹ΋ 6OJPOܕ • (SBQI2-ʹ΋ 6OJPOܕ͕͋Γɺ্ख͘࢖͏ͱݎ࿚ੑΛߴΊΒΕΔ • ΫϥΠΞϯτଆͰܕʹԠͨ͡෼ղ͕Մೳ query GetSearchResults { search(contains: "Shakespeare") { __typename ... on Book { title } ... on Author { name } } } (SBQI2-

Slide 64

Slide 64 text

࣮ࡍͷ8FCΞϓϦέʔγϣϯ։ൃͰͲ͏͍ͯ͠Δ͔͸ɺҎԼͷεϥΠυΛ͝ཡ͍ͩ͘͞ https://speakerdeck.com/naoya/

Slide 65

Slide 65 text

ܕʹΑͬͯจ຺Λදݱ͢Δ ৄࡉׂѪ • .BZCF 0QUJPOBM uuuଘࡏ͠ͳ͍͔΋͠Εͳ͍஋ • &JUIFS 3FTVMU uuuࣦഊ͢Δ͔΋͠Εͳ͍஋ɻى͜Γ͏Δࣦഊ • *0uuu෭࡞༻Λ࣋ͭૢ࡞ɺ·ͨ͸֎քͱͷΠϯλϥΫγϣϯ • -JTUuuuඇܾఆܭࢉ

Slide 66

Slide 66 text

ܕΫϥε uuuܕͷ෼ྨͱ֊૚ ৄࡉׂѪ

Slide 67

Slide 67 text

ʢ͓·͚ ؔ਺ͷೖग़ྗΛू߹ͱΈͳ͢ͱ͍͏͜ͱ͸ ʜ • ਺ֶతʹ͸ɺू߹ʹԋࢉΛೖΕΔͱʮ୅਺తߏ଄ʯ͕ݱΕΔ • ܈࿦తͳந৅ uuuϞϊΠυɺ܈ɺ൒؀ɺ؀ uuu • ͜ΕΛҙ࣮ࣝͯ͠૷Λ͢Δͱɺ਺ֶํ޲΁ͷந৅Խʹͭͳ͕Δɻྑ͍ϓϥΫςΟεͷͻͱͭ

Slide 68

Slide 68 text

ྫ͑͹ಈతܭը๏ φοϓβοΫ໰୊ ͷ࣮૷ for (int j = 0; j <= W; ++j) dp[0][j] = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j <= W; ++j) { if (j >= w[i]) dp[i+1][j] = max(dp[i][j-w[i]] + v[i], dp[i][j]); else dp[i+1][j] = dp[i][j]; } } cout << dp[N][W] << endl; let f (w, v) (wi, vi) | v == minBound = [(w, v)] | otherwise = [(w, v), (w + wi, v + vi)] let dp = accumArrayDP @UArray f max minBound (0, wx) [(0, 0)] wvs print $ maximum (elems dp) )BTLFMM $ ू߹ʹԋࢉͭͱ୯ҐݩΛೖΕΕ͹ %1ʹͳΔΑ͏ந৅Խ͍ͯ͠ Δ %1͸൒؀

Slide 69

Slide 69 text

• ΞϧΰϦζϜΛ୅਺తߏ଄Λҙࣝͯ͠ந৅Խ͢Δɻʮ͜ͷΞϧΰϦζϜ ܭࢉߏ଄ ʹͲΜͳ݁߹ԋࢉΛೖ Εͯ࢖͏͔ʯͱ͍͏ΠϯλϑΣʔεͷؔ਺͕ಘΒΕΔ • ͲΜͳԋࢉΛೖΕΒΕΔ͔ uuuܕ͕อূ͢Δ ೖΕΒΕΔԋࢉͷू߹Λఆٛ͢Δ let sections = shakutori (1, n) (s !) (+) (-) 0 (¥acc r -> acc + r <= k) let s = scanl' (+) 0 xs let dp = doubling f (+) (10 ^ 5, 10 ^ 18) xs ͠Ό͘ͱΓ๏ μϒϦϯά ྦྷੵԋࢉ

Slide 70

Slide 70 text

𝑓 ͱ͋Δू߹4 ·ͨଞͷू߹4 ͋Δू߹ʹଐ͢Δ஋Λɺؔ਺ GʹΑΓɺ·ͨଞͷू߹ʹଐ͢Δ஋ʹࣸ͢ ͜Ε͕ͲΜͳू߹͔هड़͢Δͷ͕ʮܕʯ

Slide 71

Slide 71 text

࠶ܝ ਤ͸ԿΛݴ͍ͬͯΔ͔ • ϓϩάϥϜΛʮܭࢉػ΁ͷ໋ྩʯͰ͸ͳ͘ʮؔ਺Λద༻ͯ͠஋ΛಘΔܭࢉʯͷఆٛͱଊ͑Δ • ؔ਺ G͸ɺ஋Λࣸ͢΋ͷ • ͲΜͳू߹͔ΒͲΜͳू߹ʹࣸ͞ΕΔ͔ɻͦͷू߹ΛܕͰදݱ͢Δ • ू߹ͷදݱɺͭ·ΓʮܕͱܕΛ૊Έ߹Θͤͨߏ଄Խʯ͕ΑΓྑ͘Ͱ͖Ε͹ɺϓϩάϥϜ͕ݎ࿚ʹͳΔ ࠷ۙ͸͜ͷߟ͑Λத৺ʹஔ͍ͯɺϓϩάϥϜઃܭΛ͍ͯ͠·͢ ʮू߹Ͱ͋ΔܕͰઃܭ͠ɺؔ਺Ͱঢ়ଶΛભҠʯ

Slide 72

Slide 72 text

ͲΜͳϓϩάϥϛϯάݴޠͰ΋ؔ਺ܕͰΨϯΨϯ΍͍ͬͯ͘΂͖ • ๯಄ʹ΋ड़΂ͨ௨Γɺؔ਺ܕϓϩάϥϛϯά࠷ڧɺͱ͍͏࿩͸͍ͯ͠·ͤΜ • Αͬͯɺࢲݟ͸ʮ͍͍͑ʯݴޠͷಛੑʹ߹Θͤ·͠ΐ͏ – )BTLFMMɺ 'ɺ 0$BNMɺ4DBMBͳͲͦ͏͢Δ͜ͱΛલఏʹ࡞ΒΕ͍ͯΔݴޠ͸໰୊ͳ͍Ͱ͠ΐ͏ – 5ZQF4DSJQUuuuؔ਺ܕͱͯ͠ͷଆ໘͸͋Γ·͕͢ɺγϯλοΫε໘Ͱ͸લஈͷݴޠʹൺֱ͢Δͱෆ଍΋ײ͡·͢ɻ Ұํ 54ͷܕγεςϜ͸ɺ͝ଘ஌ͷ௨Γಈతͳಛ௃΋͋ΓɺඇৗʹڧྗͰ͢ɻܕ͸ू߹ͷϝϯλϧϞσϧͰ্ख ʹ࢖͍ɺؔ਺ܕͷΤοηϯεΛऔΓೖΕͭͭ΋ɺ໋ྩతʹॻ͚͹͍͍৔໘Ͱ͸ແཧΛ͠ͳ͍uuu͙Β͍͕ྑ͍όϥ ϯεͰ͸ͳ͍Ͱ͠ΐ͏͔ • ࢲ͸ 3FTVMUܕΛ࢖ͬͯؔ਺ܕدΓͰ΍͍ͬͯ·͕͢ɺ͍͍ଆ໘΋͋Γ·͕͢໘౗ͳ͜ͱ΋͋Γ·͢ – 3VTUɺ,PUMJOɺ4XJGUuuuܕʹʮ03ʯ૬౰ͷػೳ͕͋ΓɺܕγεςϜ͸ݱ୅తͰ͢ɻͲΜͳελΠϧ͕͍͍͔͸ɺ ৄ͘͠ͳ͍ͷͰΘ͔Γ·ͤΜɻ֤ݴޠͳΓͷʮ˓˓ 8BZʯ͕͋Δͱࢥ͍·͢ɺࣝऀʹ͓ฉ͖͍ͩ͘͞

Slide 73

Slide 73 text

·ͱΊ • ؔ਺ܕϓϩάϥϛϯάͷݟ஍͔Βࣜɺؔ਺ɺܕͳͲΛΈͯΈΔͱ໋ྩܕͰଊ͍͑ͯͨ࣌ͱ͸ গ͠ҧ͏ݟํ͕Ͱ͖·͢ • ʮܭࢉػ΁ͷ໋ྩʯͳͷ͔ʮܭࢉʯͳͷ͔ • ʮؔ਺͸஋Λࣸ͢΋ͷɺܕ͸ू߹ʯͱݟΔ͜ͱ΋Ͱ͖·͢ • ࡢࠓͷϓϩάϥϛϯάݴޠ΍ϑϨʔϜϫʔΫʹ͸ؔ਺ܕͷӨڹ͕֞ؒݟ͑·͢ • ࣗ෼͕࢖͍ͬͯΔݴޠɺϑϨʔϜϫʔΫɺπʔϧͷಛੑʹ߹Θͤͯɺແཧͷͳ͍ൣғͰɺ ΤοηϯεΛऔΓೖΕ͍ͯ͘ͱΑΓָ͘͠ɺΑΓྑ͍։ൃ͕Ͱ͖Δͱࢥ͍·͢

Slide 74

Slide 74 text

ࢀߟจݙ • 8JMM,VSUஶ גࣜձࣾΫΠʔϓ ༁ ʮೖ໳ )BTLFMMϓϩάϥϛϯάʯ ᠳӭࣾ  • (SBIBN)VUUPOஶ ࢁຊ࿨඙ ༁ ʮϓϩάϥϛϯά )BTLFMMୈ൛ʯ ϥϜμϊʔτ  • 4DPUU8MBTDIJOஶ ʮ%PNBJO.PEFMJOH.BEF'VODUJPOBMʯ  • +FSFNZ'BJSCBOL ஶ ϠΪͷ͘͞ΒͪΌΜ ຋༁ ʮϓϩάϥϛϯά&MNᴷ҆શͰϝϯςφϯε͠΍ ͍͢ϑϩϯτΤϯυΞϓϦέʔγϣϯ։ൃೖ໳ʯ ϚΠφϏग़൛  • େ઒ಙ೭ஶ ʮ<૿ิվగ>ؔ਺ϓϩάϥϛϯά࣮ફೖ໳ʯ ٕज़ධ࿦ࣾ  • 8FCͷϦιʔε – 5ZQF4DSJQUʹ͓͚Δܕͷू߹ੑͱ֊૚ੑ IUUQT[FOOEFWFTUSBBSUJDMFTUZQFTDSJQUUZQFTFUIJFSBSDIZ – ʮͳͥ࣍ʹֶͿݴޠ͸ؔ਺ܕͰ͋Δ΂͖͔  :"."(6$)*XFCMPHʯ  IUUQTZNPUPOHQPPIBUFOBCMPHDPNFOUSZ