Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Erlang/Elixirを始めよう
Search
yutopp
November 20, 2016
Programming
680
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Erlang/Elixirを始めよう
https://atnd.org/events/82619
で発表したやつ
yutopp
November 20, 2016
Other Decks in Programming
See All in Programming
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
510
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
380
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
710
はじめてのPLATEAU
nokonoko1203
1
370
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
8.5k
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
200
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
120
Next.js: The final boss of Web Performance
guaca
0
380
AI駆動開発4年目の現在地(『あなたはFDEになるべきか?』イベント資料)
kumaiu
0
130
小さなアプリを作って公開するまで
onozaty
0
110
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.2k
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
First, design no harm
axbom
PRO
2
1.4k
Raft: Consensus for Rubyists
vanstee
143
7.8k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
390
Paper Plane
katiecoart
PRO
5
54k
4 Signs Your Business is Dying
shpigford
187
23k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
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 [最新話無料] - ニコニコチャンネル:アニメ (観て)