Share
Embed
私が愛する Elixir/Erlang の楽しさと辛さ
Developers Summit 2019 にて, Web エンジニアの皆様向けに Elixir の紹介をした際に使用したスライドです.
https://event.shoeisha.jp/devsumi/20190214/session/1996/
デブサミ 2019 年テーマ「SHARE YOUR FUN!」に則り、私が 15 年間にわたり愛し続けている Erlang や Elixirを、まだ、これらに触れたことがない PHP/Java/JavaScript などが得意な Web エンジニアの方々へ共有します。
ゴールは、ご参加いただける皆様の道具箱に Elixir を追加する準備を整えることです。
他の言語と比較して何が良いのか?辛いのか?(継続、イベントドリブン、オブジェクト指向、プロセスデザイン、マクロなど)に触れていき、皆様の期待値を適切に保った状態でElixir の世界へと誘います。
cooldaemon
February 15, 2019
Transcript
398 slides
-
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࢲ͕Ѫ͢Δ Elixir/Erlang ͷָ͠͞ͱਏ͞ Developers Summit 2019 15-D-5
͜ΕΛ·ͩΒͳ͍8FCΤϯδχΞଃΔ ݄ HVNJ*OD$50زాխਔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ձࣾհ ઃཱ ήʔϜೝূ՝ۚαʔϏεʹ &SMBOHΛ࠾༻
ήʔϜৗ࣌ଓαʔόʹ &SMBOHΛ࠾༻ ήʔϜೝূ՝ۚαʔϏεʹ &MJYJSΛ࠾༻ ήʔϜ"1*αʔόʹ &MJYJSΛ࠾༻ ΠϚίί -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࣗݾհ زాխਔ ͍ͨ͘ ·͞ͻͱ زాխਔ ͍ͨ͘ ·͞ͻͱ
&SMBOHͱग़ձ͏ &SMBOHͰ ΫϨδοτܾࡁαʔϏεΛߏங HVNJ*ODೖࣾ͢Δ &SMBOHͰ ήʔϜೝূ՝ۚαʔϏεΛߏங &MJYJSͱग़ձ͏ HVNJ*OD$50ʹͳΔ +BQBO&MJYJS"TTPDJBUJPOࢀՃ ࣾͰ&MJYJS࠾༻Λڣͼ࢝ΊΔ ΠϚίί -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ ૉૣ͘ϦϦʔε͍ͨ͠ ૿͑ଓ͚ΔΫϥΠΞϯτ ංେԽ͢Δαʔόߏ 8FC։ൃऀͷΈ ෳࡶԽ͢Δίʔυ ߨٛϊʔτ
ɹίʔυͷՄಡੑΛམͱͯ͠ ॲཧੑೳҐΛ্͛Δ͜ͱ͋Δ FH ετΞΛਫฏׂ εϨουίϧʔνϯ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ ૉૣ͘ϦϦʔε͍ͨ͠ ૿͑ଓ͚ΔΫϥΠΞϯτ ංେԽ͢Δαʔόߏ ෳࡶԽ͢Δαʔόߏ 8FC։ൃऀͷΈ ෳࡶԽ͢Δίʔυ
ߨٛϊʔτ ɹϢʔβಉ࢜ͷΠϯλϥΫγϣϯ͕૿͑ΔΑ͏ͳϏδωεཁ݅Λຬ ͨͨ͢Ί ৗ࣌ଓ ͔ͭ εςʔτϑϧͳߏΛՃ͑Δ͜ͱ͋Δ ɹ݁Ռʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ 8FC։ൃऀͷΈ ૉૣ͘ϦϦʔε͍ͨ͠ ૿͑ଓ͚ΔΫϥΠΞϯτ ංେԽ͢Δαʔόߏ ෳࡶԽ͢Δαʔόߏ A
ฒߦੑ ߨٛϊʔτ ɹΞΫηε͕૿͑ͯ ߏ͕ංେԽ͠ͳ͍Α͏ ฒߦॲཧͷ Έ͕ଘࡏ͍ͯ͠Δ͜ͱ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ 8FC։ൃऀͷΈ ૉૣ͘ϦϦʔε͍ͨ͠ ૿͑ଓ͚ΔΫϥΠΞϯτ ංେԽ͢Δαʔόߏ ෳࡶԽ͢Δαʔόߏ A
ฒߦੑ ϝϯςϯφϯεੑ ߨٛϊʔτ ɹΞΫηεʹྀͨ͠ίʔυΛهड़ͯ͠ ίʔυ͕ෳࡶԽͤͣ ϝϯςφϯεੑ͕ଛͳΘΕͳ͍Έ͕ଘࡏ͍ͯ͠Δ͜ͱ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ 8FC։ൃऀͷΈ ૉૣ͘ϦϦʔε͍ͨ͠ ૿͑ଓ͚ΔΫϥΠΞϯτ ංେԽ͢Δαʔόߏ ෳࡶԽ͢Δαʔόߏ A
ฒߦੑ ϝϯςϯφϯεੑ োੑ ߨٛϊʔτ ɹোରԠͷίετΛԼ͛ΔͨΊʹ ҆શੑʹྀͨ͠Έ͕ଘ ࡏ͍ͯ͠Δ͜ͱ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ ฒߦੑ ϝϯςφϯεੑ োੑʹ༏Εͨ 8FCαʔϏεΛ ։ൃͰ͖Δੈք
Α͏ͦ͜ʂ ߨٛϊʔτ ɹͰ ࣮ࡍͷ׆༻ࣄྫ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ HVNJ*OD ࣮ྫ ϚΠΫϩαʔϏε܈ ήʔϜαʔό܈ 1SPYZ ʜ
"1* ೝূ ՝ۚ ϓϥοτϑΥʔϜ܈ ༷ʑͳ ݴޠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ HVNJ*OD ࣮ྫ ϚΠΫϩαʔϏε܈ ήʔϜαʔό܈ 1SPYZ ʜ
1VC4VC "1* ೝূ ՝ۚ ϓϥοτϑΥʔϜ܈ ༷ʑͳ ݴޠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ HVNJ*OD ࣮ྫ ϚΠΫϩαʔϏε܈ ήʔϜαʔό܈ 1SPYZ ʜ
1VC4VC "1* ೝূ ՝ۚ ϓϥοτϑΥʔϜ܈ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ HVNJ*OD ͓ख͍ͷ࣮ྫ ϚΠΫϩαʔϏε܈ ήʔϜαʔό܈ 1SPYZ 0DVMVT4UPSF
'BDFCPPL ʜ 1VC4VC "1* ೝূ ՝ۚ ৴ ৴ελδΦ 6OJUZ IUUQTWBSLDPKQ ˡ৽ن։ൃ ࡾϲ݄͘Β͍ ϓϥοτϑΥʔϜ܈ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ ฒߦੑ ϝϯςφϯεੑ োੑʹ༏Εͨ 8FCαʔϏεΛ ։ൃͰ͖Δੈք
Α͏ͦ͜ʂ 3VCZ /PEFKT 4DBMB &MJYJS ٻਓαΠτਖ਼ࣾһٻਓ ݄ݱࡏ ݅ ݅ ݅ ݅ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ࠓͷ͠ ֶशίετ͕ߴ͍ ͱࢥΘΕ͍ͯΔ ؔܕ ϚΫϩ &SMBOH
ߨٛϊʔτ ɹฒߦॲཧ ؔܕ ϚΫϩͱͦ͠͏ͳ֓೦ΛֶͿඞཁ͕͋Γͦ͏ ͳͱ͜Ζʹ ͳͥʹೋͭͷݴޠΛֶͿඞཁ·Ͱ͋Δͷ͔ʜ ɹී௨ʹߟ͑ͨΒ ࠾༻Λආ͚·͢ΑͶ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ ֶशίετ͕ߴ͍ ࠓ͢͜ͱ ߴ͘͘ͳ͍ 8FCγεςϜͷ։ൃͳΒ ྑ͍͜ͱѱ͍͜ͱ͢ ҆શੑ͕ߴ͘
ੜ࢈ੑ͕ߴ͘ ͦΕҎ֎ͷੑ࣭ ΄Ͳྑ͍ Ճ͑ͯʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ ֶशίετ͕ߴ͍ &MJYJSֶशίετͷׂʹ Ըܙ͕େ͖͍ ࣋ͪؼͬͯ΄͍͜͠ͱ ҆શੑ͕ߴ͘ ੜ࢈ੑ͕ߴ͘
ͦΕҎ֎ͷੑ࣭ ΄Ͳྑ͍ ࠓ͢͜ͱ ߴ͘͘ͳ͍ 8FCγεςϜͷ։ൃͳΒ Ճ͑ͯʜ ྑ͍͜ͱѱ͍͜ͱ͢ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ 8"3/*/( زాͷ͕͠ղΓ͍ͧʜͱࢥͬͨΒ ֶशίετΛׂ͘ Ϧετͷѻ͍ํ ֶͿ͜ͱΛऔࣺબֶͯ͠शίετΛԼ͛Δ ߨٛϊʔτ
ɹ͡Ίʹ Ϧετૢ࡞ͷशಘʹ࣌ؒΛׂ͘ ɹϦετૢ࡞ &MJYJSͷجૅͱ͍͏ΑΓ ϓϩάϥϛϯάߦҝશൠ Ͱසग़͢Δύλʔϯ։ൃରݴޠʹґଘͤͣ Ԡ༻͕ޮͨ͘Ί &MJYJSΛΩοΧέʹֶͿͱΑ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ 8"3/*/( زాͷ͕͠ղΓ͍ͧʜͱࢥͬͨΒ ֶशίετΛׂ͘ Ϧετͷѻ͍ํ ͠Β͘ ֶशίετΛׂ͔ͳ͍
ฒߦॲཧશൠ ϚΫϩશൠ ϏϔΠϏΞͱϓϩτίϧ ֶͿ͜ͱΛऔࣺબֶͯ͠शίετΛԼ͛Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ 8"3/*/( زాͷ͕͠ղΓ͍ͧʜͱࢥͬͨΒ ֶशίετΛׂ͘ Ϧετͷѻ͍ํ ͠Β͘ ֶशίετΛׂ͔ͳ͍
ฒߦॲཧશൠ ϚΫϩશൠ ϏϔΠϏΞͱϓϩτίϧ ֶͿ͜ͱΛऔࣺબֶͯ͠शίετΛԼ͛Δ ߨٛϊʔτ ɹฒߦॲཧ ϚΫϩ ϏϔΠϏΞ ϓϩτίϧ ࠷ޙʹֶͿ ɹԿނ ͠Βֶ͘शෆཁ͔ ຊࢿྉͷதͰղઆ͢Δ ɹ͜͜Ͱհͨ͠Ҏ֎ͷ߲ Ϧετૢ࡞ʹशख़͔ͯ͠ΒֶͿ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ᷿Ͱᷚ͞Ε͍ͯΔྑ͍͠ ΞΫλʔϞσϧʂ ϝοηʔδύογϯάʂ ϝϞϦΛڞ༗͠ͳ͍͔Β γϯϓϧ ֓೦ࣗମͷֶशʹ
ίετ͕ඞཁ ϝοηʔδύογϯά Ͱ͢Βਓྨʹૣ͔ͬͨ ᷿Ͱᷚ͞Ε͍ͯΔѱ͍͠ ڞ༗ϝϞϦ εϨουΑΓָ͚ͩͲ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ᷿Ͱᷚ͞Ε͍ͯΔྑ͍͠ ΞΫλʔϞσϧʂ ϝοηʔδύογϯάʂ ϝϞϦΛڞ༗͠ͳ͍͔Β γϯϓϧ ֓೦ࣗମͷֶशʹ
ίετ͕ඞཁ ϝοηʔδύογϯά Ͱ͢Βਓྨʹૣ͔ͬͨ ᷿Ͱᷚ͞Ε͍ͯΔѱ͍͠ ڞ༗ϝϞϦ εϨουΑΓָ͚ͩͲ A લఏ݅Λ มߋ ·ͯʂ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ 1IPFOJYͰ8FCαʔϏεΛ։ൃ͢ΔͳΒʜ ஞ࣍ॲཧΛ ॻ͚ͩ͘Ͱ ܰྔϓϩηεͷ ԸܙΛ ڗडͰ͖Δ
Αͬͯ ͠Β͘ ฒߦॲཧΕͯΑ͍ ֶशίετΛ͏ͷޙճ͠ͰΑ͍ લఏ݅Λมߋ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ฐࣾͰ։ൃதͷιʔείʔυΛݕࡧͯ͠Έ·ͨ͠ XDM FY BHTQBXOcXDM BH5BTLcXDM
BH"HFOUcXDM BH(FO4FSWFScXDM ຊʹฒߦॲཧΛΕͯΑ͍ͷ͔ʁ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ % wc -l */**.ex | tail
-1 39053 total % ag spawn | wc -l 0 % ag Task | wc -l 0 % ag ‘ Agent’ | wc -l 0 % ag GenServer | wc -l 0 -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ 8"3/*/( ͜Ε͔Β͢ͷ &7.͛͢ʔͱ͍͏͠Ͱ͢ &MJYJS 1IPFOJYΛ͏ͱ ҆શୈҰͰ
΄Ͳ΄Ͳʹ͘ͳ͍&7.ʹ ศͰ͖Δ زాͷ͕͠ղΓ͍ͧʜͱࢥͬͨΒ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ 1IPFOJYͰ8FCαʔϏεΛ։ൃ͢ΔͳΒʜ ஞ࣍ॲཧΛ ॻ͚ͩ͘Ͱ ܰྔϓϩηεͷ ԸܙΛ ڗडͰ͖Δ
Αͬͯ ͠Β͘ ฒߦॲཧΕͯΑ͍ ֶशίετΛ͏ͷޙճ͠ͰΑ͍ લఏ݅Λมߋ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ &7. &SMBOH7. 04 FH-JOVY #4%ʜ $PXCPZ8FC4FSWFS
FH/HJOY "QBDIFʜ JFY4IFMM FH'JTI ;TIʜ ஞ࣍ॲཧΛ ॻ͚ͩ͘Ͱ ܰྔϓϩηεͷ ԸܙΛ ڗडͰ͖Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ &7. &SMBOH7. 04 FH-JOVY #4%ʜ
$PXCPZ8FC4FSWFS FH/HJOY "QBDIFʜ JFY4IFMM FH'JTI ;TIʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ An erlang web server will
spawn a single process per connection - each process is in itself a complete little web server - if you are running mochiweb with 100K chat sessions you really have 100K web servers on your machine - not one. If one of these web servers crashes who cares. +PF"SNTUSPOH (http://j.mp/mfpkYo) -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ An erlang web server will
spawn a single process per connection - each process is in itself a complete little web server - if you are running mochiweb with 100K chat sessions you really have 100K web servers on your machine - not one. If one of these web servers crashes who cares. +PF"SNTUSPOH (http://j.mp/mfpkYo) ߨٛϊʔτ ɹ+PF"SNTUSPOH&SMBOH։ൃऀͷҰਓ ɹϝʔϦϯάϦετͷલޙͷจ຺͕໘ന͍ͨΊ ͥͻ ݪจΛࢀর͠ ͯ΄͍͠ຊޠͰ͋ΕLVFOJTIJ͞Μͷهࣄ͕ৄ͍͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ +PF"SNTUSPOH (http://j.mp/mfpkYo) Erlang Ͱ࡞ΒΕͨ Web
αʔό, Ұͭͷଓ͝ͱʹ, Ұͭͷ ϓϩηεΛੜ͢Δ. 10ສݸͷνϟοτͷηογϣϯ͕ඞཁ ͳΒ, 10ສݸͷ Web αʔό͕ىಈ͢Δ. Ծʹ, ͦͷதͷҰͭ ͕མͪͨͱͯ͠, ୭ؾʹ͠ͳ͍. -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ &7. $PXCPZϓϩηε ߨٛϊʔτ ɹ&MJYJS 1IPFOJYͰ8FCαʔϏεΛ࡞Δͱ
͜ͷΑ͏ͳߏʹ ͳΔ ɹ$PXCPZ 1IPFOJY͕ґଘ͍ͯ͠Δ8FCαʔόϥΠϒϥϦ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ &7. $PXCPZϓϩηε )551ϦΫΤετ ࢲͨͪͷ ஞ࣍ॲཧϓϩηε
)551ηογϣϯ ϓϩηεىಈ ߨٛϊʔτ ɹ࣮ࡍ ޮԽͷͨΊʹىಈࡁΈͷϓϩηεΛׂΓ͍ͯͯΔ͕ આ໌؆ུԽͷͨΊ ϓϩηεىಈͱ͍͏දݱʹ͍ͯ͠Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ &7. $PXCPZϓϩηε ࢲͨͪͷ ஞ࣍ॲཧϓϩηε )551ϦΫΤετ
ϓϩηεىಈ )551ηογϣϯ 04ͬΆ͍ 8FC4FSWFSͩ $(*ͬΆ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ &7. $PXCPZϓϩηε ࢲͨͪͷ ஞ࣍ॲཧϓϩηε )551ϦΫΤετ
ϓϩηεىಈ )551ηογϣϯ 04ͬΆ͍ 8FC4FSWFSͩ $(*ͬΆ͍ ߨٛϊʔτ ɹ&7.ͱ$PXCPZ͕ฒߦॲཧΛ༻͍ͯ ॲཧޮΛ্͍͛ͯΔ ɹ8FCαʔϏε։ൃऀ ஞ࣍ॲཧΛهड़͢Δ͚ͩͰΑ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ &7. &SMBOH7. 04 FH-JOVY #4%ʜ
$PXCPZ8FC4FSWFS FH/HJOY "QBDIFʜ JFY4IFMM FH'JTI ;TIʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ Ͳ͏͍͏͜ͱʁ &7. &SMBOH7. 04 FH-JOVY #4%ʜ
$PXCPZ8FC4FSWFS FH/HJOY "QBDIFʜ JFY4IFMM FH'JTI ;TIʜ &7. 04 -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ async function do_process(orders) { const promises
= _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ async function do_process(orders) { const promises
= _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } ߨٛϊʔτ ɹͨͱ͑ ͜ͷΑ͏ͳ+BWB4DSJQUͷίʔυ͕͋ͬͨͱ͢Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ async function do_process(orders) { const promises
= _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ async function do_process(orders) { const promises
= _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } ߨٛϊʔτ ɹ͜ͷίʔυΛهड़͢Δࡍ ։ൃऀ ࣍ͷΑ͏ͳ͜ͱΛߟ͍͑ͯΔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ function do_process(orders) { _.each(orders, (order) =>
{ const result = do_something1(order); return do_something2(result); }); } ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ʜ function do_process(orders) {
_.each(orders, (order) => { const result = await do_something1(order); return await do_something2(result); }); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ function do_process(orders)
{ _.each(orders, (order) => { const result = await do_something1(order); return await do_something2(result); }); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ async function do_process(orders)
{ _.each(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ async function
do_process(orders) { _.each(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ ͋ ͪ߹Θͤ͠ͳ͍ͱʜFBDIΛNBQʹͯʜ
SZ async function do_process(orders) { _.each(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ ͋ ͪ߹Θͤ͠ͳ͍ͱʜFBDIΛNBQʹͯʜ
SZ async function do_process(orders) { const promises = _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ ͋ ͪ߹Θͤ͠ͳ͍ͱʜFBDIΛNBQʹͯʜ
SZ ͋PSEFSTͷॲཧॱ൪อূ͞Εͳ͍͔ʜ async function do_process(orders) { const promises = _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ ͋ ͪ߹Θͤ͠ͳ͍ͱʜFBDIΛNBQʹͯʜ
SZ ͋PSEFSTͷॲཧॱ൪อূ͞Εͳ͍͔ʜ async function do_process(orders) { const promises = _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } ΠϕϯτυϦϒϯ ܧଓ ίϯςΩετεΠονͷ Γସ͕͑ ্Ґʹ࿙Εग़͍ͯ͠Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ ͋ ͪ߹Θͤ͠ͳ͍ͱʜFBDIΛNBQʹͯʜ
SZ ͋PSEFSTͷॲཧॱ൪อূ͞Εͳ͍͔ʜ async function do_process(orders) { const promises = _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } ΠϕϯτυϦϒϯ ܧଓ ίϯςΩετεΠονͷ Γସ͕͑ ্Ґʹ࿙Εग़͍ͯ͠Δ ߨٛϊʔτ ɹܧଓ ΠϕϯτɾυϦϒϯͷՄಡੑΛ্͛Δख๏ͱͯ͠༻͍Δ͜ ͱͰ͖Δ͜ͷख๏ +BWB4DSJQU͚ͩͰͳ͘ 1FSM 4DBMBͰ༻͍ΒΕ͍ͯΔ1FSM$PSP "OZ&WFOU"LLB 4DBMB$14ͳͲ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ ͋ ͪ߹Θͤ͠ͳ͍ͱʜFBDIΛNBQʹͯʜ
SZ ͋PSEFSTͷॲཧॱ൪อূ͞Εͳ͍͔ʜ async function do_process(orders) { const promises = _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } ΠϕϯτυϦϒϯ ܧଓ ίϯςΩετεΠονͷ Γସ͕͑ ্Ґʹ࿙Εग़͍ͯ͠Δ ߨٛϊʔτ ɹܧଓ ΠϕϯτɾυϦϒϯΛ։ൃऀʹهड़͍ͤͯ͞Δ࣌Ͱ Լ Ґͷ֓೦্͕Ґʹ࿙Εग़͍ͯ͠Δ ɹࣅͨྫΛڍ͛ΔͳΒ ($ͰϝϞϦΛ։์͢ΔͨΊ ࣗྗͰࢀরΧ ϯτΛૢ࡞͢ΔͳͲʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ΉΉʜEP@TPNFUIJOH BTZOD͔ʜ BXBJUͰݺͿ͔ΒFBDIʹ͢ແ໊ؔBTZODʹ͢Δ͔ʜ ;ʔΉʜϧʔϓͷʹೋճίϯςΩετ͕ΓସΔͷ͔ʜ ͋ ͪ߹Θͤ͠ͳ͍ͱʜFBDIΛNBQʹͯʜ
SZ ͋PSEFSTͷॲཧॱ൪อূ͞Εͳ͍͔ʜ async function do_process(orders) { const promises = _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ async function do_process(orders) { const promises
= _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } def do_process(orders) do orders |> Enum.map(fn (order) -> order |> do_something1 |> do_something2 end) end -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ async function do_process(orders) { const promises
= _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } def do_process(orders) do orders |> Enum.map(fn (order) -> order |> do_something1 |> do_something2 end) end ߨٛϊʔτ ɹ&MJYJSͰ͋Ε ಉ͡ॲཧΛ ؆୯ͳஞ࣍ॲཧͱͯ͠هड़Ͱ͖Δ ʮͲ͜ͰίϯςΩετ͕ΓସΘΔʯͷ͔ߟྀ͕ෆཁ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ async function do_process(orders) { const promises
= _.map(orders, async (order) => { const result = await do_something1(order); return await do_something2(result); }); return await Promise.all(promises); } def do_process(orders) do orders |> Enum.map(fn (order) -> order |> do_something1 |> do_something2 end) end -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ def do_process(orders) do orders |> Enum.map(fn
(order) -> order |> do_something1 |> do_something2 end) end def do_process(orders) do orders |> Enum.map(&do_something1/1) |> Enum.map(&do_something2/1) end -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ def do_process(orders) do orders |> Enum.map(fn
(order) -> order |> do_something1 |> do_something2 end) end def do_process(orders) do orders |> Enum.map(&do_something1/1) |> Enum.map(&do_something2/1) end ߨٛϊʔτ ɹॲཧॱ͕มΘͬͯΑ͍ͳΒ ͜ͷΑ͏ʹهड़Ͱ͖Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ಠཱͨ͠$16Λ࣋ͭ ฒߦॲཧ Ͳ͏࣮ݱ͍ͯ͠Δͷ͔ ܰྔ ϓϩηε ܰྔ ϓϩηε
ܰྔ ϓϩηε ܰྔ ϓϩηε ʜ $16 ʜ ܰྔ ϓϩηε 04 $16 $16 &7. ܰྔϓϩηε$16 /. -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ಠཱͨ͠$16Λ࣋ͭ ฒߦॲཧ Ͳ͏࣮ݱ͍ͯ͠Δͷ͔ ܰྔ ϓϩηε ܰྔ ϓϩηε
ܰྔ ϓϩηε ܰྔ ϓϩηε ʜ $16 ʜ εϨου εέδϡʔϥʔ ʜ ʜ ܰྔ ϓϩηε 04 $16 $16 εϨου εέδϡʔϥʔ εϨου εέδϡʔϥʔ εϨου εέδϡʔϥʔ ܰྔϓϩηε$16 /. -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ಠཱͨ͠$16Λ࣋ͭ ฒߦॲཧ Ͳ͏࣮ݱ͍ͯ͠Δͷ͔ ܰྔ ϓϩηε ܰྔ ϓϩηε
ܰྔ ϓϩηε ܰྔ ϓϩηε ʜ $16 ʜ εϨου εέδϡʔϥʔ ʜ ʜ ܰྔ ϓϩηε 04 $16 $16 εϨου εέδϡʔϥʔ εϨου εέδϡʔϥʔ εϨου εέδϡʔϥʔ ܰྔϓϩηε$16 /. ߨٛϊʔτ ɹ&7.͕࣋ͭεέδϡʔϥʔ 04εϨουͱҰରҰ ɹৄࡉল͕͘ εέδϡʔϥʔຖʹλεΫͷΩϡʔΛ࣋ͪ ࣗͷ Ωϡʔ͕ۭʹͳΔͱ ଞॴͷΩϡʔ͔ΒλεΫΛୣ͏ ɹৄࡉ UIF#&".#PPL IUUQTKNQ)0&D/ ࢀর -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ಠཱͨ͠ϝϞϦΛ࣋ͭ ฒߦॲཧ ϓϩηε͝ͱʹ($͕Մೳ ($தʹίϯςΩετΛΓସ͑Մೳ ݁Ռ ($ͰγεςϜશମ͕ఀࢭ͠ͳ͍ Կ͕ྑ͍ͷ͔
ϓϩηεΛऴྃ͢ΔͱϝϞϦΛղ์Ͱ͖Δ γεςϜશମͰϝϞϦϦʔΫ͍͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ωοτϫʔΫ্ͷҰҙͳॅॴΛ࣋ͭ ฒߦॲཧ Կ͕ྑ͍ͷ͔ &7. ܰྔϓϩηε ܰྔϓϩηε ϦϯΫ
ϦϯΫ USBQ@FYJUUSVF ऴྃγάφϧ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ωοτϫʔΫ্ͷҰҙͳॅॴΛ࣋ͭ ฒߦॲཧ Կ͕ྑ͍ͷ͔ &7. ܰྔϓϩηε ܰྔϓϩηε ܰྔϓϩηε
ϦϯΫ ϦϯΫ USBQ@FYJUUSVF ࠶ىಈॲཧ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ωοτϫʔΫ্ͷҰҙͳॅॴΛ࣋ͭ ฒߦॲཧ ͱ͍͑ʁ Ұൠతͳ04্Ͱߴසʹ࠶ىಈ͢Δ ϓϩηε͕͋Δͱ૾ͯ͠΄͍͠ ϓϩηεىಈෛՙͳͲʹΑΓ োʹൃల͢Δࣄ͕ଟ͘
ආ͚Δඞཁ͕͋Δ ߨٛϊʔτ ɹߴසʹ࠶ىಈ͢Δͱ$16ෛՙ্͕͕Δ ɹ&DUP͕ґଘ͍ͯ͠Δ%#$POOFDUJPO 3FEJTΫϥΠΞϯτ 3FEJY αʔόͱίωΫγϣϯ͕Εͯ ϓϩηεΛΫϥογϡ ͤͣ ϓϩηεΛ͍ճ͢Α͏ʹͳ͍ͬͯΔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ωοτϫʔΫ্ͷҰҙͳॅॴΛ࣋ͭ ฒߦॲཧ ͱ͍͑ʁ Ұൠతͳ04্Ͱߴසʹ࠶ىಈ͢Δ ϓϩηε͕͋Δͱ૾ͯ͠΄͍͠ ϓϩηεىಈෛՙͳͲʹΑΓ োʹൃల͢Δࣄ͕ଟ͘
ආ͚Δඞཁ͕͋Δ ߨٛϊʔτ ɹଓঢ়ଶ ਖ਼ৗܥͷʮঢ়ଶʯͱͯ͠ཧ͢ΔͱΑ͍ ɹͨͩ͠ ϓϩηεΛ͍ճ͢ͱ ϓϩηεఀࢭʹΑΔϝϞϦղ์͕ ߦΘΕͳ͍ͨΊ ϝϞϦϦʔΫ͠ͳ͍Α͏ؾΛΔඞཁ͕͋Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ҆શୈҰ ฒߦॲཧ &7.ʹ04ͱࣅͨϓϩηεͷΈΛ࣋ͭ ݁Ռͱͯ͠ʜ ܰྔϓϩηεোੑͷ্ ͢ΔͨΊͷΈ ߨٛϊʔτ
ɹ &7.Λͬͯײಈͨ͠ ɹϓϩηε ҆શੑΛ୲อ͢ΔΈͩͬͨͷ͔ʂʁͱᡰʹམͪ ͨࢲ ޮԽ͚ͩΛ͍ٻΊ͍ͯͨͨΊ িܸΛड͚ͨ ɹ4-"ҏୡͰͳ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ &7.ʹ04ͱࣅͨϓϩηεͷΈΛ࣋ͭ ͞ 04ͱࣅͨ͜ͱΛ͍ͯ͠Δͷʹ͍Θ͚͕ͳ͍ ߨٛϊʔτ ɹ͕͞࠷ॏཁͳཁ݅ʹରԠ͢ΔͳΒ ةݥͳϨΠϠͰରԠ͢Δ
ɹ҆શͳڥΛ࡞Δͱ٘͞ਜ਼ʹͳΔ ɹ͔͠͠ ࡶʹίʔυΛهड़ͯ͠ෳͷ$16Λ্खͬͯ͘͘ ΕΔͷ ͋Γ͕͍ͨ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE $ +BWB /PEFKTΑΓ͍ ฒߦॲཧ &7.ʹ04ͱࣅͨϓϩηεͷΈΛ࣋ͭ ͞ IUUQTKNQ$"R",D
1ZUIPO 3VCZ 1)1ΑΓ͍ ७ਮͳҰϓϩηεʹΑΔܭࢉʜ 04ͱࣅͨ͜ͱΛ͍ͯ͠Δͷʹ͍Θ͚͕ͳ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE $ +BWB /PEFKTΑΓ͍ ฒߦॲཧ &7.ʹ04ͱࣅͨϓϩηεͷΈΛ࣋ͭ ͞ IUUQTKNQ$"R",D
1ZUIPO 3VCZ 1)1ΑΓ͍ 04ͱࣅͨ͜ͱΛ͍ͯ͠Δͷʹ͍Θ͚͕ͳ͍ ߨٛϊʔτ ɹωλ ɹ/PEFKT ଞͷಈతݴޠͱൺֱ͢Δͱ ѹతʹ͍ ɹ͜Ε ΠϕϯτɾυϦϒϯ͔ͩΒͱ͍͏ཧ༝Ͱͳ͍ ɹ7͕ؤு͍ͬͯΔ $IBDLSB$PSFͷ͜ͱෆษڧͰΒͳ͍ ७ਮͳҰϓϩηεʹΑΔܭࢉʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧͷֶशίετෆཁͰ ΄Ͳ΄Ͳʹ͘ͳ͍ ͱָͯͰ҆શͳݴޠ&MJYJS ฒߦॲཧ &7.ʹ04ͱࣅͨϓϩηεͷΈΛ࣋ͭ ݁Ռͱͯ͠ʜ ߨٛϊʔτ
ɹฐࣾͷ&SMBOHͰهड़͞ΕͨαʔϏε ࢲͷෆಙͷக͢ͱ͜Ζ Ͱ Ξϯνύλʔϯෆਖ਼ͳΞϓϩʔνͰृ͘ଠ͕ͬͨ ͦΕͰ 4-"ͷهΛߋ৽த -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ᷿Ͱᷚ͞Ε͍ͯΔྑ͍͠ ෭࡞༻͕͘͢ͳ͍ʂ σʔλॲཧʹूதʂ HPUPॲཧϑϩʔͷ໎ࢠ 00ঢ়ଶͷ໎ࢠ ߨٛϊʔτ
ɹHPUPͱ00ͷ͠ ϓϩάϥϛϯά&MJYJSͰհ͞Ε͍ͯΔ ʮͲͷΑ͏ͳܦҢͰ ͜ͷεςʔλεʹḷΓண͍ͨͷ͔ ʯ͕ղΓ ͍ͱ͍͏͠ॻ͖ํͷͰ͋Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ᷿Ͱᷚ͞Ε͍ͯΔྑ͍͠ ෭࡞༻͕͘͢ͳ͍ʂ σʔλॲཧʹूதʂ HPUPॲཧϑϩʔͷ໎ࢠ 00ঢ়ଶͷ໎ࢠ ֓೦ࣗମͷֶशʹ
ίετ͕ඞཁ ෑډ͕ߴ͗͢Δ ͔͠Կ͕خ͍͔͠ෆ໌ ᷿Ͱᷚ͞Ε͍ͯΔѱ͍͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ᷿Ͱᷚ͞Ε͍ͯΔྑ͍͠ ෭࡞༻͕͘͢ͳ͍ʂ σʔλॲཧʹूதʂ HPUPॲཧϑϩʔͷ໎ࢠ 00ঢ়ଶͷ໎ࢠ ֓೦ࣗମͷֶशʹ
ίετ͕ඞཁ ෑډ͕ߴ͗͢Δ ͔͠Կ͕خ͍͔͠ෆ໌ ᷿Ͱᷚ͞Ε͍ͯΔѱ͍͠ ߨٛϊʔτ ɹؔܕͷશͯͷಛੑ͕͍͠Θ͚Ͱͳ͍ ɹ͔͠͠ ੈؒతʹ͍͠ͱೝࣝ͞Ε͍ͯΔͣʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ᷿Ͱᷚ͞Ε͍ͯΔྑ͍͠ ෭࡞༻͕͘͢ͳ͍ʂ σʔλॲཧʹूதʂ HPUPॲཧϑϩʔͷ໎ࢠ 00ঢ়ଶͷ໎ࢠ ֓೦ࣗମͷֶशʹ
ίετ͕ඞཁ ෑډ͕ߴ͗͢Δ ͔͠Կ͕خ͍͔͠ෆ໌ ᷿Ͱᷚ͞Ε͍ͯΔѱ͍͠ A લఏ͕݅ ޡΓ ·ͯʂ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ લఏ͕݅ޡΓ ෳࡶ͕͞ഉআ͞Ε͍ͯͯ ཧղ͢ΔͨΊͷจ຺͕গͳ͍ ؔܕ༝དྷͷΈ͕গͳ͍ 00༝དྷͷΈ͕গͳ͍
&MJYJS७ਮͳؔܕͰͳ͍͔Βʜ ߨٛϊʔτ ɹଞऀͷهड़ͨ͠ίʔυΛಡΉͷָ͕ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ લఏ͕݅ޡΓ ϚΫϩʁޙ΄Ͳ͠·͢ʜ ؔܕ༝དྷͷΈ͕গͳ͍ 00༝དྷͷΈ͕গͳ͍ ෳࡶ͕͞ഉআ͞Ε͍ͯͯ
ཧղ͢ΔͨΊͷจ຺͕গͳ͍ &MJYJS७ਮͳؔܕͰͳ͍͔Βʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ લఏ͕݅ޡΓ ϚΫϩʁޙ΄Ͳ͠·͢ʜ ؔܕ༝དྷͷΈ͕গͳ͍ 00༝དྷͷΈ͕গͳ͍ ෳࡶ͕͞ഉআ͞Ε͍ͯͯ
ཧղ͢ΔͨΊͷจ຺͕গͳ͍ &MJYJS७ਮͳؔܕͰͳ͍͔Βʜ ߨٛϊʔτ ɹϚΫϩࣗମϚΫϩ༝དྷͷΈ ෳࡶ͞Λট͖͍͢ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ؔܕݴޠ͝ͱʹ७ਮ͕͞ҧ͏ ؔܕ༝དྷͷΈ͕গͳ͍ ݴޠࣗମ͕७ਮͩʂͱݴΘΕΔ݅ ࢀরಁաͳؔͰදݱͰ͖Δ͜ͱ͕ଟ͍ &MJYJS ͋·Γ
७ਮͰͳ͍ FHԋࢉࢠ ྫ֎ *0ͳͲ͕ؔͰදݱ͞Ε͍ͯΔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ؔܕݴޠ͝ͱʹ७ਮ͕͞ҧ͏ ؔܕ༝དྷͷΈ͕গͳ͍ ݴޠࣗମ͕७ਮͩʂͱݴΘΕΔ݅ ࢀরಁաͳؔͰදݱͰ͖Δ͜ͱ͕ଟ͍ &MJYJS ͋·Γ
७ਮͰͳ͍ FHԋࢉࢠ ྫ֎ *0ͳͲ͕ؔͰදݱ͞Ε͍ͯΔ ߨٛϊʔτ ɹ͋·Γ७ਮͰͳ͍͘͠ ७ਮͰͳ͍Α͏ʹݟ͔͚͍ͤͯ Δ७ਮͰ͋Δ͜ͱͷԸܙଟ͋͘Δ͕ ͜͜Ͱݴ͍͍ͨͷ ؔ ܕݴޠʹ׳Ε͍ͯͳ͍ํʑʹରͯ͠ &MJYJS͘͠ͳ͍ͱ͍͏ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ for n <- 1..3 do
end ܁Γฦ͠ ͘͠ ݟ͔͚͍ͤͯΔʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ for n <- 1..3 do
if n == 2 do end end ܁Γฦ͠ ݅ذ ͘͠ ݟ͔͚͍ͤͯΔʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ try do for n <-
1..3 do if n == 2 do throw :break end end catch :break -> :ok end ܁Γฦ͠ ݅ذ ྫ֎ ͘͠ ݟ͔͚͍ͤͯΔʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ try do for n <-
1..3 do if n == 2 do throw :break end IO.puts "number is #{n}” end catch :break -> :ok end ܁Γฦ͠ ݅ذ ྫ֎ ೖग़ྗ ͘͠ ݟ͔͚͍ͤͯΔʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ try do for n <-
1..3 do if n == 2 do throw :break end IO.puts "number is #{n}” end catch :break -> :ok end ܁Γฦ͠ ݅ذ ྫ֎ ೖग़ྗ ˞ඇਪͳॻ͖ํ ͘͠ ݟ͔͚͍ͤͯΔʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ try do for n <-
1..3 do if n == 2 do throw :break end IO.puts "number is #{n}” end catch :break -> :ok end ܁Γฦ͠ ݅ذ ྫ֎ ೖग़ྗ ˞ඇਪͳॻ͖ํ ͘͠ ݟ͔͚͍ͤͯΔʜ ߨٛϊʔτ ɹ܁Γฦ͠ ݅ذ ྫ֎ॲཧͳͲΛ༻͍ͯίʔυ͕هड़Ͱ͖Δ ɹͨͩ͠ ͜ΕΒΛෳࡶʹΈ߹ΘͤΔͷͰ ैདྷͷଞͷݴޠͱ ԿมΘΒͳ͍&MJYJSͷֶशΛਐΊΔʹै͍ ΑΓ͔Γ͘͢ ؆ܿʹίʔυΛهड़Ͱ͖ΔΑ͏ʹͳΔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ Ͱ &MJYJSΒ͕͠͞ᕷΈग़ͨίʔυͷಡΈॻ͖ʹ ֶशίετ͕ඞཁͰ͠ΐ͏ ଟ
ͦΜͳʹେมͰͳ͍ʜ ͓͢͢Ίͷ ֶशํ๏ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 ͜ΕҎ߱ͷεϥΠυΛิࢿྉʹͯ͠ ϓϩάϥϛϯά&MJYJSQΛಡΉ
ຊରԠͷݪॻΛಡΜͰ΄͍͠ ߨٛϊʔτ ɹ͜ͷຊʮ&MYJSΒ͠͞ʯΛֶͿͷʹ࠷ద ɹബ͍ຊʹ&MJYJSͷࢥ͕ೱॖ͞Ε͍ͯΔͨΊ ඞಡ ɹશͯΛಡΉඞཁͳ͘ ͜ͷεϥΠυΛิࢿྉͱͯ͠ ϖʔδΛಡΉ͜ͱ͔Β࢝ΊΔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 IUUQTEFWUPHVNJFMJYJS ϓϩηε
ϓϩτίϧ ϏϔΠϏΞ ΛಡΈඈ͢ ͜ΕҎ߱ͷεϥΠυΛิࢿྉʹͯ͠ ϓϩάϥϛϯά&MJYJSQΛಡΉ ຊରԠͷݪॻΛಡΜͰ΄͍͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 IUUQTEFWUPHVNJFMJYJS ϓϩηε
ϓϩτίϧ ϏϔΠϏΞ ΛಡΈඈ͢ ͜ΕҎ߱ͷεϥΠυΛิࢿྉʹͯ͠ ϓϩάϥϛϯά&MJYJSQΛಡΉ ຊରԠͷݪॻΛಡΜͰ΄͍͠ ߨٛϊʔτ ɹ&MJYJSެࣜαΠτͷHFUUJOHTUBSUFEͷ༁ ɹ ্ڃऀ͚ͷ༰Ͱ͋ΔͨΊ ಡΈඈͯ͠Α͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 IUUQTEFWUPHVNJFMJYJS ϓϩηε
ϓϩτίϧ ϏϔΠϏΞ ΛಡΈඈ͢ IUUQTFMJYJSTDIPPMDPNKB جૅͷষ͚ͩಡΉ ͜ΕҎ߱ͷεϥΠυΛิࢿྉʹͯ͠ ϓϩάϥϛϯά&MJYJSQΛಡΉ ຊରԠͷݪॻΛಡΜͰ΄͍͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 IUUQTEFWUPHVNJFMJYJS ϓϩηε
ϓϩτίϧ ϏϔΠϏΞ ΛಡΈඈ͢ IUUQTFMJYJSTDIPPMDPNKB جૅͷষ͚ͩಡΉ ͜ΕҎ߱ͷεϥΠυΛิࢿྉʹͯ͠ ϓϩάϥϛϯά&MJYJSQΛಡΉ ຊରԠͷݪॻΛಡΜͰ΄͍͠ ߨٛϊʔτ ɹ&MJYJS4DIPPMͷ༁ ɹجૅͷষ͔Β࢝ΊΔ ɹ&MJYJSެࣜαΠτͷHFUUJOHTUBSUFEΑΓ આ໌ॱʹηϯεΛײ ͡Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 IUUQTEFWUPHVNJFMJYJS ϓϩηε
ϓϩτίϧ ϏϔΠϏΞ ΛಡΈඈ͢ IUUQTFMJYJSTDIPPMDPNKB جૅͷষ͚ͩಡΉ IUUQTIFYEPDTQNQIPFOJYPWFSWJFXIUNM 6QBOE3VOOJOH͔Β࢝ΊΔ ͡Ί $IBOOFMT 1SFTFODFΛಡΈඈ͢ ͜ΕҎ߱ͷεϥΠυΛิࢿྉʹͯ͠ ϓϩάϥϛϯά&MJYJSQΛಡΉ ຊରԠͷݪॻΛಡΜͰ΄͍͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 IUUQTEFWUPHVNJFMJYJS ϓϩηε
ϓϩτίϧ ϏϔΠϏΞ ΛಡΈඈ͢ IUUQTFMJYJSTDIPPMDPNKB جૅͷষ͚ͩಡΉ IUUQTIFYEPDTQNQIPFOJYPWFSWJFXIUNM 6QBOE3VOOJOH͔Β࢝ΊΔ ͡Ί $IBOOFMT 1SFTFODFΛಡΈඈ͢ ͜ΕҎ߱ͷεϥΠυΛิࢿྉʹͯ͠ ϓϩάϥϛϯά&MJYJSQΛಡΉ ຊରԠͷݪॻΛಡΜͰ΄͍͠ ߨٛϊʔτ ɹ͜Ε͚ͩ༁ଘࡏ͠ͳ͍ ɹҰൠతͳ8FCαʔϏεͷ։ൃͰ͋Ε $IBOOFMT 1SFTFODFͷ߲ΛಡΈඈͯ͠Α͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS ΛಡΉલʹʜ Ϧετ &OVN ύΠϓϥΠϯ EP
ߨٛϊʔτ ʮϓϩάϥϛϯάͱσʔλΛม͢Δ͜ͱʯͱ͍͏͕͠ ϓϩ άϥϛϯά&MJYJSͰհ͞Ε͍ͯΔ͕ Ϧετ &OVNϞδϡʔϧ ύΠϓϥΠϯԋࢉࢠ ·͞ʹσʔλมͷಓ۩࢝Ίʹ ͜͜ʹֶ शίετΛࢧ͏ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &OVNͱGPSʹӅΕ͍ͯΔ͕ʜ Ϧετ ਖ਼͘͠ཧղͯ͠׆༻͢ΔͨΊʹ ׆༻ͷ伴 ߏͱ ࠶ؼ
˞Մಡੑ&OVNͱGPS࠶ؼ ߨٛϊʔτ ɹ࠶ؼΛ͍͜ͳ͢ͱ දݱͷࣗ༝͕͕Δ͕ Մಡੑ͕མͪΔ ɹGPS&OVNͰཁ݅ΛຬͨͤΔ߹ ͦͪΒΛ͏͜ͱ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ ߨٛϊʔτ ɹϓϩάϥϛϯά&JMYJSؚΊ ͳ͔ͥ&MJYJSͷೖจॻ Ϧετ ߏͷઆ໌Λ؆қʹࡁ·ͤΔ͕͋Δ
ɹ&SMBOHͷೖจॻʹ खް͍આ໌͕͋Γ ࢲ͕ࣗͦΕʹॿ͚ ΒΕ͍ͯΔͨΊ ͜͜ͰऔΓ্͛Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ [1 | 2]
ϖΞͱ͍͏ߏ͕͋Δ ߨٛϊʔτ ɹϖΞߏͷӈͱࠨ ͲͷΑ͏ͳܕΛೖΕͯڐ͞ΕΔ ɹ͜ͷྫͷϖΞ ͱͷϖΞ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ [1 | 2]
ϖΞͱ͍͏ߏ͕͋Δ [1] -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ [1 | 2]
[1] = [1 | []] ϖΞͱ͍͏ߏ͕͋Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ [1 | 2]
[1] = [1 | []] ϖΞͱ͍͏ߏ͕͋Δ ϦετͱϖΞͰ࡞ͬͨ ϦϯΫϦετ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ [1 | 2]
[1] = [1 | []] ϖΞͱ͍͏ߏ͕͋Δ ϦετͱϖΞͰ࡞ͬͨ ϦϯΫϦετ ߨٛϊʔτ ɹ<>ͱ͍͏දݱ <c<>>ͷҥߏจ ɹ<> ͱۭϦετͷϖΞ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ [1 | 2]
[1] = [1 | []] ϖΞͱ͍͏ߏ͕͋Δ ϦετͱϖΞͰ࡞ͬͨ ϦϯΫϦετ [1, 2, 3] -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ [1, 2, 3]
= [1 | [2 | [3 | []]]] [1 | 2] [1] = [1 | []] ϖΞͱ͍͏ߏ͕͋Δ ϦετͱϖΞͰ࡞ͬͨ ϦϯΫϦετ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ t1 = [1 |
[2 | []]] U t2 = [0 | t1] U -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ t1 = [1 |
[2 | []]] U t2 = [0 | t1] U ઌ಄ʹཁૉΛՃ ͱͯૣ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ defmodule Test do def puts([])
do IO.puts("finish") end def puts([n | tail]) do IO.puts("number is #{n}") puts(tail) end end Test.puts([1, 2, 3]) -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ defmodule Test do def puts([])
do IO.puts("finish") end def puts([n | tail]) do IO.puts("number is #{n}") puts(tail) end end Test.puts([1, 2, 3]) -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ defmodule Test do def puts([])
do IO.puts("finish") end def puts([n | tail]) do IO.puts("number is #{n}") puts(tail) end end Test.puts([1, 2, 3]) Ұप O UBJM -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ defmodule Test do def puts([])
do IO.puts("finish") end def puts([n | tail]) do IO.puts("number is #{n}") puts(tail) end end Test.puts([1, 2, 3]) Ұप O UBJM ೋप O UBJM -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ ࡾप O UBJM defmodule
Test do def puts([]) do IO.puts("finish") end def puts([n | tail]) do IO.puts("number is #{n}") puts(tail) end end Test.puts([1, 2, 3]) -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ ࡾप O UBJM ࢛प
<> defmodule Test do def puts([]) do IO.puts("finish") end def puts([n | tail]) do IO.puts("number is #{n}") puts(tail) end end Test.puts([1, 2, 3]) -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ Ϧετ ࡾप O UBJM ࢛प
<> defmodule Test do def puts([]) do IO.puts("finish") end def puts([n | tail]) do IO.puts("number is #{n}") puts(tail) end end Test.puts([1, 2, 3]) ߨٛϊʔτ ɹ͜ͷ࠶ؼͷྫΛ ͜ͷઆ໌͚ͩͰཧղͰ͖ͳ͘ͱΑ͍ ɹ͜ͷิઆ໌Λͱʹ ϓϩάϥϛϯά&MJYJSͷϦετͱ࠶ؼͷ ߲ΛಡΉͱ ཧղ͍͢͠ ɹϓϩάϥϛϯά&MJYJSͱ͜ͷઆ໌Λ ͍ͬͨΓ͖ͨΓͰཧղ͢Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &OVN _.filter(list, (elem) => {}) .map((elem)
=> {}) .sortBy((elem) => {}); -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ _.filter(list, (elem) => {}) .map((elem) =>
{}) .sortBy((elem) => {}); list |> Enum.filter(fn (elem) -> end) |> Enum.map(fn (elem) -> end) |> Enum.sort(fn (elem) -> end) &MJYJSͩͱʜ &OVN -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ _.filter(list, (elem) => {}) .map((elem) =>
{}) .sortBy((elem) => {}); list |> Enum.filter(fn (elem) -> end) |> Enum.map(fn (elem) -> end) |> Enum.sort(fn (elem) -> end) &MJYJSͩͱʜ &OVN ߨٛϊʔτ ɹಉ͡Α͏ͳ໊લͱػೳͷྫ ɹ+BWB4DSJQUͰ&MJYJSͰಉ͡Α͏ʹهड़Ͱ͖Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ % wc -l */**.ex | tail
-1 39053 total % ag Enum | awk 'match($0, /Enum\.[a-z_\?]+/) {print substr($0, RSTART, RLENGTH)}' \ | sort | uniq -c | sort -nr | head -20 237 Enum.map 96 Enum.filter 37 Enum.into 30 Enum.group_by 24 Enum.reduce 22 Enum.empty? 18 Enum.sort 15 Enum.sum 12 Enum.reject 11 Enum.at 6 Enum.uniq 6 Enum.take 6 Enum.map_reduce 6 Enum.join 6 Enum.count 5 Enum.sort_by 5 Enum.reverse 4 Enum.random 4 Enum.flat_map 4 Enum.find -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ % wc -l */**.ex | tail
-1 39053 total % ag Enum | awk 'match($0, /Enum\.[a-z_\?]+/) {print substr($0, RSTART, RLENGTH)}' \ | sort | uniq -c | sort -nr | head -20 237 Enum.map 96 Enum.filter 37 Enum.into 30 Enum.group_by 24 Enum.reduce 22 Enum.empty? 18 Enum.sort 15 Enum.sum 12 Enum.reject 11 Enum.at 6 Enum.uniq 6 Enum.take 6 Enum.map_reduce 6 Enum.join 6 Enum.count 5 Enum.sort_by 5 Enum.reverse 4 Enum.random 4 Enum.flat_map 4 Enum.find ߨٛϊʔτ ɹωλ ɹ࣮ϓϩδΣΫτͰ༻ճΛूܭͯ͠Έͨ ɹNBQͷ༻ճ͕μϯτπͰଟ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &OVN Α͘͏ͷ͔Β֮͑Δ FHϓϩάϥϛϯά&MJYJS &MJYJS4DIPPM Ͱհ͞Ε͍ͯΔؔͳͲ αϑΟοΫεΛ֮͑Δ
@CZ @XIJMF @FWFSZ ߨٛϊʔτ ɹ&OVNΑΓGPSͷՄಡੑ͕ߴ͍͜ͱ͕͋ΔpMUFS@NBQͱ͍͏ ͕ؔ&OVN͔Βআ͞Εͨ͜ͱ͕͋Γ আཧ༝GPSΛ͑ ɹઌ΄Ͳͷ࣮ϓϩδΣΫτͰݕࡧ͢Δͱ GPSͷ༻ճ ݅Ͱ NBQͷ࣍ʹ༻ճ͕ଟ͍݁Ռͱͳͬͨ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ ߨٛϊʔτ ɹJFYΛ4IFMMͱߟ͑Δͱ ύΠϓϥΠϯԋࢉࢠͷଘࡏ ຯΘ͍͕ ਂ͍
ɹઌ΄Ͳͷ࣮ϓϩδΣΫτͰ༻ճΛௐΔͱ݅ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ |> GumiInc.elixirͷܦݧΛՃ͢Δ
ߨٛϊʔτ ɹωλ ɹ͋͟ͱ͍ྫͰਃ͠༁ͳ͍&MJYJS'FTU ݄ ɹม໊ͱ໊ؔ ϚϧνόΠτจࣈΛ༻Ͱ͖Δ ɹϞδϡʔϧ໊ ϚϧνόΠτจࣈΛ༻Ͱ͖ͳ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ |> GumiInc.elixirͷܦݧΛՃ͢Δ
ύΠϓϥΠϯͷଘࡏҙٛՄಡੑͷ্ঢ GumiInc.elixirͷܦݧΛՃ͢Δ( ElixirFest2019.elixirͷࣝΛՃ͢Δ(زా) ) -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ |> GumiInc.elixirͷܦݧΛՃ͢Δ
ύΠϓϥΠϯͷଘࡏҙٛՄಡੑͷ্ঢ GumiInc.elixirͷܦݧΛՃ͢Δ( ElixirFest2019.elixirͷࣝΛՃ͢Δ(زా) ) -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ ύΠϓϥΠϯͷଘࡏҙٛ ύΠϓϥΠϯ͕͑ΔΑ͏ʹؔΛఆٛ͢Δบ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ
|> GumiInc.elixirͷܦݧΛՃ͢Δ ؔఆٛʹҰ؏ੑ͕ੜ͡Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ ύΠϓϥΠϯͷଘࡏҙٛ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ |>
GumiInc.elixirͷܦݧΛՃ͢Δ ؔఆٛʹҰ؏ੑ͕ੜ͡Δ ύΠϓϥΠϯ͕͑ΔΑ͏ʹؔΛఆٛ͢Δบ ୈҰҾૢ࡞લσʔλ ɹΓૢ࡞ޙσʔλ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ ύΠϓϥΠϯͷଘࡏҙٛ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ |>
GumiInc.elixirͷܦݧΛՃ͢Δ ศརྑ͍श׳ ؔఆٛʹҰ؏ੑ͕ੜ͡Δ ύΠϓϥΠϯ͕͑ΔΑ͏ʹؔΛఆٛ͢Δบ ୈҰҾૢ࡞લσʔλ ɹΓૢ࡞ޙσʔλ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ ύΠϓϥΠϯͷଘࡏҙٛ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ |>
GumiInc.elixirͷܦݧΛՃ͢Δ ศརྑ͍श׳ ؔఆٛʹҰ؏ੑ͕ੜ͡Δ ύΠϓϥΠϯ͕͑ΔΑ͏ʹؔΛఆٛ͢Δบ ୈҰҾૢ࡞લσʔλ ɹΓૢ࡞ޙσʔλ ߨٛϊʔτ ɹҰ؏ੑ͕͋Δ͔Β ༷͕༧ଌ͍͢͠ ɹศརͱྑ͍श׳ͷྑ॥ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ύΠϓϥΠϯ ύΠϓϥΠϯͷଘࡏҙٛ زా |> ElixirFest2019.elixirͷࣝΛՃ͢Δ |>
GumiInc.elixirͷܦݧΛՃ͢Δ ศརྑ͍श׳ ؔఆٛʹҰ؏ੑ͕ੜ͡Δ ύΠϓϥΠϯ͕͑ΔΑ͏ʹؔΛఆٛ͢Δบ ୈҰҾૢ࡞લσʔλ ɹΓૢ࡞ޙσʔλ ߨٛϊʔτ ωλ ɹ1ZUIPOͷTPSUFEୈҰҾ͕*UFSBCMFͰ NBQୈೋҾ ͕*UFSBCMFࢲ TPSUFEͷҾΛΑؒ͘ҧ͑Δ ɹTPSUFEʹؔ͢ LFZΛฦ͔͢Βͩͱࢥ͏͕ʜਏ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ EPͷ๏ଇ ೦಄ʹ͓͘ͱ༷ʑͳߏจΛཧղ͍͢͠ EP FHEFGNPEVMF EFG DBTF
JG GPSͳͲ EPϒϩοΫΛҾʹͱΔͷ มͷείʔϓΛ࣋ͭ Γ Λ࣋ͭ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ defmodule Test do def test do
a = 1 b = if :true do a = 2 a end {a, b} end end {1, 2} = Test.test EP -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ defmodule Test do def test do
a = 1 b = if :true do a = 2 a end {a, b} end end {1, 2} = Test.test EP EFGͷείʔϓ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ defmodule Test do def test do
a = 1 b = if :true do a = 2 a end {a, b} end end {1, 2} = Test.test EP JGͷΓ EFGͷείʔϓ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ defmodule Test do def test do
a = 1 b = if :true do a = 2 a end {a, b} end end {1, 2} = Test.test EP JGͷείʔϓ JGͷΓ EFGͷείʔϓ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ defmodule Test do def test do
a = 1 b = if :true do a = 2 a end {a, b} end end {1, 2} = Test.test EP JGͷΓ JGͷείʔϓ B C EFGͷείʔϓ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ defmodule Test do def test do
a = 1 b = if :true do a = 2 a end {a, b} end end {1, 2} = Test.test EP JGͷείʔϓ B C ߨٛϊʔτ ɹϒϩοΫʹείʔϓͱΓ͕͋ΔͨΊ ϒϩοΫωετͷਂ͍ͱ ͜ΖͰ ্ҐϒϩοΫͷมΛ࠶ଋറ ͢Δඞཁ͕ͳ͍cͰ͖ͳ͍ ɹΑͬͯʮ͜ͷ Ͳ͔͜Βདྷͨͷ͔ʁʯΛௐΔख͕ؒݮΓ Մ ಡੑ্͕͕Δ JGͷΓ EFGͷείʔϓ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ ϓϩάϥϛϯά&MJYJS ΛಡΉલʹʜ Ϧετ &OVN ύΠϓϥΠϯ EP
ߨٛϊʔτ ɹϓϩάϥϛϯά&MJYJSΛಡΉલ ͘͠ಡΜͩޙʹ ิࢿྉͱ ͯ͠ ͜ͷεϥΠυͷϦετ &OVN ύΠϓϥΠϯ EPͷઆ໌Λಡ Έฦ͢ͱ ཧղ͕ਂ·Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ Ͱ &MJYJSΒ͕͠͞ᕷΈग़ͨίʔυͷಡΈॻ͖ʹ ֶशίετ͕ඞཁͰ͠ΐ͏ ଟ
ͦΜͳʹେมͰͳ͍ʜ ͓͢͢Ίͷ ֶशํ๏ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕ &MJYJS͋·Γ७ਮͰͳ͍ Ͱ &MJYJSΒ͕͠͞ᕷΈग़ͨίʔυͷಡΈॻ͖ʹ ֶशίετ͕ඞཁͰ͠ΐ͏ ଟ
ͦΜͳʹେมͰͳ͍ʜ ͓͢͢Ίͷ ֶशํ๏ ϓϩάϥϛϯά&MJYJS &MJYJSೖ &MJYJS4DIPPM 1IPFOJY(6*%&4 ߨٛϊʔτ ɹؔܕͱ͍ͬͯ ͦΕ΄Ͳ&MJYJS͘͠ͳ͍ ɹͥͻ ؾܰʹೖͯ͠΄͍͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ֶशίετΛׂ͘ Ϧετͷѻ͍ํ ͠Β͘ ֶशίετΛׂ͔ͳ͍ ฒߦॲཧશൠ ϚΫϩશൠ
ϏϔΠϏΞͱϓϩτίϧ ֶͿ͜ͱΛऔࣺબֶͯ͠शίετΛԼ͛Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ฒߦॲཧ ֶशίετΛׂ͘ Ϧετͷѻ͍ํ ͠Β͘ ֶशίετΛׂ͔ͳ͍ ฒߦॲཧશൠ ϚΫϩશൠ
ϏϔΠϏΞͱϓϩτίϧ ֶͿ͜ͱΛऔࣺબֶͯ͠शίετΛԼ͛Δ ߨٛϊʔτ ɹϚΫϩ ϏϔΠϏΞ ϓϩτίϧ ֶशΛޙճ͠ʹͯ͠ྑ͍ཧ༝ ࣌ؒͷ߹Ͱઆ໌͍ͯ͠ͳ͍खʹઆ໌͢Δͱ 8FCγεςϜ ͷ։ൃʹݶఆ͢Δͱ ৽ͨʹ ࣗ࡞ͷ͜ΕΒΛఆٛ͠ͳ͘ͱ ։ൃ Ͱ͖Δ͔Β -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ֶशίετ͕ߴ͍ ҆શੑ͕ߴ͘ ੜ࢈ੑ͕ߴ͘ ͦΕҎ֎ͷੑ࣭ ΄Ͳྑ͍ ࠓͨ͜͠ͱ
ߴ͘͘ͳ͍ 8FCγεςϜͷ։ൃͳΒ Ճ͑ͯʜ ྑ͍͜ͱѱ͍͜ͱ͢ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ֶशίετ͕ߴ͍ &MJYJSֶशίετͷׂʹ Ըܙ͕େ͖͍ ࣋ͪؼͬͯ΄͍͜͠ͱ ҆શੑ͕ߴ͘ ੜ࢈ੑ͕ߴ͘
ͦΕҎ֎ͷੑ࣭ ΄Ͳྑ͍ ࠓͨ͜͠ͱ ߴ͘͘ͳ͍ 8FCγεςϜͷ։ൃͳΒ Ճ͑ͯʜ ྑ͍͜ͱѱ͍͜ͱ͢ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ ඵఆ ࣍ &7.ͷ ฒߦॲཧ ʹ͍ͭͯ ఆ
&MJYJSͷ ؔܕ ʹ͍ͭͯ ఆ ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࢲ͕Ѫ͢Δ Elixir/Erlang ͷָ͠͞ͱਏ͞ Developers Summit 2019 15-D-5
͜ΕΛ·ͩΒͳ͍8FCΤϯδχΞଃΔ ݄ HVNJ*OD$50زాխਔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࢲ͕Ѫ͢Δ Elixir/Erlang ͷ ਏ͞ Developers Summit 2019
15-D-5 (ཪ) ͜ΕΛ·ͩΒͳ͍8FCΤϯδχΞଃΔ ݄ HVNJ*OD$50زాխਔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ࠓͷ͠ ೖલ ೖޙ શʹཧղͨ͠ νϣοτσΩϧ &MJYJSཧղ ઌ΄Ͳͷλʔήοτ
ઌ΄Ͳͷ͠ ͜ͷ͠ͷλʔήοτ ͜ͷ͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 051ߴػೳ ίʔυͷϗοτεϫοϓʂ ΫϥελϦϯά ࢄ%#උ ΦϯϝϞϦʔϞʔυͳΒ45. &SMBOH5FSNͰͳΜͰγϦΞϥΠζ
ͦͯ͠ωοτϫʔΫӽ͠ʹసૹʂ ؔͩͬͯૹΕͪΌ͏ 051051 ઌਓͷܙͷू HSPVQMFBEFSೖΕସ͑ͯ ଞϊʔυʹϩάग़ྗ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 051ߴػೳ ίʔυͷϗοτεϫοϓʂ ΫϥελϦϯά ࢄ%#උ ΦϯϝϞϦʔϞʔυͳΒ45. &SMBOH5FSNͰͳΜͰγϦΞϥΠζ
ͦͯ͠ωοτϫʔΫӽ͠ʹసૹʂ ؔͩͬͯૹΕͪΌ͏ 051051 ઌਓͷܙͷू HSPVQMFBEFSೖΕସ͑ͯ ଞϊʔυʹϩάग़ྗ ߨٛϊʔτ ɹ͜ΕͰණࢁͷҰ֯ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 051ߴػೳ ίʔυͷϗοτεϫοϓʂ ΫϥελϦϯά ࢄ%#උ ΦϯϝϞϦʔϞʔυͳΒ45. &SMBOH5FSNͰͳΜͰγϦΞϥΠζ
ͦͯ͠ωοτϫʔΫӽ͠ʹసૹʂ ؔͩͬͯૹΕͪΌ͏ 051051 ઌਓͷܙͷू ͋Δͱ͍ͨ͘ͳΓ·͢ΑͶʁ HSPVQMFBEFSೖΕସ͑ͯ ଞϊʔυʹϩάग़ྗ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 051ߴػೳ ίʔυͷϗοτεϫοϓʂ ΫϥελϦϯά ࢄ%#උ ΦϯϝϞϦʔϞʔυͳΒ45. &SMBOH5FSNͰͳΜͰγϦΞϥΠζ
ͦͯ͠ωοτϫʔΫӽ͠ʹసૹʂ ؔͩͬͯૹΕͪΌ͏ 051051 ઌਓͷܙͷू ͋Δͱ͍ͨ͘ͳΓ·͢ΑͶʁ HSPVQMFBEFSೖΕସ͑ͯ ଞϊʔυʹϩάग़ྗ 8FCγεςϜ։ൃͰ ΄΅ ඞཁͳ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 8FCγεςϜ։ൃͰ ΄΅ඞཁͳ͍ 051ߴػೳ "1*αʔόΛ&MJYJSͰॻ͘ ཧ༝
͖ͬͨ͞͠ "1*αʔόεςʔτϨεʹͯ͠ΦʔτεέʔϦϯάʹରԠ͢Δ Ωϟογϡ%#ͳͲ طΛ͏ &MJYJSͷ༻్ΛׂΓΔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 8FCγεςϜ։ൃͰ ΄΅ඞཁͳ͍ 051ߴػೳ "1*αʔόΛ&MJYJSͰॻ͘ ཧ༝
͖ͬͨ͞͠ "1*αʔόεςʔτϨεʹͯ͠ΦʔτεέʔϦϯάʹରԠ͢Δ Ωϟογϡ%#ͳͲ طΛ͏ &MJYJSͷ༻్ΛׂΓΔ ࢲͷϞνϕʔγϣϯ ָΛ͍ͨ͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 8FCγεςϜ։ൃͰ ΄΅ඞཁͳ͍ 051ߴػೳ "1*αʔόΛ&MJYJSͰॻ͘ ཧ༝
͖ͬͨ͞͠ "1*αʔόεςʔτϨεʹͯ͠ΦʔτεέʔϦϯάʹରԠ͢Δ Ωϟογϡ%#ͳͲ طΛ͏ &MJYJSͷ༻్ΛׂΓΔ ࢲͷϞνϕʔγϣϯ ָΛ͍ͨ͠ ߨٛϊʔτ ɹ"1*αʔόͷ։ൃͱӡ༻ͰָΛ͍ͨ͠ͷ ϏδωεͳͲʹूத ͍͔ͨ͠Β -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ΫϥελϦϯά &54 %&54 .OFTJB ίʔυϗοτεϫοϓ ͜ͷลΓΛஅࣺͯ͠Α͍
&MJYJSͷ༻్ΛׂΓΔ ͬͱ͋Δ͔ʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 &54 %&54 .OFTJB ͍͢͝&SMBOHΏ͔͍ʹֶ΅͏ ͜ΕΒͷྑ͍͞ํʜ Λ֬͝ೝ͍ͩ͘͞
ߨٛϊʔτ ɹ&54 ΦϯϝϞϦ%# %&54 ΦϯσΟεΫ%# .OFTJB &54ͱ%&54ͷ্ʹߏங͞Εͨࢄ%# -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 &54 %&54 .OFTJB ͍͢͝&SMBOHΏ͔͍ʹֶ΅͏ ͜ΕΒͷྑ͍͞ํʜ Λ֬͝ೝ͍ͩ͘͞
εςʔλεΛڞ༗͢Δखஈ ߨٛϊʔτ ɹ&54 Ωϟογϡ༻్ʹศར͕ͩ ڞ༗ϝϞϦͰεϨουϓϩ άϥϛϯά͢ΔੈքʹٯΓ͢Δ ɹ.OFTJB "1*αʔόʹ%#ͷϩʔϧΛ୲ΘͤΔͨΊ αʔό ͷΦʔτεέʔϦϯάͷқΛ্͛Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 &54 %&54 .OFTJB ͍͢͝&SMBOHΏ͔͍ʹֶ΅͏ ͜ΕΒͷྑ͍͞ํʜ Λ֬͝ೝ͍ͩ͘͞
εςʔλεΛڞ༗͢Δखஈ ߨٛϊʔτ ɹ"1*αʔόΛ࡞Δ͚ͩͳΒ ແବͳෳࡶੑΛγεςϜʹݺͼࠐ· ͳ͍Α͏ ར༻ආ͚Δ͜ͱ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 &54 %&54 .OFTJB ͍͢͝&SMBOHΏ͔͍ʹֶ΅͏ ͜ΕΒͷྑ͍͞ํʜ Λ֬͝ೝ͍ͩ͘͞
εςʔλεΛڞ༗͢Δखஈ ߨٛϊʔτ ɹ&54 &DUPͰ1SFQBSFͨ͠%#2VFSZΛҰϊʔυͰ Ωϟογϡ͍ͯ͠ճ͢ͳͲʹར༻͞Ε͍ͯΔ ɹ&MJYJSೖޙ ͜ͷΑ͏ͳνϡʔχϯάΛ࣮͋ΔϥΠϒϥϦ ʹͤΔ͜ͱ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ΫϥελϦϯά &54 %&54 .OFTJB ίʔυϗοτεϫοϓ ͜ͷลΓΛஅࣺͯ͠Α͍
&MJYJSͷ༻్ΛׂΓΔ ͬͱ͋Δ͔ʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ΫϥελϦϯά &54 %&54 .OFTJB ίʔυϗοτεϫοϓ ͜ͷลΓΛஅࣺͯ͠Α͍
&MJYJSͷ༻్ΛׂΓΔ ͬͱ͋Δ͔ʜ ߨٛϊʔτ ɹΫϥελϦϯάͷ͠লུ͢Δ ɹΦʔτεέʔϦϯάͷқ্͕͕ΔͨΊ આ໌͢Δ·Ͱͳ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
ߨٛϊʔτ ɹؔΛ࠶ؼ͢Δࡍ Ϟδϡʔϧ໊ΛؚΉϑϧωʔϜͰධՁ͢Δͱ ίʔυϗοτεϫοϓͱͳΔ ɹҰݟ͢Δͱ ඇৗʹ୯७ͳΈ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
IUUQTIBQQJHJUIVCJPUIF#FBN#PPL -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
IUUQTIBQQJHJUIVCJPUIF#FBN#PPL ϓϩηεΛӽڥͯ͠ίʔυϗοτεϫοϓ͕ γεςϜશମʹద༻͞Ε͍ͯΔࣄྫ Έͨ͜ͱͳ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
IUUQTIBQQJHJUIVCJPUIF#FBN#PPL ϓϩηεΛӽڥͯ͠ίʔυϗοτεϫοϓ͕ γεςϜશମʹద༻͞Ε͍ͯΔࣄྫ Έͨ͜ͱͳ͍ ߨٛϊʔτ ɹUIF#&".#PPLͰ͢Β ͜Μͳ͜ͱ͕هड़͞Ε͍ͯΔ ɹ͔͠ ίʔυϗοτεϫοϓ͕ଘࡏ͢Δ͔Β &SMBOH੩తܕ ͚ʹͰ͖ͳ͍ͱ͍͏୰͖ఴ͑ΒΕ͍ͯΔ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
IUUQTIBQQJHJUIVCJPUIF#FBN#PPL ϓϩηεΛӽڥͯ͠ίʔυϗοτεϫοϓ͕ γεςϜશମʹద༻͞Ε͍ͯΔࣄྫ Έͨ͜ͱͳ͍ ߨٛϊʔτ ɹىಈ͍ͯ͠Δϓϩηεશͯʹରͯ͠ ᘳʹίʔυϗοτεϫοϓ ʹରԠ͍ͯ͠Δͱอূ͢ΔίετΑΓ ࠶ىಈίετͷํ͕͍ ɹαʔϏεͷແఀࢭΛ࣮ݱ͢ΔͳΒ #MVF(SFFO%FQMPZͰΑ ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
IUUQTIBQQJHJUIVCJPUIF#FBN#PPL ϓϩηεΛӽڥͯ͠ίʔυϗοτεϫοϓ͕ γεςϜશମʹద༻͞Ε͍ͯΔࣄྫ Έͨ͜ͱͳ͍ ߨٛϊʔτ ɹEJTUJMMFSZͷVQHSBEF͕ػೳ͢Δύλʔϯ͋Δ ɹ͔͠͠ ͋ΔύλʔϯͰػೳ͢Δ͔Β͏ ͋ΔύλʔϯͰػ ೳ͠ͳ͍͔Β࠶ىಈ͢Δʜͱ͍͏ذ͕ଘࡏ͢Δͱ ӡ༻ίετ͕ ্͕Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
IUUQTIBQQJHJUIVCJPUIF#FBN#PPL ϓϩηεΛӽڥͯ͠ίʔυϗοτεϫοϓ͕ γεςϜશମʹద༻͞Ε͍ͯΔࣄྫ Έͨ͜ͱͳ͍ ߨٛϊʔτ ɹྫ͑ "1*αʔόͰ పఈతʹࣗ࡞ϓϩηεͷ༻Λආ͚ͨͱ͠ ͯ ґଘ͍ͯ͠ΔEFQTΛߋ৽͢Δ߹ ଞਓͷίʔυ͕ίʔυϗ οτεϫοϓʹରԠ͍ͯ͠Δ͔֬ೝ͢Δඞཁ͕͋ΔରԠ͍ͯ͠ͳ͚ Ε ࠶ىಈͱͳΔຖճ அίετ͕ൃੜ͍ͯ͠Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ίʔυϗοτεϫοϓ ϓϩηεඌ࠶ؼ͍ͯ͠Δؔ ίʔυϗοτεϫοϓ ඌ࠶ؼ͢ΔؔΛ ϑϧωʔϜͰධՁ͢Δͱ ൃੜ͢Δ
IUUQTIBQQJHJUIVCJPUIF#FBN#PPL ϓϩηεΛӽڥͯ͠ίʔυϗοτεϫοϓ͕ γεςϜશମʹద༻͞Ε͍ͯΔࣄྫ Έͨ͜ͱͳ͍ ߨٛϊʔτ ɹͦͦ "1*αʔόεςʔτϨεʹઃܭ͠ ΦʔτεέʔϦϯ άʹରԠ͢ΔํͰ͋ΔͳΒ ίʔυϗοτεϫοϓՄೳͳঢ়ଶΛ ҡ࣋͢ΔίετΛࢧ͏ҙຯ͕ͳ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 ΫϥελϦϯά &54 %&54 .OFTJB ίʔυϗοτεϫοϓ ͜ͷลΓΛஅࣺͯ͠Α͍
&MJYJSͷ༻్ΛׂΓΔ ͬͱ͋Δ͔ʜ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE 051 8FCγεςϜ։ൃͰ ΄΅ඞཁͳ͍ 051ߴػೳ "1*αʔόΛ&MJYJSͰॻ͘ ཧ༝
͖ͬͨ͞͠ "1*αʔόεςʔτϨεʹͯ͠ΦʔτεέʔϦϯάʹରԠ͢Δ Ωϟογϡ%#ͳͲ طΛ͏ &MJYJSͷ༻్ΛׂΓΔ ࢲͷϞνϕʔγϣϯ ָΛ͍ͨ͠ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE It is really common for OO developers
to think of Elixir modules as the minimal code structure (and therefore breaking everything into modules) and forget about functions. +PTÉ7BMJN (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ؔܕͱ00 ࠞઢ͢Δؔܕͱ00 -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE Ұൠతʹ OO ͷ։ൃऀͨͪ, Elixir ͷϞδϡʔϧΛ࠷খͷ ίʔυߏͱΈͳͯؔ͠ΛΕͯ͠·͏. (ͦΕނ,
શͯΛ ϞδϡʔϧԽ͢Δ) +PTÉ7BMJN ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔΛ·ͱΊΔ ߏମܕΛఆٛ͢Δ ࠞઢ͢Δؔܕͱ00 ؔܕͱ00 Ϟδϡʔϧͷͭͷׂ defmodule User
do defstruct name: nil, age: nil def new(name, age) do %User{name: name, age: age} end def puts_name(%User{name: name}) do IO.puts name end end -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔΛ·ͱΊΔ ߏମܕΛఆٛ͢Δ ࠞઢ͢Δؔܕͱ00 ؔܕͱ00 Ϟδϡʔϧͷͭͷׂ defmodule User
do defstruct name: nil, age: nil def new(name, age) do %User{name: name, age: age} end def puts_name(%User{name: name}) do IO.puts name end end Ϋϥεఆٛ ʹݟ͑Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔΛ·ͱΊΔ ߏମܕΛఆٛ͢Δ ࠞઢ͢Δؔܕͱ00 ؔܕͱ00 Ϟδϡʔϧͷͭͷׂ defmodule User
do defstruct name: nil, age: nil def new(name, age) do %User{name: name, age: age} end def puts_name(%User{name: name}) do IO.puts name end end Ϋϥεఆٛ ʹݟ͑Δ ߨٛϊʔτ ɹΫϥεఆٛʹݟ͑Δͱ Կ͕͍͚ͳ͍ͷ͔ʁ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ ߨٛϊʔτ ɹ&MJYJSͰ00͕Ͱ͖Δʂͱצҧ͍ͯ͠ ແବͳநԽΛ࣋ͪࠐΈ
ίʔυ͕ෳࡶԽ͢ΔࣄҊ͕ൃੜ͍͢͠ ɹྫ͑ &DUPͰSFQPͱ͍͏୯ޠΛ͍ͬͯΔͨΊ ϦϙδτϦ ύλʔϯʹΑΔநԽͷϕετϓϥΫςΟεΛ࣋ͪࠐΉ͠ͳͲ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ 00͞Μ 6TFS3FQPϞδϡʔϧ HFU@BDUJWFؔͰ
!SFQPHFU@BDUJWFΛ࣮ߦ !SFQP&DUP6TFS3FQP *'୲ ςετ࣌ʹ!SFQPΛม͑Δ༧ఆ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ 00͞Μ 6TFS3FQPϞδϡʔϧ HFU@BDUJWFؔͰ
!SFQPHFU@BDUJWFΛ࣮ߦ !SFQP&DUP6TFS3FQP *'୲ ςετ࣌ʹ!SFQPΛม͑Δ༧ఆ ߨٛϊʔτ ɹ6TFS3FQPίϯτϩʔϥʔ͔Β༻͞ΕΔ ɹ!SFQPઃఆϑΝΠϧ͔Βऔಘ͢Δॳظ&DUP6TFS3FQP ͕ͩ ςετ࣌ʹઃఆϑΝΠϧͰೖΕସ͑Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ 00͞Μ 6TFS3FQPϞδϡʔϧ HFU@BDUJWFؔͰ
!SFQPHFU@BDUJWFΛ࣮ߦ !SFQP&DUP6TFS3FQP &DUP6TFS3FQPϞδϡʔϧ HFU@BDUJWFؔͰ !SFBE@SFQPHFU@BDUJWFΛ࣮ߦ !SFBE@SFQP.Z"QQ3FQP *'୲ ςετ࣌ʹ!SFQPΛม͑Δ༧ఆ &DUP3FQP୲ ಡΈࠐΈॻ͖ࠐΈΛ͚Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ 00͞Μ 6TFS3FQPϞδϡʔϧ HFU@BDUJWFؔͰ
!SFQPHFU@BDUJWFΛ࣮ߦ !SFQP&DUP6TFS3FQP &DUP6TFS3FQPϞδϡʔϧ HFU@BDUJWFؔͰ !SFBE@SFQPHFU@BDUJWFΛ࣮ߦ !SFBE@SFQP.Z"QQ3FQP *'୲ ςετ࣌ʹ!SFQPΛม͑Δ༧ఆ &DUP3FQP୲ ಡΈࠐΈॻ͖ࠐΈΛ͚Δ ߨٛϊʔτ ɹ&DUP6TFS3FQP&DUPʹґଘ͢Δ ɹ!SFBE@SFQPઃఆϑΝΠϧ͔Βऔಘ͢Δ ɹεϥΠυʹؚΊ͍ͯͳ͍͕!XSJUF@SFQP͋Δ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ +PTÉ͞Μ લͷݴޠͰ ͦͷநԽඞཁͩͬͨΜͰ͠ΐʁࠓඞཁͳ͍Α
Ͳ͏ͯ͠ඞཁͳΒ ςετ࣌ʹ%#࣮ͷೖΕସ͑ࢭΊͯ *'ʹͳ͍ͬͯΔؔΛِ͠ͳΑ લʹهࣄॻ͍͔ͨΒࢀরͯ͠ IUUQCMPHQMBUBGPSNBUFDDPNCSNPDLTBOEFYQMJDJUDPOUSBDUT -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ ͍ ͦͷوํͷهࣄ͔Β!SFQPͷணΛಘͨΜͩΑ ͦΕʹ
ࠜຊΛೖΕସ͑ͨΒมߋҰճͰࡁΉͷʹ *'ؔΛม͑ΔͳΒશ෦ͷϞδϡʔϧΛ ॻ͖͑ͯճΒͳ͍ͱ͍͚ͳ͍͡ΌΜ 00͞Μ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ +PTÉ͞Μ ຊʹೖΕସ͍͑ͨͳΒ ؔΛِ͠ͳ͍͞
ͦͦ ֎෦γεςϜख͕ಧ͔ͳ͍͔ΒϞοΫ͕ඞཁ͚ͩͲ ࣗͷखݩͷ%#ΛͬͨςετʹϞοΫෆཁͩΑ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ 00͞Μ Θ͔ͬͨΑʜ ͏ͪΐͬͱγϯϓϧʹߟ͑ͯ͠ΈΔͶ
ߨٛϊʔτ ɹ&DUP෭࡞༻Λ3FQPʹू͓ͯ͠Γ ෭࡞༻ͷͳ͍ DIBOHFTFUͱRVFSZʹରͯ͠"TTFSU͢Δํ๏બͰ͖Δ ɹ͔͠͠ Ұҙ੍ͷςετͳͲΛߟྀ͠ ίϯςφΛ༻͍ͯ%#ͳ ͲΛىಈ͠ ςετͨ͠ํ͕Α͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 (https://groups.google.com/forum/m/#!topic/elixir-lang-talk/Ib11890jfmY) ࠞઢ͢Δؔܕͱ00 &DUPΛϦϙδτϦύλʔϯͰநԽ͢ΔΞΠσΞ 00͞Μ Θ͔ͬͨΑʜ ͏ͪΐͬͱγϯϓϧʹߟ͑ͯ͠ΈΔͶ
ߨٛϊʔτ ɹ%#࣮ΛೖΕସ͑Δ΄ͲͷநԽෆཁ͕ͩ SFBEXSJUF 3FQPͷ'BDBEF3FQPͷଘࡏ൱ఆ͞Ε͍ͯͳ͍ IUUQTKNQ0WDYV -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE trait HasMessage { // defprotocol, defmodule def
message():String // @callback def puts(): Unit = println(this.message()) } class A extends HasMessage { // defimpl, defmodule def message() = "I am A.” // @impl } class B extends HasMessage { def message() = "I am B." } object Test { def main(args: Array[String]): Unit = { call_puts(new A) call_puts(new B) } def call_puts(has_message: HasMessage): Unit = has_message.puts() // protocol? behaviour? } ؔܕͱ00 -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE trait HasMessage { // defprotocol, defmodule def
message():String // @callback def puts(): Unit = println(this.message()) } class A extends HasMessage { // defimpl, defmodule def message() = "I am A.” // @impl } class B extends HasMessage { def message() = "I am B." } object Test { def main(args: Array[String]): Unit = { call_puts(new A) call_puts(new B) } def call_puts(has_message: HasMessage): Unit = has_message.puts() // protocol? behaviour? } ؔܕͱ00 ߨٛϊʔτ ɹωλ ɹ4DBMBͷ5SBJUͷྫࣔʹ &MJYJSͳΒʁͱ͍͏ίϝϯτೖΕͨ ɹ5SBJUͳͲͷ͕ࣝ͋Δͱ ϓϩτίϧϏϔΠϏΞ ͍ͭ Ͳ ͜Ͱ͏ͷ͔ʁͱ͍͏அ͕00ʹඥ͍ͯ͠·͏ͷ͕ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ؔܕͱ00 ࠞઢ͢Δؔܕͱ00 ϓϩτίϧͱϏϔΠϏΞͷࠞಉ IUUQTFMJYJSGPSVNDPNUCFIBWJPVSTQSPUPDPMT ϓϩτίϧσʔλ͕ओ ϏϔΠϏΞ͕ؔओ ߨٛϊʔτ
ɹ&MJYJS ϓϩτίϧͱϏϔΠϏΞͷఆ͕ٛϞδϡʔϧʹඥ͍ͯ ͍Δϓϩτίϧσʔλʹ ϏϔΠϏΞؔʹඥ͚ͮͯߟ͑Δͱ Α͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ϚΫϩݴޠ࡞ऀָ͕Λ͢Δػೳ ͋·Γʹڧྗ͗͢Δ ϚΫϩߴػೳ IUUQTRJJUBDPNDPPMEBFNPOJUFNTDFE IUUQTRJJUBDPNDPPMEBFNPOJUFNTFEBFBB⒎CD ϚΫϩΛॻ͚ͳͯ͘ಡΊΔΑ͏ʹͳΖ͏
ͱ͍͏ࢼΈͷهࣄ ߨٛϊʔτ ɹ&MJYJS ͋ΒΏΔͷ͕ϚΫϩͰ࣮͞Ε͍ͯΔ ɹϚΫϩͷཧղ 8FCγεςϜ։ൃʹ͓͍ͯඞਢͰͳ͍͕ ϚΫϩ͕ಡΊͳ͍ͱ ਖ਼͍͠ཧղʹ͕͔͔࣌ؒΔػೳ͋ΔͨΊ &MJYJSʹ׳Ε͔ͯΒ Ώͬ͘Γֶश͢ΔͱΑ͍ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ϚΫϩ ʹ͍ͭͯ ඵఆ ࣍ 051 ʹ͍ͭͯ ఆ
ؔܕͱ00 ʹ͍ͭͯ ఆ ඵఆ ·ͱΊ -
$PQZSJHIU $ HVNJ*OD"MM3JHIUT3FTFSWFE ·ͱΊ 051ߴػೳ͕ͩஅࣺ͠Α͏ ϞδϡʔϧͰઃܭ நԽ ͢Δͳ ؔத৺Ͱߟ͑Α͏ ߨٛϊʔτ
ɹຊ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ ɹͥͻ &MJYJSΛࢼͯ͠Έ͍ͯͩ͘͞