SlideShare ist ein Scribd-Unternehmen logo
1 von 14
Downloaden Sie, um offline zu lesen
株式会社エクストーン
下っ端
豊田陽一
!  プログラミングErlang

◦  Erlangの強力な並列性に触れてみよう
"  モジュール
"  関数定義
"  プロセス間のメッセージ送信
"  OTP
!  1つのファイルにまとめられた関数群
=== test1.erl ===
-module(test1)
-export([add/2])
add(a, b) ->
a + b.
=== test1.erl ===
1> c(test1)
{ok,test1}
2> test1:add(1, 2).
3

モジュール名の宣言
このモジュールで外部に公開する関数の宣言
関数定義
!  パターンマッチ

◦  引数のパターンに応じて呼び出すコード
を変えることが出来る
torpedo({_, submarine}) ->
true;
torpedo({_, 'heavy torpedo cruiser'}) ->
true;
torpedo({_, _}) ->
false.
1> test1:torpedo({“Kitakami”, ‘heavy torpedo cruiser’).
true
2> test1:torpedo({“Kongo”, battleship}).
false
!  ガード

◦  パターンマッチより詳細な条件を記述
torpedo_submarine(Level, Ko_Hyoteki) ->
when Ko_Hyoteki =:= true ; Level >= 10
true;
torpedo_submarine(_, _) ->
false.
1> test1:torpedo_submarine(12, false).
true
2> test1:torpedo_submarine(8, true).
true
3> test1:torpedo_submarine(8, false).
false
! 

ガードと似ている

night_combat(MainWeapon, SubWeapon, Torpedo) ->
if Torpedo >= 2 ;
MainWeapon >= 3 ;
MainWeapon =:= 2 andalso SubWeapon >= 1 ;
MainWeapon >= 1 andalso MainWeapon =< 2 andalso Torpedo =:= 1 ->
cutin;
MainWeapon =:= 2 andalso SubWeapon =:= 0 andalso Torpedo =:= 0 ;
MainWeapon =:= 1 andalso SubWeapon >= 1 andalso Torpedo =:= 0 ;
MainWeapon =:= 0 andalso SubWeapon >= 2 andalso Torpedo =< 1 ->
'double strike';
true ->
'single strike'
end.
1> test1:night_combat(1, 1, 1).
cutin
2> test1:night_combat(1, 0, 0).
‘single strike’
!  spawn/1

◦  関数を引数に取り、プロセスを作成
◦  別のプロセスの実行結果は受け取れない
1> F = fun() -> 1 + 2 end.
#Fun<erl_eval.20.80484245>
2> spawn(F).
<0.35.0>
!  !

(Bang)

◦  Pidにメッセージを送信する
1> self() ! hello.
hello
2> self() ! ‘hello world’.
‘hello world’
3> flush().
Shell got hello
Shell got 'hello world'
ok
receive

! 

◦  メッセージを受信
1> Func = fun() ->
receive
{Pid, N} when N rem 2 =:= 0 -> Pid ! even;
{Pid, _} -> Pid ! odd;
end
end.
#Fun<erl_eval.20.80484245>
2> Rmt = spawn(Func).
<0, 34, 0>
3> Rmt ! {self(), 4}.
{self(), 4}
4> flush().
Shell got even
ok
! 

プロセス間で作成される特定の関係
◦  片方が死ぬともう片方も死ぬ

1> self().
<0.41.0>
2> spawn_link(
fun() ->
timer:sleep(5000), exit(reason)
end).
<0.45.0>
** exception error: reason
3> self().
<0.51.0>
! 

プロセスの監視を行う
◦  プロセスが死んだらメッセージを受信

restarter() ->
receive
{'DOWN', Ref, process, Pid, Reason} ->
spawn_monitor(fun test1:hoge/0),
restarter()
after 10000 ->
ok
end.
hoge() ->
io:format("hoge~n", []),
timer:sleep(5000).
!  実行してみる
1> spawn_monitor(fun test1:hoge/0).
hoge
{<0.44.0>,#Ref<0.0.0.111>}
2> test1:restarter().
hoge
hoge
hoge
hoge
!  モニター開始/終了

◦  erlang:monitor(process, Pid) -> Ref
"  Pidのプロセスをモニター開始

◦  erlang:demonitor(Ref) -> true
"  モニター終了

!  監視している側にメッセージが届く

◦  { DOWN , Ref, process, Pid, Reason}
"  DOWN :シンボル
"  Ref:監視しているモニターオブジェクトの参
照
"  Pid:死んだプロセスのID
"  Reason:プロセスが死んだ理由
!  プロセス通信の基本部分を見てみた

◦  次回はいよいよOTPに踏み込んで、実用
的なアプリケーションの話をします
◦  多分…

Weitere ähnliche Inhalte

Was ist angesagt?

Away3D 4.1 パーティクル入門
Away3D 4.1 パーティクル入門Away3D 4.1 パーティクル入門
Away3D 4.1 パーティクル入門
Yasunobu Ikeda
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 

Was ist angesagt? (20)

Project Loom + Project Panama
Project Loom + Project PanamaProject Loom + Project Panama
Project Loom + Project Panama
 
講座Java入門
講座Java入門講座Java入門
講座Java入門
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Away3D 4.1 パーティクル入門
Away3D 4.1 パーティクル入門Away3D 4.1 パーティクル入門
Away3D 4.1 パーティクル入門
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
from old java to java8 - KanJava Edition
from old java to java8 - KanJava Editionfrom old java to java8 - KanJava Edition
from old java to java8 - KanJava Edition
 
xUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency InjectionxUTP Chapter26. Dependency Injection
xUTP Chapter26. Dependency Injection
 
R_note_ODE_ver1.0
R_note_ODE_ver1.0R_note_ODE_ver1.0
R_note_ODE_ver1.0
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
jQuery.Deferredってシンプルなんだぜ
jQuery.DeferredってシンプルなんだぜjQuery.Deferredってシンプルなんだぜ
jQuery.Deferredってシンプルなんだぜ
 
PostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろうPostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろう
 
About Jobs
About JobsAbout Jobs
About Jobs
 
20180123 power shell
20180123 power shell20180123 power shell
20180123 power shell
 
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
 
Rakuten tech conf
Rakuten tech confRakuten tech conf
Rakuten tech conf
 
Cloud computing competition by Hapyrus
Cloud computing competition by HapyrusCloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 

Andere mochten auch

Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
Yoichi Toyota
 
BDM37 - Simon Grondin - Scaling an API proxy in OCaml
BDM37 - Simon Grondin - Scaling an API proxy in OCamlBDM37 - Simon Grondin - Scaling an API proxy in OCaml
BDM37 - Simon Grondin - Scaling an API proxy in OCaml
Big Data Montreal
 
恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男
Tomoyuki Matsuura
 

Andere mochten auch (7)

ゆとりがErlangを始めるようです
ゆとりがErlangを始めるようですゆとりがErlangを始めるようです
ゆとりがErlangを始めるようです
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
 
POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育POSIX中心主義と情報科学教育
POSIX中心主義と情報科学教育
 
BDM37 - Simon Grondin - Scaling an API proxy in OCaml
BDM37 - Simon Grondin - Scaling an API proxy in OCamlBDM37 - Simon Grondin - Scaling an API proxy in OCaml
BDM37 - Simon Grondin - Scaling an API proxy in OCaml
 
恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男恐怖!シェルショッカー1号男
恐怖!シェルショッカー1号男
 
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
 
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
 

Ähnlich wie Erlangのマルチプロセスを触ってみた (8)

Elixirだ 第2回
Elixirだ 第2回Elixirだ 第2回
Elixirだ 第2回
 
Akka Unit Testing
Akka Unit TestingAkka Unit Testing
Akka Unit Testing
 
Uart受信設計2013
Uart受信設計2013Uart受信設計2013
Uart受信設計2013
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 
あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)あんなテスト、こんなテスト(this and that about testing)
あんなテスト、こんなテスト(this and that about testing)
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語Scala
 

Mehr von Yoichi Toyota

Mehr von Yoichi Toyota (20)

超フランクにスクラムの大事なことの話をする
超フランクにスクラムの大事なことの話をする超フランクにスクラムの大事なことの話をする
超フランクにスクラムの大事なことの話をする
 
ジャワカレーをおいしく作る最後の一押し
ジャワカレーをおいしく作る最後の一押しジャワカレーをおいしく作る最後の一押し
ジャワカレーをおいしく作る最後の一押し
 
ライブラリを作る思考回路
ライブラリを作る思考回路ライブラリを作る思考回路
ライブラリを作る思考回路
 
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
 
はじめてのDynamoDBスキーマ設計
はじめてのDynamoDBスキーマ設計はじめてのDynamoDBスキーマ設計
はじめてのDynamoDBスキーマ設計
 
オブジェクト指向についてあまり知られていないこと
オブジェクト指向についてあまり知られていないことオブジェクト指向についてあまり知られていないこと
オブジェクト指向についてあまり知られていないこと
 
Ruby is comming ractor編
Ruby is comming ractor編Ruby is comming ractor編
Ruby is comming ractor編
 
array.map(&:key)ってなんやねん
array.map(&:key)ってなんやねんarray.map(&:key)ってなんやねん
array.map(&:key)ってなんやねん
 
はじめてのPull Request
はじめてのPull RequestはじめてのPull Request
はじめてのPull Request
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
jqで極めるシェル芸の話
jqで極めるシェル芸の話jqで極めるシェル芸の話
jqで極めるシェル芸の話
 
足し算をつくろう
足し算をつくろう足し算をつくろう
足し算をつくろう
 
React Hooksでカスタムフックをつくろう
React HooksでカスタムフックをつくろうReact Hooksでカスタムフックをつくろう
React Hooksでカスタムフックをつくろう
 
ActionCableのクライアントはRails外から利用できるのか
ActionCableのクライアントはRails外から利用できるのかActionCableのクライアントはRails外から利用できるのか
ActionCableのクライアントはRails外から利用できるのか
 
サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方サーバーレスアプリケーションの作り方
サーバーレスアプリケーションの作り方
 
SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方SPA時代のOGPとの戦い方
SPA時代のOGPとの戦い方
 
AWS WAFでらくらくファイアーウォール生活
AWS WAFでらくらくファイアーウォール生活AWS WAFでらくらくファイアーウォール生活
AWS WAFでらくらくファイアーウォール生活
 
Docker in production
Docker in productionDocker in production
Docker in production
 
How to fight against “full scratch disease”
How to fight against  “full scratch disease”How to fight against  “full scratch disease”
How to fight against “full scratch disease”
 
Amazon lexを触ってみた
Amazon lexを触ってみたAmazon lexを触ってみた
Amazon lexを触ってみた
 

Erlangのマルチプロセスを触ってみた