SlideShare a Scribd company logo
ElixirConf US 2023 に参加
してきました
(オンライン)
NHK の人ですか?(自己紹介)
● サーバーエンジニア(新規開発)
● 関数型プログラミング言語大好き
● Rust も好き
● 今年の年末までコンシューマーゲームいっぱい出ますのでワクワクしている
○ Starfield (まだ買っていない)
○ Baldur’s Gate 3 (もうすぐ 250 時間超える)
○ Cities: Skylines 2
○ For the King 2
○ などなど
場所
● JW Marriott Orlando Bonnet Creek Resort & Spa
● めちゃ豪華そうなところ
行きませんでした
2023-10-10_ElixirConf US 2023に参加してきました(レポート)
トラック制
● RubyKaigi と似たような三つのトラックがある
● ≠
トラック テンマ
● 我流分類
○ Elixir
○ Phoenix
○ エンジニアリング・マネジメント
○ 分散 Elixir ・ Erlang
○ AI
Elixir
コードの臭い
● うちの PJT では臭いを減らすのは
よくできていると思う
○ nested if
○ 関数名
○ 変数名
○ パターンマッチングと guard
○ 長すぎる関数
○ 動的な atom 作成
コードの臭い
● その他の Elixir の臭い
○ デカいモジュール
○ 関係のないパターンマッチング
○ 複雑な with
コードの臭い
● Elixir 1.16 以降公式の anti-pattern が記載されるようになるらしい (WIP)
○ https://hexdocs.pm/elixir/main/what-anti-patterns.html
LiveView は BEAM プロセス
● NOT
○ スレッド
○ システムプロセス
● YES
○ Erlang 並行性プリミティブ
○ マイクロ秒で起動
○ 代表する pid (= process id) →
がある cf. Golang
○ 不変性
○ 孤立
○ メッセージング
○ それそれ自分のスタックとヒープがある( shared memory 上で配置)
○ 1 秒で百万以上作れる
○ scheduler の間に自動的な migration→ref. :erlang.system_info(:schedulers) ( starvation を避
ける)
○ 並列 GC→ref. :erlang.statistics(:garbage_collection)
LiveView は BEAM プロセス
● GenServer
○ Generic Server
○ クライアント (caller) とサーバー
○ 基本的には自分自身を再帰で呼び出すもの
○ GenServer.start_link/3 は init/1 callback を待つ
○ GenServer.call/3 は handle_call/3 callback を待つ
○ handle_call/3 と handle_cast/2 以外の全てのメッセージは handle_info/2 へ
○ メールボックスは FIFO
● LiveView はプロセス
○ handle_info で非同期で何かしらの処理をすることもできる
○ GenServer と同じ、ブロッキングに注意
○ 閉じたらステートがなくなる
○ Task.async はプロセスが死んだら await 側もなくなる
○ その際、 Task.Supervisor.async_nolink の使用はおすすめ
○ PubSub でクライアントに通知
State
1. システム環境変数
2. Port
3. Socket
4. ファイル
5. BEAM プロセス (spawn)
6. GenServer
7. Process Dictionary
8. NIF (Native Implemented Functions)
9. ETS
10.Atomics (:atomic)
11. モジュール
12.Persistent Term
Metaprogramming
● エスティ ローダー オンライン
● デザイナーがページの template を作
る
● コンパイル時点では template がわか
らない(データベースに保存されて
いる)
● EEx.function_from_string/5 で動的に関
数を作る
○ 問題: def が生成されるため runtime では実行できない
● 外に quote で AST を生成
● Code.compile_quoted/2
○ コンパイルされたバイナリコードだけではなく
○ BEAM VM にロードする
● 結果
○ 動的に LiveView を生成している
○ render time: 462ms → 65.8ms
Ecto
● fragment/1
○ 既存の Ecto query と合わせて Ecto がサ
ポートしていないデータベースの機能
を使える
● put_dynamic_repo/1
○ MyApp.Repo.start_link/1 は :name
と :hostname で複数のレポジトリを起動
できる
○ 起動できますが、 query をするときどの
レポジトリを指定することはできない
■ use Ecto.Repo,
default_dynamic_repo: :name_of_re
po
■ MyApp.Repo.put_dynamic_repo(:te
nant_name)
ex_cldr
● cldr = Unicode Common Data
Repository :
https://github.com/unicode-org/cldr
● →
静的なテキスト gettext
● →
変数 ex_cldr
● →
データレコード ex_cldr_trans
ex_cldr
ex_cldr
ex_cldr_trans
https://github.com/elixir-cldr/cldr
Phoenix
ネクスト Phoenix
● Long Polling Fallback サポート
○ レイテンシが高い、通信環境が悪い場合
○ セッションベースで一度 long polling に fallback する
と覚えてくれる
● Scope
○ 色々な情報が入っているので細かく条件判断などができる
○ あったら嬉しい機能という感じ
ネクスト Phoenix
● dns_cluster : https://github.com/phoenixframework/dns_cluster
● pid はグローバルアクセス可能
● LiveView はプロセス
ネクスト Phoenix
● Dev/ デバッグツール
○ ブラウザでソースコードを見るとき
各コンポーネントが見えるように
なった
○ Option クリックするとそのまま
エディタに移動できる
ネクスト Phoenix
● デバッグメッセージ
○ ブラウザのコンソールで
サーバー、クライアント
両方のデバッグメッセージ
が見えるようになった
● その他
○ assign_async
○ UploadWriter : https://fly.io/phoenix-files/streaming-uploads-with-liveview/
LiveView Native
● 0.1 リリース
● LiveView Native Core - Rust
● LiveView Native - Elixir
● LiveView Client SwiftUI (iOS)
● LiveView Client JetPack (Android)
LiveView Native
● ElixirConf Chat - https://github.com/liveview-native/elixirconf_chat
● マルチプレイヤーゲーム
○ プレーヤー状態監視: Presence
○ サーバー: Phoenix.PubSub
その他
● Beacon CMS : https://beaconcms.org/
● Vox 静的サイトジェネレーター: https://github.com/geolessel/vox
○ Ref. Jekyll (Ruby)
○ Ref. Hugo (Go)
エンジニアリング・マネジメント
トレーニング
● 失敗できる空間を作る
○ 挑戦させて、失敗させて( Let It Crash )
● Google の 20% ルール
○ 20% の時間をサイドプロジェクト、学習などで使わせる
● Atlassian ShipIt Day
○ 24 時間のハッカソン
● Ownership
○ 一部の機能でも担当してもらうこと
● インターンを任せること
○ 全員にインターンを担当してもらう
○ お金と時間的には難しい
○ 体験学習、自分の知識を更に強化する
○ ELI5 (Explain Like I’m 5)
マネジメント
● サンプル:例えば2種類の人が
いる
○ Action Oriented
■ 問題の発見
■ コードの修正、追加
■ 手が速い
○ Collaborative
■ Peer programming 好きかも
■ Group programming 好きかも
■ 人それぞれの意見を聞く
● どっちもやりすぎるとよくない
マネジメント
● 状況・事実の理解 (Situation)
○ 事実
○ 日時
○ PR
● 行為の分析 (Behavior)
○ レビューなしでコミットしちゃった?
○ 事前の相談がなかった?
● 影響 (Impact)
○ チーム全員に何か影響を与えた?
■ 論理的な影響だけではなく
■ 気持ち的にも
マネジメント
● 結果
○ 改めて MTG を設定するとか
○ お詫びとか
● チームメンバーの意見を聞く
○ 大事なのは「君の意見が伝わった、何とかするから」ということを伝える
○ Safe & Protective
○ 具体的にどんなことなのか伝えなくてもいい
● Feedback sandwich のデメリット
○ 人である限り悪い話を無視するがち
○ うまいことしか耳に入らない
分散 Elixir ・ Erlang
Dist Filtering
● Erlang/OTP は「信頼できる環境」という前提として作ったもの
○ https://erlang.org/pipermail/erlang-questions/2009-October/047002.html
● 分散 Erlang/Elixir は強力ですが危険
○ :erlang.spawn_request
○ {:”$gen_cast”, {:cast, System, :halt, [1], Process.group.leader()}}
● https://github.com/WhatsApp/erldist_filter
その他
● Sibyl (tracing と telemetry) : https://hex.pm/packages/sibyl
● Broadway ( 並行、マルチステージデータ処理 ) :
https://hex.pm/packages/broadway
次の ElixirConf
● ElixirConf EU 2024 4月 @ リスボン

