田舎で並行処理の夢を見る

試していることなど...需要がないかもしれないけど細々とアウトプットしてます

岐阜県民だけどErlang&ElixirFest2019に行ってきた

Erlang & ElixirFest2019とは

f:id:takamizawa46:20190602130917j:plain Erlang & Elixirが大好きな人やら興味のある人が集まる万博みたいなお祭り
年に一度開催されていらっしゃるようで今年で3度目になるそうです

Erlang & ElixirFest2019
connpassのページ

開催場所はご想像の通り、東京です
Erlang、Elixir界隈ではかなり名のある方々が集まり、かなり技術レベルの高いカンファレンスとなっています

他の方と比べるとElixirとErlangの知見はほぼ皆無に等しいですが 岐阜に住んでて名古屋で仕事していると、こういうハイレベルな空気感に触れられる機会は
ほぼ皆無と言っていいので

  • ウン万円払ってでも!!
  • 恥をかいてでも!!

と割り切って思い切って行ってみました
ただ東京に行くのが人生二度目かつソロで新幹線乗ったのが初めてだったので、クソ迷いました
田舎者丸出しでごめんな。東京

内容について

以下、connpassのページから引用です

  • Keynote: Erlang/OTP と ejabberd を活用した Nintendo Switch(TM)向けプッシュ通知システム「NPNS」の開発事例 (任天堂 ネットワークシステム部 渡邉大洋)
  • 超並列高速実行処理系 Hastega 〜 Lonestar ElixirConf 凱旋帰国 (山崎 進)
  • Nervesが開拓する「ElixirでIoT」の新世界 (高瀬 英希)
  • 工場の制御をElixirで 〜ラダー・ロジックを実行する〜 (菊池 豊)
  • Elixir プロセス入門
  • ElixirでやるDDD (ドメイン駆動設計) (ne_Sachirou)
  • Phoenix1.4とVueによるサービス構築のノウハウ (山口 強)
  • ProtocolBuffer(proto3)をElixirで実装する (にく)
  • 4才から24才までプログラミングを教えた結果、高校生にElixirを教えるに至った気付き (YOSUKENAKAO.me)
  • XFLAG × スポーツ × Elixir (村山 寛明)
  • Serverless BEAM with FaaS (大原 常徳)
  • ロマサガRS における Elixir サーバー開発実践 〜生産性を上げてゲームの面白さに注力〜 (梶原 星平/関山 友輝)
  • Erlang/OTP で作るリアルタイムサーバー (清水 佑吾)
  • Erlang/OTP で WebRTC と QUIC (voluntas)
  • Enum.mapから始めるElixirデータサイエンス(piacere)

圧倒的...ッ!!! ボリューム...ッ!!
ラーメンに餃子とチャーハンと天津飯と唐揚げつけて頼んだかってぐらい
一日でこれだけの情報量を摂取できるのやばい
半分ぐらいは自分のレベル感で理解できる内容だったと信じているが
技術レベルの差にただ頷くことしかLTもあり本当に世の中は広いなと感じざるを得なかった

その反面、私の主催している清流elixirの常連メンバーが
普通にErlang&ElixirFest2019に来ていて、世間は狭いなと思った

Fest行きたいなって決定打に思ったのが今回のKeynote
任天堂ErlangかElixirをswitchの通知システムに使ってるらしいよ」って話は風の噂で聞いたことがあった
ただ、その部分の任天堂さんのオープンな話(事実含めて)ってどこにも落ちてなくて
今回公の場に登壇されてお話できる範囲で詳細を初めて語って下さりました
終了後に拍手が鳴り止まず、何と色々と許可が出れば書籍化されるとかされないとか

有志の方がLTのリンクや関連スライドをqiitaの記事にまとめて下さっているので展開しておきます

20190601追記
keynoteでの渡邊さんのLT資料が公開されたので貼っておきます
Keynote: Erlang/OTP と ejabberd を活用した Nintendo Switch(TM)向けプッシュ通知システム「NPNS」の開発事例 (任天堂 ネットワークシステム部 渡邉大洋)
speakerdeck.com

以下、気になった&理解できているLTの内容についてざっくりとまとめてます
内容は理解できたレベルでまとめているが誤りがあれば教えてください

超並列高速実行処理系 Hastega

