Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Erlang/Elixirを始めよう
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yutopp
November 20, 2016
Programming
4
640
Erlang/Elixirを始めよう
https://atnd.org/events/82619
で発表したやつ
yutopp
November 20, 2016
Tweet
Share
Other Decks in Programming
See All in Programming
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
170
Basic Architectures
denyspoltorak
0
630
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
170
CSC307 Lecture 07
javiergs
PRO
0
520
Data-Centric Kaggle
isax1015
2
710
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.7k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
520
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.1k
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
2.4k
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
170
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Ruling the World: When Life Gets Gamed
codingconduct
0
130
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
570
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
2.9k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
160
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
The Curious Case for Waylosing
cassininazir
0
230
Code Review Best Practice
trishagee
74
19k
Mind Mapping
helmedeiros
PRO
0
55
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
280
Un-Boring Meetings
codingconduct
0
190
Transcript
Erlang/Elixirを はじめよう! 2016/11/20 @yutopp A(izu)LT 東京編 0x01
目次 • 自己紹介 • Erlangを触ってみよう ◦ Erlangの特徴 ◦ Erlangの疑問点 ◦
Erlangを使うためのコツ • Elixirを触ってみよう ◦ お気持ち • 使ってみた • まとめ
自己紹介 • @yutopp • 今年シャカイに出てしまった • C++とOCamlが好きです! ◦ なぜか半年間ずっと Erlangを書いてる
Erlangってなに • 並行処理・分散処理に特化したプログラミング言語 ◦ 普段使わない脳の分野を使う羽目になる • 動的型付き言語 • 構文はPrologがベース ◦
すこししんどい • "Erlangプロセス"をつかった並行処理が目玉(アクターモデル) ◦ 軽量プロセス。これをバンバン使う • Let it crash戦略とかも特徴的 ◦ エラーハンドリングはするものの、プロセス丸ごと殺して回復させたりする • データ構造は全部 immutable ◦ プロセスごとにデータを共有することはない (例外はあるけれど…) ◦ KVSとかは別途ある
どんなとき便利? • ユーザーが投げたデータをサーバーで処理しつつリアルタイムに通信する必要が あるようなプログラムを書きたいとき ◦ 1ユーザーにつき1つのプロセスを紐つけて、独立して処理させたりできる • 複数のマシンで分散させて動かすようなプログラムを作りたいとき ◦ とくに難しいことをしなくても
[要出典]マルチノードで動かせる
Erlangプロセス/並行処理って • プロセス一つ一つが独立して動き出す、クラスのイ ンスタンスみたいなものだと思ってしまおう • プロセスごとに"メッセージ"を送りあってやりとりする ◦ 限定的には、オブジェクト指向でいうメソッド呼び出しみたい なもの[要出典] ◦
アクターモデルというやつ • メッセージが送られると自分のプロセスのメールボッ クスにそれが積まれる • メッセージがきたら返信してもいいし、捨ててもいい し自由 https://cwiki.apache.org/confluence/display/FLI NK/Akka+and+Actors
つまりErlangを書くには • ステップ1: Actor-modelに慣れる ◦ プロセスごとの役割を適切に割り振って、シンプルに協調して動くようにする ◦ プロセスごとの関係性を把握できるようにする ◦ 同期処理・非同期処理をうまく使い分ける
◦ タイミング問題に気がつけるようになる ▪ それぞれのプロセスが好き勝手動くので、タイミングによってはバグるとかある • ステップ2: OTPを使えるようにする ◦ 後述 • ステップ3: Erlang独自の作法に慣れる ◦ 書き続けてればなんとかなる … ◦ なんとかなってほしい
メッセージをやり取りするプログラム -module(sample1). main(_) -> Pid = spawn( fun() -> receive
{Sender, yo} -> Sender ! hi end end), Pid ! {self(), yo}, receive hi -> io:format("got reply!~n") end.
疑問点 • プロセスを並行で動くクラスオブジェクトと見立てた場合、このメッセージのやり取り を毎回書く必要があるのか? ◦ → 実際はそれはしんどすぎる • エラー処理とかどうするの ◦
タイムアウトとかいろいろある Erlangには、これらの挙動を公式に抽象化した長年の運用実績のあるライブラリがあ る!! OTP (Open Telecom Platform)
さっきの例をOTPを使うと… • さっきの例は、ユーザからメッセージを受け取って返事を返すもの ◦ メソッド呼び出しされたら値を返すみたいな挙動してる これはサーバでは?! gen_server ビヘイビア
こうなる %% サーバ側 -module(yo_server). -behaviour(gen_server). yo(Pid) -> gen_server:call(Pid, yo). 〜中略〜
handle_call(yo, _From, State) -> {ok, hi, State}. %% クライアント側 -module(sample2). main(_) -> Pid = yo_server:start_link(), hi = yo_server:yo(Pid), io:format("got reply!~n").
疑問点2 • 終了しないプロセスを書いたらどうなるの ◦ 永遠に生き続けるので気をつける必要がある ◦ プロセスリークと呼ばれる • やり取りしているプロセスが死んでしまったり、エラーが発生したらどうするの? ◦
直に検知する方法はある ▪ リンク・モニタ
リンクとモニタ • リンク ◦ プロセス同士を双方向で紐つける ◦ 片方が死んだら自分にシグナル (メッセージの強力なやつ )が送られてくる ◦
それをハンドルしない場合は自分も巻き込まれて死ぬ ◦ 依存の強いプロセスの管理で使う • モニタ ◦ プロセスを単方向で紐つける ◦ 監視先が死んでも自分は死なない ◦ 監視先が死んだら自分にメッセージが送られてくる
OTPを使ってしまおう • プロセスを野放しにしておくとプロセスリークするので管理する • リンクやモニタを使って、プロセス同士の依存関係を作って全て監視する • この仕組みを個々で実装してたら大変すぎ プロセスツリーを作って、プロセスの死を適切にハンドルする枠組み supervisor ビヘイビア
http://learnyousomeerlang.com/supervisors# supervisor-concepts
supervisorを使うと • リソースの確保に失敗してどうしようもなくなった。こんなとき ◦ 自身のプロセスをクラッシュさせて終わらせる • 再起動戦略を定義しておけば、supervisorが対象のプロセスを再起動してくれる ◦ 次のプロセスはきっとうまくやるでしょう。 •
なんらかのミスでプロセスが落ちたとかそんなときも有効 • 少なくともどこかしらのsupervisorにプロセスが属するように作れば、プロセスリーク しててもわかる
マルチノード • Erlangは複数のマシンで動かせる ◦ Erlangクラスタ ◦ マシンごとのErlangVMをノードと呼ぶ • 別のノードで動いているプロセスとも、普通通りの構文でメッセージのやりとりがで きる
◦ リンクもモニタも普段通り • 別のノードが唐突に落ちた場合には、そのノードで動いていたプロセスが全滅する が、リンクやモニタをしていれば通知がくるので、適切にハンドリングできる • スケールしやすい[要出典]
Erlangまとめ • Erlangで大事なのは、OTPを学んでみること ◦ 上手く使って枠組みに載せるとデカいアプリも作れるようになる ◦ 周辺ライブラリもこの作法に従っているので、手が付けやすくなる ◦ 分散・並行プログラミングで大事な部品の考え方をここで学ぶ ◦
applicationとかgem_fsmとかgen_leaderとかあるよ • 構文に慣れつつ、OTPの枠組みに乗れれば道は開かれる ◦ 最初は出来合いのサンプルをいじっていくと良いと思います。
Elixirってなに • Erlangが動くVMであるBEAMの上で動く言語 • Erlangを便利に書けるようにした言語という感じ ◦ JavaでいうScalaみたいな?でもそこまで新機能があるという感じではない • Erlangを書いていると不便だったところが改善されまくっている ◦
Erlangは1ファイル1モジュールだったり ◦ 文字列がデフォルトでリストだったり ◦ ビヘイビア実装するのが面倒だったり ◦ 動的多態が書きにくかったり ◦ → Elixirでは全部解決してる!! • 基本のライブラリはErlang/OTPまんま
Elixir触った感想 • 個人的に、Erlang/OTP触ってからやったほうが楽だと思った ◦ ElixirはErlangの周辺環境を劇的に便利にはしてくれるが、根本のライブラリは OTPまんまなので、 ドキュメントとか使用感とかは Erlangで直に触っておくととっつきやすそう • Elixirで飛んでくるエラーがErlangまんまのが多くて草
◦ Erlangやってたからパッと気付けるエラーとか結構あった気がする ◦ ただ、基本は見やすくなる (どのモジュールで起きたかとか読みやすい ) • Rubyっぽく書けるけど全然Rubyじゃないので気をつけよう • Elixirから触るのであれば、何か作りつつ並行プログラミングに慣れていくと楽しそ う ◦ PhoenixというWAFがあり、楽しい
実際に触ってみた • 鳥小屋をElixirで作ってみた ◦ ユーザーからの入力 ◦ サーバーで実行しつつリアルタイムで出力を転送 ◦ アクターモデルだと楽に書けそうだった •
デモ(作りかけ) • 続きはアドベントカレンダーで書きます…
まとめ • 並行・分散システムは普段使わない部分の脳を使う気がして楽しい ◦ 個々のプロセスが好き勝手動くので気をつかう ◦ OTPがなければ死んでいたというくらい便利ですごい ◦ 楽しい •
ぜひ使ってみましょう!!!! • 初めてElixirから手を付けるなら、phoenixでウェブアッピを書いてみるのをオススメ ◦ 必要な部品が大体揃っているので、作りつつ慣れていくのに最適では ◦ ただ、あまり分散システムという感じはしない …
便利ライブラリ・ツール紹介 Erlang編 • rebar - erlang用ビルドツール • cowboy - webフレームワーク
• eunit - 単体テスト • ct - 結合テスト • meck - モック • dialyzer - 型チェッカ • escript - それとなくerlangを実行できる • recon - 優秀デバッガ Elixir編 • mix - elixir用ビルドツール • phoenix - webフレームワーク • ecto - ORM • exunit - 単体テスト
おしまい 質問して 参考文献 Learn You Some Erlang for great good! (すごいErlang愉快に学ぼうの英語版)
Erlang/OTP Documentation (公式ドキュメント) sile - Qiita (参考になる記事とライブラリいろいろ) 響け!ユーフォニアム2 [最新話無料] - ニコニコチャンネル:アニメ (観て)