More Related Content

PPTX
Elixir-Conf-Japan-2017-session-ohr486
PPTX
running-elixir-in-production
PPTX
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
PDF
Elixirを利用した繊細なwebチャットの開発
PPTX
やや関数型を意識した風Elixir/Phoenixご紹介
PDF
パーフェクト"Elixir情報収集"
PDF
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir-Conf-Japan-2017-session-ohr486
running-elixir-in-production
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixirを利用した繊細なwebチャットの開発
やや関数型を意識した風Elixir/Phoenixご紹介
パーフェクト"Elixir情報収集"
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります

Similar to 2023-10-10_ElixirConf US 2023に参加してきました(レポート) (20)

PDF
IEXを学ぶ
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
PPTX
Phoenixでblog作った
PDF
Phoenix Framework
PPTX
Ll tiger clojure
PPTX
Tokyoex#5 Questions
PDF
ニコニコを支える Erlang / Elixir
PPTX
Elixirハンズオン2
ODP
Next-L Enju 第1回開発ワークショップ資料
PPTX
E言語スタック
PDF
Elixirだ 第1回 - 基礎だ -
PPTX
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
PDF
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
PPT
Scala Daysに行ってみて
PPT
Heliumエンジンの設計と実装
PDF
160911 handson elixir_phoenix
PDF
Elixirだ 第6回
PDF
OpenStack + Common Lisp
PDF
第4回 kochi.ex オン・オフラインミーティング
KEY
Clojureの発表など
IEXを学ぶ
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
Phoenixでblog作った
Phoenix Framework
Ll tiger clojure
Tokyoex#5 Questions
ニコニコを支える Erlang / Elixir
Elixirハンズオン2
Next-L Enju 第1回開発ワークショップ資料
E言語スタック
Elixirだ 第1回 - 基礎だ -
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
Scala Daysに行ってみて
Heliumエンジンの設計と実装
160911 handson elixir_phoenix
Elixirだ 第6回
OpenStack + Common Lisp
第4回 kochi.ex オン・オフラインミーティング
Clojureの発表など
Ad

