Slide 1

Slide 1 text

ΞΫλʔϞσϧͷ࿩ 2017.10.21 RubySapporo.beam #3 ·͑ͩͱ΋͖

Slide 2

Slide 2 text

ࣗݾ঺հ @tmaeda (ג)͑ʹ͠ςοΫ ࠷ۙ͸RailsͷཪͰಈ͘SidekiqͷδϣϒΛॻ͘࢓ࣄ͕ଟ͍Ͱ ͢ ElixirΛ·ͬͨΓษڧதͰ͢

Slide 3

Slide 3 text

&-*9*3ͷίʔυྫ defmodule Greeter do def hello do receive do name -> IO.puts "Hello #{name}" end hello() end end greeter = spawn(Greeter, :hello, []) send(greeter, "World")

Slide 4

Slide 4 text

ࠓ೔͓࿩͍ͨ͜͠͠ͱ ΞΫλʔϞσϧ͕ੜ·Εͨഎܠ ΞΫλʔϞσϧ͸ԿΛղܾ͢Δͷ͔ʁ ΞΫλʔϞσϧͱͲ͏෇͖߹͑͹͍͍ͷ͔ʁ

Slide 5

Slide 5 text

ΞΫλʔϞσϧ Carl Hewitt 1973 https://en.wikipedia.org/wiki/Actor_model

Slide 6

Slide 6 text

πΠολʔ΋͋Δˠhttps://twitter.com/carlhewitt

Slide 7

Slide 7 text

1977ͷHewittͷ࿦จ In recent years, there has been a shift from the centralized serial computing system to the distributed parallel computing network. (Laws for Communicating Parallel Processes)
 https://dspace.mit.edu/bitstream/handle/1721.1/41962/AI_WP_134A.pdf ڞײͰ͖·͢ʁ ͪΐͬͱ౰࣌ͷ༷ࢠΛௐ΂ͯΈ·͠ΐ͏

Slide 8

Slide 8 text

ʰ·Μ͕͸͡Ίͯ෺ޠʱʢ·Μ͕͸͡Ίͯ΋ͷ͕ͨΓʣͱ͸ɺ1978೥5݄6೔͔Β1984೥3݄31೔·ͰTBSܥྻ ہͰ์ૹ͞ΕͨμοΫεΠϯλʔφγϣφϧͱTBSڞಉ੡࡞ͷࢠڙ޲͚ͷڭཆ൪૊Ͱ͋Δɻશ305ճɻ

Slide 9

Slide 9 text

࠷ॳͷίϯϐϡʔλ 1946 ENIAC

Slide 10

Slide 10 text

࠷ॳͷίϯϐϡʔλωοτϫʔΫ 1950೥୅ޙ൒ Semi-Automatic Ground Environment

Slide 11

Slide 11 text

֩౥ࡌരܸػͷܴܸͷܭࢉ https://www.youtube.com/watch?v=dF75jHfawtM

Slide 12

Slide 12 text

࠷ॳͷεʔύʔίϯϐϡʔλʔ 1964 CDC 6600 10MHz

Slide 13

Slide 13 text

೥ද 1946 ENIAC 1956 SAGE 1965 CDC6600 1971 Intel 4004 740kHz 1957 Fortran 1958 LISP 1959 COBOL 1972 C, Smalltalk 1972 UNIX 1973 Ethernet 1969 ARPANET 50kbsp ͜ͷลͷࠒͷ࿩ˢ 1967 Thread

Slide 14

Slide 14 text

ݚڀॴ΍܉ࣄࢪઃʹ͸ɺҰൠՈఉͰ͍͏ͱ͜Ζͷ1990೥ ୅ʙ2000೥୅૬౰ͷίϯϐϡʔλͱωοτϫʔΫ؀ڥ͕ ͋ͬͨͱ૝૾͞ΕΔɻ ͳΔ΄Ͳɺࢲ͕ݟ͍ͯͨ2000೥લޙͷ࿩ͩͱࢥ͑͹ɺ
 ڞײͰ͖Δɻ

Slide 15

Slide 15 text

Կ͕໰୊͔ͩͬͨʁ ϨʔείϯσΟγϣϯͷ༗໊ͳ໰୊ ۜߦޱ࠲ʹ10000ԁ͋Δ A͞Μ͕7000ԁҾ͖མͱͦ͏ͱ͢Δ B͞Μ͕8000ԁҾ͖མͱͦ͏ͱ͢Δ