Elixirの並列処理ライブラリのFlowにインスパイアを受けてより速いものを作りたいという
研究者ならではの視点から開発を進められているライブラリ
GPU上でも動作し、Flowの10倍, pythonの3倍で動作するようです(化け物か

Elixir界隈では - 再帰関数 - Enum.map

を使うかでしばしば争いが起こりますが
山崎さんは後者を「Elixir Zen Style」と名付られ、こっちの方がいいじゃんと
ただ実は再帰関数の方がEnum.mapよりもパフォーマンスが良いらしいが
Hastegaを使えば、この事実がひっくり返りElixir Zen Styleで速く美しいコードがかけるとのこと

名前はFinalFantasyのヘイスガ(パーティのスピードを上げる魔法)から来ているとのことですが
実はJose(Elixirの作者)はFFをやったことがないことが判明して、会場がドワッと笑いに包まれた

僕もElixirでFFから来ていると思ってたのでワロタ
hypeやnifっていう話が前提知識がなさすぎてついていけなくなってしまったので
別の機会にインプットして記事にでもしてみようと思う

Nervesとラダーロジック

僕のイメージElixirはweb系でサーバーやらネットワークの開発がメインでしょってのがぶち壊された
IoT(ラズパイの規模から発電所)に対してもElixirはガンガン使えるぜっていうLTで
普段自分が目を向けないレイヤーの話で非常に面白かった

会場ではラズパイを動かすデモもあり、起動した際には拍手が沸き起こった(ウオオオオオ

Nervesが海外ではPhoenixと同レベルの立ち位置にいるらしく、どれだけ注目されているかが分かる
なんと2019 09/06(木) ~ 09/07(金)にかけて下呂(岐阜県やで)にてNervesの作者がやってくるそうです
岐阜はんぱないって!!

ラダーロジックというものに関しての知識は業界不一致で皆無だったが
発電所などをクラウドで管理するにはElixirは要件を満たしくれるとのこと
pythonを使って再帰で動かした際には異常があった場合に例外投げてしまって
現状どうなっているのかが分からず、管理に凄く苦労した」

「Elixirのプロセスであれば一回、killして立ち上げ直すだけだからぴったり」

おっしゃる通りです
この2つのLTからElixirの組み込み, IoT業界での伸び代を感じぜざるを得ませんでした

Elixir プロセス入門

spawnから始めり、メッセージを送受信して、Task触って、死活管理して....
個々の知識はあって穏やかな心で聞くことが出来た

Elixirの並列処理についてどの順で学べばいいかということがフロー化されており
自分のほしかったものはこれなんだよな感が半端ない

このまま清流elixirの勉強会に使えそうで非常にありがたいです

Enum.mapから始めるElixirデータサイエンス

僕が最初にElixirを選んだ理由はまさにこれ
データ処理のしやすさ(Enum)と軽量プロセスによる並列処理
並列にゴリゴリとデータ処理ができたらpythonの弱点を克服できるやんけ!!
こんなんデータ処理のためにあるみたいなもんじゃんと調べている内に先駆者であるpiacereさんを発見

LTの内容も好きな物尽くしでElixir愛がビシビシ伝わってきました

Erlang/OTP と ejabberd を活用した Nintendo Switch(TM)向けプッシュ通知システム「NPNS」の開発事例 (任天堂 ネットワークシステム部 渡邉大洋)

凄かった。さすが任天堂やで...

この一言に尽きる
詳しい話はLTを見て頂ければいいので思ったことを書く

本質的に行なっていることは自分と変わらないと思った
問題があってそれを解決するということ(ただ数字がコネクション1億とか笑えた)

1つの課題を達成するのに半年かかったこともあるとのことで
半年間の間、正解も分からない暗い森を歩き続けられるマインドが凄い

あとは会社の技術力にも脱帽
先輩エンジニアたちの知見があるからこそ成せる技。さすが任天堂

あとErlangやりたくなった。正確にはもっとErlangについて知りたくなった

総評

いい空気を吸うことができた
いくらネットで調べたら出るといえども、地方にいると技術の風を肌で感じることができない
とくにElixirっていう日本ではマイナーな部類に入る言語ならなおさら

改めて自分の技術レベルの低さを感じた
少しでも追いつけるようにインプットしなければと思う
強くなるきっかけを得られてErlang&ElixirFest2019に本当に感謝です

おまけのコーナー

休憩時間中に行われたハンズオンのコードを置いておきます

ErlangElixirFestHandsOn2019
github

以下を実装

(1) 1000以下のランダムな数を生成し、その時間(ミリ秒)スリープした後に、その数字を返す
(5) (1)の処理を100回、並行に実行する

ランダム数値の作成やsleepの仕方、Taskについては上記のレポジトリに記述がある
Taskについてはこちらの記事でも触れている

defmodule HandsOn do
  def random_and_sleep(sec) do
    r_num = :rand.uniform(sec)
    IO.puts("stop: #{sec} ")
    :timer.sleep(sec)
    r_num
  end
  
  def main(sec, parallel_num) do
    Enum.map(0..parallel_num, fn _ -> Task.async(HandsOn, :random_and_sleep, [sec]) end)
      |> Enum.map(&(Task.await(&1)))
  end
end

sec = 100
parallel_num = 100
IO.inspect(HandsOn.main(sec, parallel_num))

結果

stop: 100
stop: 100
stop: 100
:
:
stop: 100
[84, 52, 86, 8, 23, 79, 29, 67, 28, 5, 17, 69, 98, 18, 98, 39, 94, 73,
 59, 78, 36, 25, 22, 77, 59, 60, 2, 86, 83, 29, 24, 97, 70, 18, 11, 89,
 34, 25, 27, 80, 61, 37, 53, 80, 26, 60, 22, 11, 43, 40, ...]