2023-10-10_ElixirConf US 2023に参加してきました(レポート)

  • 1. ElixirConf US 2023 に参加 してきました (オンライン)
  • 2. NHK の人ですか?(自己紹介) ● サーバーエンジニア(新規開発) ● 関数型プログラミング言語大好き ● Rust も好き ● 今年の年末までコンシューマーゲームいっぱい出ますのでワクワクしている ○ Starfield (まだ買っていない) ○ Baldur’s Gate 3 (もうすぐ 250 時間超える) ○ Cities: Skylines 2 ○ For the King 2 ○ などなど
  • 3. 場所 ● JW Marriott Orlando Bonnet Creek Resort & Spa ● めちゃ豪華そうなところ
  • 6. トラック制 ● RubyKaigi と似たような三つのトラックがある ● ≠ トラック テンマ ● 我流分類 ○ Elixir ○ Phoenix ○ エンジニアリング・マネジメント ○ 分散 Elixir ・ Erlang ○ AI
  • 8. コードの臭い ● うちの PJT では臭いを減らすのは よくできていると思う ○ nested if ○ 関数名 ○ 変数名 ○ パターンマッチングと guard ○ 長すぎる関数 ○ 動的な atom 作成
  • 9. コードの臭い ● その他の Elixir の臭い ○ デカいモジュール ○ 関係のないパターンマッチング ○ 複雑な with
  • 10. コードの臭い ● Elixir 1.16 以降公式の anti-pattern が記載されるようになるらしい (WIP) ○ https://hexdocs.pm/elixir/main/what-anti-patterns.html
  • 11. LiveView は BEAM プロセス ● NOT ○ スレッド ○ システムプロセス ● YES ○ Erlang 並行性プリミティブ ○ マイクロ秒で起動 ○ 代表する pid (= process id) → がある cf. Golang ○ 不変性 ○ 孤立 ○ メッセージング ○ それそれ自分のスタックとヒープがある( shared memory 上で配置) ○ 1 秒で百万以上作れる ○ scheduler の間に自動的な migration→ref. :erlang.system_info(:schedulers) ( starvation を避 ける) ○ 並列 GC→ref. :erlang.statistics(:garbage_collection)
  • 12. LiveView は BEAM プロセス ● GenServer ○ Generic Server ○ クライアント (caller) とサーバー ○ 基本的には自分自身を再帰で呼び出すもの ○ GenServer.start_link/3 は init/1 callback を待つ ○ GenServer.call/3 は handle_call/3 callback を待つ ○ handle_call/3 と handle_cast/2 以外の全てのメッセージは handle_info/2 へ ○ メールボックスは FIFO ● LiveView はプロセス ○ handle_info で非同期で何かしらの処理をすることもできる ○ GenServer と同じ、ブロッキングに注意 ○ 閉じたらステートがなくなる ○ Task.async はプロセスが死んだら await 側もなくなる ○ その際、 Task.Supervisor.async_nolink の使用はおすすめ ○ PubSub でクライアントに通知
  • 13. State 1. システム環境変数 2. Port 3. Socket 4. ファイル 5. BEAM プロセス (spawn) 6. GenServer 7. Process Dictionary 8. NIF (Native Implemented Functions) 9. ETS 10.Atomics (:atomic) 11. モジュール 12.Persistent Term
  • 14. Metaprogramming ● エスティ ローダー オンライン ● デザイナーがページの template を作 る ● コンパイル時点では template がわか らない(データベースに保存されて いる) ● EEx.function_from_string/5 で動的に関 数を作る ○ 問題: def が生成されるため runtime では実行できない ● 外に quote で AST を生成 ● Code.compile_quoted/2 ○ コンパイルされたバイナリコードだけではなく ○ BEAM VM にロードする ● 結果 ○ 動的に LiveView を生成している ○ render time: 462ms → 65.8ms
  • 15. Ecto ● fragment/1 ○ 既存の Ecto query と合わせて Ecto がサ ポートしていないデータベースの機能 を使える ● put_dynamic_repo/1 ○ MyApp.Repo.start_link/1 は :name と :hostname で複数のレポジトリを起動 できる ○ 起動できますが、 query をするときどの レポジトリを指定することはできない ■ use Ecto.Repo, default_dynamic_repo: :name_of_re po ■ MyApp.Repo.put_dynamic_repo(:te nant_name)
  • 16. ex_cldr ● cldr = Unicode Common Data Repository : https://github.com/unicode-org/cldr ● → 静的なテキスト gettext ● → 変数 ex_cldr ● → データレコード ex_cldr_trans
  • 21. ネクスト Phoenix ● Long Polling Fallback サポート ○ レイテンシが高い、通信環境が悪い場合 ○ セッションベースで一度 long polling に fallback する と覚えてくれる ● Scope ○ 色々な情報が入っているので細かく条件判断などができる ○ あったら嬉しい機能という感じ
  • 22. ネクスト Phoenix ● dns_cluster : https://github.com/phoenixframework/dns_cluster ● pid はグローバルアクセス可能 ● LiveView はプロセス
  • 23. ネクスト Phoenix ● Dev/ デバッグツール ○ ブラウザでソースコードを見るとき 各コンポーネントが見えるように なった ○ Option クリックするとそのまま エディタに移動できる
  • 24. ネクスト Phoenix ● デバッグメッセージ ○ ブラウザのコンソールで サーバー、クライアント 両方のデバッグメッセージ が見えるようになった ● その他 ○ assign_async ○ UploadWriter : https://fly.io/phoenix-files/streaming-uploads-with-liveview/
  • 25. LiveView Native ● 0.1 リリース ● LiveView Native Core - Rust ● LiveView Native - Elixir ● LiveView Client SwiftUI (iOS) ● LiveView Client JetPack (Android)
  • 26. LiveView Native ● ElixirConf Chat - https://github.com/liveview-native/elixirconf_chat ● マルチプレイヤーゲーム ○ プレーヤー状態監視: Presence ○ サーバー: Phoenix.PubSub
  • 27. その他 ● Beacon CMS : https://beaconcms.org/ ● Vox 静的サイトジェネレーター: https://github.com/geolessel/vox ○ Ref. Jekyll (Ruby) ○ Ref. Hugo (Go)
  • 29. トレーニング ● 失敗できる空間を作る ○ 挑戦させて、失敗させて( Let It Crash ) ● Google の 20% ルール ○ 20% の時間をサイドプロジェクト、学習などで使わせる ● Atlassian ShipIt Day ○ 24 時間のハッカソン ● Ownership ○ 一部の機能でも担当してもらうこと ● インターンを任せること ○ 全員にインターンを担当してもらう ○ お金と時間的には難しい ○ 体験学習、自分の知識を更に強化する ○ ELI5 (Explain Like I’m 5)
  • 30. マネジメント ● サンプル:例えば2種類の人が いる ○ Action Oriented ■ 問題の発見 ■ コードの修正、追加 ■ 手が速い ○ Collaborative ■ Peer programming 好きかも ■ Group programming 好きかも ■ 人それぞれの意見を聞く ● どっちもやりすぎるとよくない
  • 31. マネジメント ● 状況・事実の理解 (Situation) ○ 事実 ○ 日時 ○ PR ● 行為の分析 (Behavior) ○ レビューなしでコミットしちゃった? ○ 事前の相談がなかった? ● 影響 (Impact) ○ チーム全員に何か影響を与えた? ■ 論理的な影響だけではなく ■ 気持ち的にも
  • 32. マネジメント ● 結果 ○ 改めて MTG を設定するとか ○ お詫びとか ● チームメンバーの意見を聞く ○ 大事なのは「君の意見が伝わった、何とかするから」ということを伝える ○ Safe & Protective ○ 具体的にどんなことなのか伝えなくてもいい ● Feedback sandwich のデメリット ○ 人である限り悪い話を無視するがち ○ うまいことしか耳に入らない
  • 34. Dist Filtering ● Erlang/OTP は「信頼できる環境」という前提として作ったもの ○ https://erlang.org/pipermail/erlang-questions/2009-October/047002.html ● 分散 Erlang/Elixir は強力ですが危険 ○ :erlang.spawn_request ○ {:”$gen_cast”, {:cast, System, :halt, [1], Process.group.leader()}} ● https://github.com/WhatsApp/erldist_filter
  • 35. その他 ● Sibyl (tracing と telemetry) : https://hex.pm/packages/sibyl ● Broadway ( 並行、マルチステージデータ処理 ) : https://hex.pm/packages/broadway
  • 36. 次の ElixirConf ● ElixirConf EU 2024 4月 @ リスボン