Slide 16

Slide 16 text

͜Μͳίʔυ if Ҿ͖མͱֹ͠ <= ࢒ߴ ࢒ߴ -= Ҿ͖མͱֹ͠ return true else return false end

Slide 17

Slide 17 text

ϚϧνεϨουͰಈ͔͢ͱʁ "͞Μ #͞Μ ޱ࠲ ࢒ߴ଍ΓΔʁ ࢒ߴ଍ΓΔʁ 0, 0, ԁҾ͖མͱ͠ ԁҾ͖མͱ͠ ࢒ߴ10000ԁ ࢒ߴ͕ϚΠφεԁʂ

Slide 18

Slide 18 text

ϩοΫͰղܾʁ ͜͜ͰϩοΫΛ͔͚Δ(1౓ʹ1ͭͷεϨου͔͠ڐ͞ͳ͍) if Ҿ͖མͱֹ͠ <= ࢒ߴ ࢒ߴ -= Ҿ͖མͱֹ͠ return true else return false end ͜͜ͰϩοΫΛղ์ ϩοΫΛ͠๨ΕΔ ղ์͠๨ΕΔ ΊΜͲ͍͘͞ ෆ҆

Slide 19

Slide 19 text

೥ද 1946 ENIAC 1956 SAGE 1965 CDC6600 1971 Intel 4004 740kHz 1957 Fortran 1958 LISP 1959 COBOL 1972 C, Smalltalk 1972 UNIX 1973 Ethernet 1969 ARPANET 50kbsp ͜ͷลͷࠒͷ࿩ˢ 1967 Thread

Slide 20

Slide 20 text

ΧϓηϧԽͯ͠σʔλΛकΔ ͷ͕ΦϒδΣΫτࢦ޲ͷ ໨తͷ1ͭͩͬͨͷʹ…

Slide 21

Slide 21 text

ΞΫλʔϞσϧ શͯ͸ΞΫλʔͰ͋Δɻ(OOPͰ͍͏ͱ͜Ζͷʮશͯ͸ΦϒδΣΫτͰ͋Δʯͱࣅ͍ͯΔ) ΞΫλʔ͸ ܭࢉͰ͖Δɻ ༗ݶͷ৽͍͠ΞΫλʔΛੜ੒Ͱ͖Δɻ ଞͷΞΫλʔ΁༗ݶͷϝοηʔδΛૹΕΔɻ ࣍ʹड͚Δϝοηʔδ΁ͷ४උ͕Ͱ͖Δ(ঢ়ଶΛอ࣋Ͱ͖Δ)ɻ ϝʔϧϘοΫεΛ࣋ͪɺಧ͍ͨϝοηʔδΛ1ͭͣͭॱ൪ʹॲཧ͢Δɻ ※ϝοηʔδ͕ಧ͘ॱং͸ෆఆ ※ϝοηʔδ͸ಧ͔ͳ͍͔΋͠Εͳ͍

Slide 22

Slide 22 text

ΞΫλʔϞσϧͰղܾ "͞Μ #͞Μ ޱ࠲ SFDFJWF 0, ԁҾ͖མͱ͠ ԁҾ͖མͱ͠ ࢒ߴ10000ԁ ϝʔϧϘοΫε ࢒ߴνΣοΫͯ͠ ԁҾ͖མͱ࣮͠ߦ /( SFDFJWF ϝοηʔδ͸ඞͣ
 1݅ͣͭॱ൪ʹ
 ॲཧ͞ΕΔ

Slide 23

Slide 23 text

ΞΫλʔϞσϧ
 ʮΦϒδΣΫτʯͱಡΈସ͑ͯΈΔ શͯ͸ΞΫλʔͰ͋Δɻ ΞΫλʔ͸ ܭࢉͰ͖Δɻ ༗ݶͷ৽͍͠ΞΫλʔΛੜ੒Ͱ͖Δɻ ଞͷΞΫλʔ΁༗ݶͷϝοηʔδΛૹΕΔɻ ࣍ʹड͚Δϝοηʔδ΁ͷ४උ͕Ͱ͖Δ(ঢ়ଶΛอ࣋Ͱ͖Δ)ɻ ϝʔϧϘοΫεΛ࣋ͪɺಧ͍ͨϝοηʔδΛ1ͭͣͭॱ൪ʹॲཧ͢Δɻ ΦϒδΣΫτ ΦϒδΣΫτ ΦϒδΣΫτ ΦϒδΣΫτ ͚͕ͩ͜͜ OOPʹͳ͍ಛ௃

