Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.js Is Dead - なぜ私がNode.jsを捨ててElixirに切り替えたのか-

Node.js Is Dead - なぜ私がNode.jsを捨ててElixirに切り替えたのか-

タイトルは釣りです。すいませんほんと。

2015年12月0c8日に行われたAktsk Tech Meetup #1: Elixir & GraphQLで発表した際の資料です。

===

Node.js+Koaで開発していたサービスを、なぜリリースせずにElixir+Phoenixに書き換えることにしたのか? Elixirを通して見えてくるNode.jsの問題点とは?Node.jsユーザーがElixirを始める際の注意点とは? この辺りのテーマについて答えられるお話をさせていただければと思います。

Masaaki Hirano

December 08, 2015
Tweet

Other Decks in Technology

Transcript

  1. N O D E . J S I S D

    E A D ͳ ͥ ࢲ ͕ N o d e . j s Λ ࣺ ͯ ͯ E l i x i r ʹ ৐ Γ ׵ ͑ ͨ ͷ ͔ M a s a a k i H i r a n o ( @ F L 4 T L i N 3 )
  2. ͓ લ ͩ Ε Α • Masaaki Hirano (@FL4TLiN3)ɺ31ࡀɺೋࣇͷ෕ •

    Server (Node.js/Perl/PHP/Java…) • Web BrowserʢReact/CanJS/Angular/Ext JS…) • AppsʢiOS/Androidʣ • اըશൠʢαʔϏεاըɺήʔϜσβΠϯɺϓϩσϡʔεʣ • ࣸਅ͕झຯʗྺ࢙޷͖ʗήʔϜ޷͖ʗөը޷͖ʗԻָ޷͖ • اը → ։ൃ → ӡ༻ ʹ ͍͢͜͝ͱ͍͓ͨ͠͡͞Μ
  3. ͓ ͡ ͞ Μ ͷ ͜ ͜ ࠷ ۙ •

    2015೥ɺ੯͠·Εͭͭ΋αϥϦʔϚϯΛ༐ୀɻ౰࣌30ࡀͰ͋ͬͨ • ϞϥτϦΞϜظؒதɺ1೔20͔͚࣌ؒͯੵΈήʔΛ΍Γਚ͘͢ • YouTuberʹͳΔͨΊͷࣄલௐࠪʢYouTubeΛݟΔʣΛ։࢝ • Ո଒͔Βͷྫྷ΍΍͔ͳࢹઢʹ଱͑ΒΕΔ͸ͣ΋ͳ͘ɺ෕਌ͷᔗ݊ΛकΔͨΊ αʔϏεΛҰਓͰ࢝ΊΑ͏ͱܾҙ • ʰࢄʑJSॻ͍ͯͨΜ͔ͩΒɺֶशίετෆཁ΍ΖʱͱߴΛ͘͘Γ Node.jsͱReactͰαʔϏεΛ࡞Γ͸͡ΊΔ • ͔ͬ͠Γͱϑϥάճऩɻരࢮ͍ͭͰʹαʔϏεΛElixirͰॻ͖௚͢
  4. TA B L E O F C O N T

    E N T S • ୈҰষɿΘͨ͠ͷNode.jsࣦഊஊʢ10minʣ • ୈೋষɿͳͥ࣍ͷݴޠʹElixirΛબΜͩͷ͔ʢ5minʣ • ୈࡾষɿElixirͷԿ͕Θͨ͠ͷ৺Λଧͬͨͷ͔ʢ15minʣ ※ ࿩͕ඈͼ·͘Δ͔Β஫ҙͯ͠Ͷʂ
  5. Θ ͨ ͠ ͷ N o d e . j

    s ࣦ ഊ ஊ ୈ Ұ ষ ɾ ౖ Γ ͷ σ ε ϊʔ υ
  6. Կ ͕ ى ͬ͜ ͨ ͷ ͔ ࡾ ߦ 1.

    ҰਓͰNode.js࢖ͬͯαʔϏε࡞ͬͯͨ 2. ϩʔϯν௚લʹ͍Ζ͍Ζมߋ͕ඞཁʹͳͬͨ 3. ؾ͕͍ͭͨΒมߋ࡞ۀΛ΄ͬͨΒ͔ͯ͠Elixirʹॻ͖׵͑࢝Ίͯͨ
  7. ͳ ͥ N o d e . j s •

    ͔ͭͯPHPͱ͍͏ίϯϐϡʔλʔݴޠ͕ଘࡏ͍ͯͨ͠ • खܰͰ͍͍ݴޠͳΜ͚ͩͲɺ৭ʑ΍Βͤ͗ͯͨ͢ • ϑΝο!?͍ͬͯ͏஍ཕ͕ଟ͍ • Ͱ΋པΕΔख़࿅ϓϩάϥϚ΋पΓʹ୔ࢁ͍ͯɺͳΜͱ͔΍͍͚ͬͯͯͨ • ΋ͬͱָͰ͖Δ؀ڥʹߦ͖͍ͨͱߟ͑Δʢ2011೥͋ͨΓʣ • ख़࿅PHPϓϩάϥϚ͕࣍ʑ৽ੈքʹཱཱྀ͍ͬͯ͘ • ϑϩϯτΤϯυͷॏཁੑ͕ߴ·͖ͬͯͨͷͰɺͦͬͪʹूத͍ͨ͠
  8. Θ ͨ ͠ ʹ ͱ ͬͯ ͷ ָ ͱ ͸

    • ҰਓͰαΫοͱॻ͚ͯɺαΫοͱಈ͔ͤΔͱָ • ͍ͭΰϛശߦ͖ʹͳΔ͔෼͔Βͳ͍͔Θ͍ͦ͏ͳίʔυΛॻ͘ͷ͕࢓ࣄ • খن໛։ൃ͕ϝΠϯʗνʔϜ։ൃ͸͋·Γߟ͑ͳ͍Ͱ͍͍ • গͳ͍खؒͰγεςϜશମͷ݈શੑΛอͯΔͱָ • Ͱ͖Δ͔͗Γॻ͔ͳ͍Ͱ͍͍ͱָ • CPANɺRubyGemsΈ͍ͨͳ೤͍ΤίγεςϜ • ϑϩϯτΤϯυͱͷιʔεڞ༗
  9. N o d e . j s ΁ ͷ ظ

    ଴ • ͱʹ͔͘αΫοͱॻ͚ͦ͏ • άάͬͨίʔυΛͦͷ৔Ͱ࣮ߦʂ • V8଎ͦ͏ʗඇಉظϓϩάϥϛϯάָͦ͠͏ • രൃతʹ૿͑ΔnpmϞδϡʔϧͷ਺͔Βͯ͠੝Γ্ ͕ͬͯͦ͏ • ৽͍͠؀ڥ㱺๯ݥ৺Λ͙͘͢Δߥ໺ʂV8ʂ
  10. ࣮ ࡍ ͷ ͱ ͜ Ζ • ࣮ࡍαΫοͱॻ͚ͨ • ࣮ࡍύϑΥʔϚϯεྑ͔ͬͨ

    • ࣮ࡍૉఢͳnpmϞδϡʔϧ͕େྔʹੜ·Εͨ • V8ͩͬͨɻ V8ʂ
  11. 4 ೥ ͘Β ͍ N o d e . j

    s ΍ ͬͯ ײ ͡ ͨ ͜ ͱ • JavaScriptͱ͍͏ݴޠʹىҼ͢Δ֤छॻ͖ํ໰୊͕ͭΒ͍ • ௕Β͘ଓ͍ͨCallback Hell໰୊ • ES6ʗES7 • ϕετϓϥΫςΟεతͳ΋ͷ͕ͣͬͱͳ͍ͷ͕ͭΒ͍ • RoRతͳʰͱΓ͋͑ͣ͜͏͠ͱ͚ʱͱڭ͑ͯ͘ΕΔଘࡏ • ҰݸϒϨΠΫεϧʔ͕ى͖ΔͱͦͷϑΥϩϫʔ͕ࢁఔग़ͯ͘Δ໰୊͕ͭΒ͍ • λεΫϥϯφʔ͚ͩͰ͍ͭ͘౉Γา͍ͨʁjake, grunt, brunch, gulp… • AltJS΋େྔʹ͋Δ͚ͲɺࠓޙͲ͏ͳΜͷʁ • ͜Ε͸ϑϩϯτΤϯυͰ΋ى͖ͯΔ
  12. ৭ ʑ ݴ ͍ ͨ ͍ ͚ Ͳ · ͱ

    Ί Δ ͱ ͜ Ε • ઈࢍਐԽதɻϕετϓϥΫςΟεແͯ͘౰ͨΓલ • ͦͯ͠Nodeboys͸BKSS։ൃ(*)ʹ๩͍͠ • ͦΜͳதɺES6͕தܧ͗ొ൘ʗES7͕ϒϧϖϯೖΓ • ·ͩ͠͹Β͘͸ΧΦε͕ଓ͖ͦ͏ • ·͞ʹߥ໺ɻָͳΜͯͳ͍ (*) ΅͘ͷɹ͔Μ͕͑ͨɹ͍͖͞ΐ͏ͷɹαϜγϯά
  13. ͦ Μ ͳ ߥ ໺ Ͱ Ұ ਓ α ʔ

    Ϗ ε ࡞ ͬ ͨ • ։ൃ͢Δͱ͖ʹܾΊͨ͜ͱ • ES6Ͱॻ͘ • ඇಉظॲཧ͸co + yieldͰ • WAF͸koa • Promise-basedͳORM sequelizeΛ࠾༻ • ग़དྷΔݶΓϑϩϯτΤϯυͱιʔεΛڞ༗͢Δ • ϑϩϯτΤϯυ͸Ract (JSX)Ͱॻ͘
  14. α Ϋ α Ϋ ࡞ Ε ͪ Ό ͏ N

    o d e . j s ͢ ͝ ͍ ͕ ɺ ͠ ͔ ͠ … • ϓϩτλΠϓ͸͙͢׬੒ɻ͕ɺ͍ͬͯ͡Δ͏ͪʹΦϨΦϨΞʔΩςΫνϟ ͕Ϋιͩͱؾ͕ͭ͘ • Koa MiddlewareͷnpmϞδϡʔϧΛ͋Ε͜Εม͑Δ • ΞʔΩςΫνϟʹखΛೖΕͯͨΒ݁ߏ࣌ؒܦͭ • ػೳΛੵΈ૿͢ˍΠϚΠνͩͬͨػೳΛ࡟Δ • ·ͨΞʔΩςΫνϟʹҧ࿨ײΛײ͡खΛೖΕΔ • ϦϦʔε൛͕ग़དྷ্͕Δ΋ͷͷେ͍ʹͭ·Βͳ͍ɻػೳΛ͋Ε͜Ε͍͡Δ • ·ͨΞʔʢry • ऴΘΒͳ͍
  15. ͦ ͯ͠ ࢥ ͏ • Ͳ͏͍͏αʔϏεͳΒ࢖ͬͯ໯͑Δ͔ʁͱݴ͏͜ͱ͹͔Γ ߟ͑ΔҰํɺίʔυͷߦ͘຤͸ߟ͍͑ͯͳ͔ͬͨ • ೴CPU࣌ؒ͸༗ݶϦιʔεɻϨʔϧʹ৐ΕΔͱ͜Ζ͸৐ͬͯઅ໿ •

    ҰݸҰݸnpmϞδϡʔϧΛධՁ͠૊ΈࠐΉαΠΫϧ͸ͭΒ͍ • ϛεΔͱϘσΟϒϩʔͷΑ͏ʹޮ͍ͯ͘Δ • ͲͷݴޠͰ΋ϓϩδΣΫτʹ͋ͬͨϥΠϒϥϦΛ୳͢ͷ͸େม • Ͱ΋ಛʹnpmͷ৔߹ɺಉҰ՝୊ʹରͯ͠ෳ਺ͷϥΠϒϥϦ͕ಉ࣌ʹ։ ൃதͩͬͨΓ͢ΔͷͰɺԿબ΂͹ྑ͍͔શવ෼͔Βͳ͍
  16. ཧ ૝ ڷ Λ ୳ ͠ ʹ ཱྀ ཱ ͭ

    • Rails΍Ε͹Α͔ͬͨ͡ΌΜײ൒୺ͳ͍ • ߥ໺Ͱ΍ΜͪΌ͔ͨͬͨ͠ΜͩΑ…ڐͤ… • αʔόʔαΠυ͸΋ͬͱ΋ͬͱָ͍ͨ͠ • ͩͬͯϢʔβʔ͕௚઀৮ΕΔͷ͸ϑϩϯτΤϯυͩ΋Μ • V8৴ڼ͸ྫྷΊͯͳ͍͠ɺϑϩϯτΤϯυ͸શྗͰॻ͖ଓ͚·͢ • ͦͯ͠ɺཱཱྀͪΛܾҙ ϢʔτϐΞ σύʔνϟʔ
  17. ิ ଍ • co + koa + sequelize͸ϑπʔʹྑ͔ͬͨ • generator,

    Promise, yieldͰඇಉظॲཧ͸όονάʔ • koa͸Middleware͕๲େʹ͋ΔͷͰɺͦͷลͷϑϧελοΫWAFΑΓߴػೳ • ͨͩ͠NodeboysͷBKSS։ൃ͕Ճ೤͗ͯ͢͠طʹΧΦεͬͯΔ • co+koaͰඇಉظॲཧதͷΤϥʔϋϯυϦϯά΋͠΍͘͢ͳ͖ͬͯͨ • Ͱ΋ಉ࣌ʹෳ਺ϦιʔεΛߋ৽͠ʹߦ͘ࡍͷτϥϯβΫγϣϯॲཧͱ͔ɺ ΍ͬͺͲ͏ͯ͠΋໘౗͍͘͞ॻ͖ํʹͳͬͪΌ͏ • ͜ͷลͰ࢛ۤീۤͨ͠ܦݧ͸ͦͷ͏ͪ·ͱΊ͍ͨ
  18. ͳ ͥ ࣍ ͷ ݴ ޠ ʹ E L I

    X I R Λ બ Μ ͩ ͷ ͔ ୈ ೋ ষ ɾ ߥ ໺ ͔ Β ͷ ཱྀ ཱ ͪ ฤ
  19. Θ ͨ ͠ ʹ ͱ ͬͯ ͷ ཧ ૝ ڷ

    ͱ ͸ 1. ֩ͱͳΔ෦෼͸ރΕٕͨज़͕࢖ΘΕ͍ͯΔ 2. ಡΈ΍͍͢ίʔυΛ໎ΘͣαΫοͱॻ͚Δ 3. ҆৺ͯ͠৐͔ͬΕΔϕετϓϥΫςΟε͕͋Δ 4. ଎ͯ͘ඇಉظత͕ͩɺͦΕΒΛΘ͟Θ͟ҙࣝͤ͞ͳ͍ 5. มߋʹڧ͘ɺςετ͠΍͍͢ 6. vimͰॻ͚Δ ϢʔτϐΞ
  20. ཧ ૝ ڷ ީ ิ • Scala • Pros •

    JVMϕʔεͰJavaࢿ࢈࢖͑Δ͠଎ͦ͏ • ੩తܕ෇͚+ܕਪ࿦Ͱมߋʹڧͦ͏ • Play2 • Cons • ίϯύΠϧ஗͍Έ͍ͨͳҙݟ͕ଟ͘ɺαΫοͱॻ͘ྨͷݴޠ͡Όͳ͍Ά͍ • vim͸͓ݺͼͰͳ͍ײ • কعͷίϚͷಈ͖͢Β֮͑ΒΕͳ͍ࢲ͕IDEΛ࢖͍͜ͳͤΔؾ͕͠ͳ͍
  21. ཧ ૝ ڷ ީ ิ • Go • Pros •

    ΊͪΌ଎ͰฒྻԽ͕ಘҙ • ΘΓͱαΫοͱॻ͚ΔಡΈ΍͍͢ίʔυ • ͓͏ͳΜͰ΋೚ͤͱ͚Αɹײ • Cons • ॏ͍ͨॲཧΛීஈ͔Β୔ࢁॻ͘Α͏ͳਓʹ͸޲͍ͯͦ͏͚ͩͲɺࢲ͸ͦ͜·Ͱٻ Ίͯͳ͍ • golangͰWebΞϓϦέʔγϣϯ࡞Δ࣌ͷϕετϓϥΫςΟε͕݁ہԿͳͷ͔࠷ ޙ·ͰΘ͔Βͳ͔ͬͨʢ·ͩͳ͍Ά͍ʣ
  22. ཧ ૝ ڷ ީ ิ • Elixir • Pros •

    Erlang VM্Ͱಈ࡞ɻ଎͍͠ɺErlangͷࢿ࢈΋ੜ͖Δ • ڧྗͳύλʔϯϚον • Phoenix Framework • γϯλοΫετϨϯσΟ • σʔλͷෆมੑ ✕ ࢀরಁաੑ ✕ υΩϡϝϯςʔγϣϯػೳͷॆ࣮ → มߋʹڧ͍ • ϝλϓϩάϥϛϯά • Cons • ৘ใ͕গͳ͗͢ • ͍͏΄ͲRuby෩ຯͰ͸ͳ͍
  23. ݁ ࿦ • Ͳͷݴޠ΋ັྗత • Ͱ΋࠷ऴతʹ͸… • ʢScalaͷํΛݟͳ͕ΒʣΧοϓϥʔϝϯͷ3෼͢Β଴ͯͳ͍ͷʹɺίϯύΠϧ࣌ؒ௕ ͍ͷ͸ͳ͋… •

    ʢGoͷํΛݟͳ͕ΒʣΦϨʹ͸ϑΥʔϛϡϥʔΧʔͰߥ઒αΠΫϦϯάϩʔυ૸Δ Α͏ͳ΋ΜͩΖ͜Ε… • ͡Ό͋·ͣ͸Elixir΍ͬͯΈΔ͔͋ • ͜͜2ϲ݄ElixirΛॻ͍ͨ → ͍͍ • ཧ૝ڷʢԾʣ͔΋
  24. E L I X I R ͷ Կ ͕ Θ

    ͨ ͠ ͷ ৺ Λ ଧ ͬ ͨ ͷ ͔ ୈ ࡾ ষ ɿ ཧ ૝ ڷ ʢ Ծ ʣ Ͱ ͷ ί ʔ σΟ ϯ ά ϥ Π ϑ
  25. E l i x i r ͷ ඒ ఺ •

    ؔ਺ܕʗσʔλͷෆมੑʗࢀরಁաੑ • ύλʔϯϚονϯά • ߴ͍ฒྻॲཧೳྗ • ߴ͍৴པੑʗ଱ো֐ੑͷߴ͍ΞʔΩςΫνϟ Erlangͷඒ఺
  26. E l i x i r ͷ ඒ ఺ •

    Erlang͍͢͝ • Կे೥΋ి࿩໢Λࢧ͑ͯΔ • WhatsApp͸1αʔόʔͰ2ඦສͷಉ࣌઀ଓΛॲཧ • Erlangʹଟݴޠ͔ΒͷελσΟΛऔΓೖΕɺൃలͤͨ͞ͷ͕Elixirɻ͍͢͝ • Ruby෩ຯͷτϨϯσΟͳγϯλοΫε • ϚΫϩʹΑΔϝλϓϩάϥϛϯά • ϓϩτίϧʹΑΔϙϦϞʔϑΟζϜ ͳͲ • ΤίγεςϜ΋͍͢͝ • RoRΠϯεύΠΞͳWAFɺPhoenix Framework
  27. E l i x i r ͷ ͢ ͝ ͞

    Λ Ұ ෦ ঺ հ • ύλʔϯϚον • ଱ো֐ੑͷߴ͍ΞʔΩςΫνϟ • ฒྻॲཧ • Phoenix Framework
  28. ύλ ʔϯ Ϛ ο ν ͬͯ ͳ ʹ Α ʁ

    • Elixirͷ=͸Ϛονԋࢉࢠ • ύλʔϯϚονͱ͸ɺࠨลͰهड़ͨ͠ύλʔϯͱӈลͷม਺ͷத ਎͕߹க͢Δ͔ΛධՁɻ߹க͢Δ৔߹ࠨลͰࢦఆͨ͠ม਺ʹ֨ೲ ͯ͘͠ΕΔ • ্ͷྫͷ৔߹ɺmapʹʢmap͸%{}Ͱදݱ͢Δʣɺstatusͱbody ͷ2ͭͷΩʔ͕͋Δ͔ධՁ͠ɺ஋ΛͦΕͧΕmatched_statusͱ matched_bodyʹ֨ೲ͍ͯ͠Δ %{status: matched_status, body: matched_body} = %{status: 200, body: “V8!”}
  29. ύλ ʔϯ Ϛ ο ν ͬͯ ͳ ʹ Α ʁ

    • ؔ਺એݴͰ΋࢖͑ΔͷͰɺif-elseͰ৚݅෼ذͤͯ͞ݺͼग़ؔ͢਺Λಛఆ͢Δඞཁ͕ͳ͍ • ͲͷҾ਺ͷύλʔϯͳΒɺͲͷؔ਺͕ݺ͹ΕΔ͔Ұ໨ྎવ • ؔ਺໊ͱҾ਺ͷύλʔϯΛಡΊ͹ɺΠνΠνத਎Λಡ·ͳͯ͘΋ཧղͰ͖Δ defmodule Sample.PatternMatchSample do def get(url) do process_response http_get(url) end defp process_response(%{status_code: 301, headers: headers}) do redirect headers end defp process_response(%{status_code: 302, headers: headers}) do redirect headers end defp process_response(%{status_code: 200, body: body}) do IO.puts body end defp redirect(headers) do headers |> Dict.get(:Location) |> get end end Ref. Elixir ͷύλʔϯϚονΛ߈ུ͠Α͏
  30. ύλ ʔϯ Ϛ ο ν ͬͯ ͳ ʹ Α ʁ

    • A. Ϋϥογϡ͠·͢ • Q. ͖ͬ͞ͷྫͰ404ͱ͔ฦ͖ͬͯͨΒͲ͏ͳΜͷʁ
  31. E l i x i r ͷ ϓ ϩ η

    ε Ξʔ Ω ς Ϋ ν ϟ • Elixir/ErlangͰ͸૝ఆ֎ͷೖྗ஋͕དྷͨ࣌ɺͲ͏ʹ͔Τϥʔϋϯ υϦϯάͯ͠ϓϩηεΛਖ਼ৗʹ͍࣋ͬͯ͘ͷͰͳ͘ɺͦͷ··Ϋ ϥογϡͤͯ͞͠·͏ͷ͕͓࡞๏ • Ϋϥογϡͨ͠ϓϩηε͸ผͷϓϩηεͰ؂ࢹ͓͖ͯ͠ɺΤϥʔ ϋϯυϦϯά͸؂ࢹϓϩηεଆͰߦ͏ • ͜͏͢Δ͜ͱͰɺϩδοΫͱΤϥʔϋϯυϦϯά͕෼཭Ͱ͖ɺίʔ υͷอकੑ޲্΍ɺ଱ো֐ੑͷ޲্ͳͲ༷ʑͳԸܙ͕ಘΒΕΔ • ࢖͍ࣺͯΒΕΔ͘Β͍ʹErlang VMͷϓϩηεੜ੒ίετ͸͍҆ Ref. [຋༁] ElixirͷϓϩηεΞʔΩςΫνϟ ·ͨ͸ࢲ͸೗Կʹͯ͠৺഑͢ΔͷΛࢭΊͯΫϥογϡΛѪ͢ΔΑ͏ʹͳ͔ͬͨ
  32. – N A O YA I T O ΫΠζ൪૊Ͱ ◦

    ͔ × ͔౴͑ΛબΜͰนʹಥͬࠐΜͩઌʹɺਖ਼ղͳΒΫο γϣϯ͕ɺෆਖ਼ղͳΒటਫ͕͋Δͱ͍͏اը͕͋Δ͕ɺͦΕʹᄻ͑ΔͳΒ టਫͩΖ͏͕ԿͩΖ͏͕᪳᪯ͤͣμΠϒ͠Ζ! ͱ͍͏ͷ͕ Elixir ྲྀ Ref. Elixir ͷϓϩηεΛ࢖ͬͯϑΣΠϧηʔϑͳΞϓϦέʔγϣϯΛ࡞Δ ᴷ ࣦഊ͸ڪΕͣటਫʹμΠϒ
  33. E l i x i r ͷ ϓ ϩ η

    ε Ξʔ Ω ς Ϋ ν ϟ • લड़ͷΞϓϩʔνͰฒྻॲཧ΋͘͢͝γϯϓϧʹɺ҆શͳ΍ ΓํͰॻ͚ͪΌ͏ • ΍Γ͍ͨॲཧΛॻ͖ɺͦͷϓϩηεΛ؂ࢹ͢ΔSupervisorΛ࣮૷ • Supervisor͔ΒTask.asyncͱTask.awaitΛ࢖͍ɺλεΫͷඇಉظݺͼग़͠ Λ͢Δ • ͋ͱ͸ඞཁʹԠͨ͡ฒྻ౓ͰλεΫΛฒྻ࣮ߦ͢Ε͹OK • async/awaitͰ։࢝ͨ͠λεΫ͸ผϓϩηεͰ࣮ߦ͞ΕΔͷͰɺҰ෦ͷλ εΫ͕Ϋϥογϡͯ͠΋શମʹӨڹͤͣ͞ʹɺSupervisorͰΤϥʔϋϯ υϦϯάͰ͖Δ
  34. R o R ͷ ఋ • ʰεϐʔυͱϝϯςφϯεੑͰଥڠ͠ͳ͍ɺߴ͍ੜ࢈ੑͷWAFʱ • ࣮ࡍ଎͍ɻϚΠΫϩඵΦʔμʔͰԠ౴͕ؼͬͯ͘Δ •

    ࣮ࡍߴ͍ϝϯςφϯεੑɻRoRͷϕετϓϥΫςΟεΛ౿ऻ • ࣮ࡍߴ͍ੜ࢈ੑɻඞཁͳ΋ͷ͸શ෦ἧͬͯΔ͠ɺ͙͢ʹ։ൃʹೖΕΔΑ͏ஸೡͳ ϑΥϩʔͱπʔϧ܈͕͋Δ • ָ͍͜͠ͱʹ͚ͩूதͰ͖ΔWAF • WebΞϓϦέʔγϣϯ։ൃͷ90%͸طࢹײͷ͋Δୀ۶ͳίʔυΛॻ͘͜ͱ • Phoenix͸ͦͷ90%ͷ΄ͱΜͲΛ΍ͬͯ͘ΕΔ • ϓϩάϥϚ͸ָ͍͠10%ʹଧͪࠐΊΔʂ
  35. ΄ ͔ ʹ ΋ ͍ Ζ ͍ Ζ ͋ Δ

    ͧ E l i x i r • ঺հ͖͠Εͳ͍ັྗͷ਺ʑ • ؔ਺ܕϓϩάϥϛϯάʗσʔλͷෆมੑʗࢀরಁաੑ • ϚΫϩʹΑΔϝλϓϩάϥϛϯά • ϑΝʔετΫϥευΩϡϝϯτʗDoctests • ͱΓ͋͑ͣͪΐͬͱ΍ͬͯΈΑ͏ʂͳͬʂʁ • http://elixir-lang.org/getting-started/introduction.html
  36. ࣮ ࡍ ࢖ ͬͯΈ ͯ • Elixirʹ຋༁͚ͨͩ͠ͱ͸͍͑ɺ2ϲ݄͔͔ͬͯ࡞ͬͨαʔϏεΛ2िؒऑͰϦϥΠτग़དྷ ͯ͛͑͢ͱࢥͬͨ • ॻָ͍͍ͯͯ͠ɻͱʹָ͔͍͘͠

    • ύλʔϯϚον͕ແ͍ͱແཧͳମʹͳͬͯ͠·ͬͨ • Phoenix͕ތΔૉ੖Β͍͠ੜ࢈ੑʗมߋ΁ͷڧ͞ • ֶशίετ͸ɺʰ·͋·͋͋Δʱ • RoRܦݧऀͰ΋ମײ৭ʑҧ͏Μ͡Όͳ͍͔ͳʁ • Ͳ͔ͬͪͱ͍͏ͱErlangʹ͍ͭͯͷ͓ษڧ͕࣌ؒ୔ࢁඞཁ • ৭ʑ஍ཕ΋౿Μ͚ͩͲͦΕ͸·ͨࠓ౓ͳʂ • ։ൃதͷαʔϏε΋ͦͷࠒʹ͸…