Slide 24

Slide 24 text

ΞΫλʔϞσϧ͸ ΦϒδΣΫτࢦ޲ʹ ฒߦ࣮ߦʹର͢ΔΧϓηϧԽ Λ௥Ճͨ͠΋ͷͩͱ ߟ͑ΒΕΔ

Slide 25

Slide 25 text

https://media.pragprog.com/titles/pb7con/actors.pdf Chapter5 Actors More Object-Oriented than Objects

Slide 26

Slide 26 text

ΞΫλʔϞσϧͷ࢖͍ํ ݪٛతʹ͸ʮશͯΛΞΫλʔͱ͢ΔʯͷͰɺObjectΛnew͢ ΔΑ͏ͳؾ࣋ͪͰͲΜͲΜΞΫλʔΛ࡞͍͍ͬͯ(Erlang/ Elixir༻ޠͰݴ͏ͱɺprocessΛspawn͍͍ͯ͠)ɻ ΞΫλʔϞσϧ͸ΦϒδΣΫτࢦ޲ͱ΄΅ಉ͡ߟ͑ํͳͷ ͰɺΦϒδΣΫτࢦ޲ͷߟ͑ํΛྲྀ༻ͯ͠ϓϩάϥϜΛ૊ ΜͰ͍͍ɻσβΠϯύλʔϯͱ͔ɻ

Slide 27

Slide 27 text

&-*9*3ͷίʔυྫ վ defmodule Greeter do def start do spawn(__MODULE__, :loop, []) end def hello(greeter, name) do send(greeter, {:hello, name}) end # ͜͜͸privateͬΆ͍ؾ࣋ͪ def loop do receive do {:hello, name} -> IO.puts "Hello #{name}" end loop() end end greeter = Greeter.start Greeter.hello(greeter, name) ࣮૷ͷৄࡉ ϓϩηεͷىಈͱ͔ɺ ϝοηʔδͷ΍ΓऔΓͷੜʑ͍͠ ͱ͜Ζ ͸Ӆ͢

Slide 28

Slide 28 text

ͱݴΘΕ·ͯ͠΋ʜ ຊ౰ʹશ෦ΞΫλʔͰ͍͍ͷʁ Integer͢Β΋ʁ
 ˠຊ౰ʹඞવੑ͕͋ΔͷͰ͋Ε͹ɺ΍ͬͯ΋͍͍ɻ
 CounterΞΫλʔͱ͔Ͷɻ RailsͰΞϓϦ૊ΜͰΔͱThreadΛ࢖͍͍ͨ৔໘ͳΜͯ໓ଟʹͳ͍Μͩ ͚Ͳ…
 →Ϛετυϯ͸Sidekiqδϣϒͷմ
 https://github.com/tootsuite/mastodon/tree/master/app/workers

Slide 29

Slide 29 text

·ͱΊ ΞΫλʔϞσϧ͸ΦϒδΣΫτࢦ޲Λฒߦ؀ڥͰ΋ؾܰʹ࢖͑Δ Α͏ʹमਖ਼ͨ͠΋ͷͱߟ͑ΒΕΔͷͰɺΞΫλʔ͸༑ୡɺා͘ͳ ͍Α ιʔγϟϧωοτϫʔΫతͳػೳΛؚΉΞϓϦέʔγϣϯͰ͸ ΦϒδΣΫτάϥϑ͕ෳࡶʹͳΓ͕ͪͳͷͰ݁ߏ࢖͑Δ৔໘͕ ͋Δ ͦ͏͸ݴͬͯ΋ɺ࢖͍͗͢ΔͱύϑΥʔϚϯεͷ໰୊ͱ͔ಈ͖͕ ෆఆͰΘ͔Γʹ͘͘ͳͬͨΓ͢ΔͷͰઅ౓Λ࣋ͭඞཁ͕͋Γͦ͏