MacBookでElixirの２ノード間通信を試してみる

__Dave Thomas（著）&笹田・鳥井（共訳）『プログラミングElixir 第２版』（Ohmsha） *pp.226-227*__を、MacBookで実行してみました。

###Node１

- Node１を立ち上げる。（ノード名： __*:one*__) 

```erlang:Terminal_1
diy@electronnoMacBook-Pro ~ % iex --sname one
Erlang/OTP 24 [erts-12.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]

Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(one@electronnoMacBook-Pro)1>
```

- __*:two*__という名前を持つノードのノードIDを探す（この時すでに、Node２側が起動されていて、__*global*__に__*:two*__というノード名が登録済みであることを前提としている）
- __*whereis*__と__*:two*__の間に、半角スペースが必要
- __*:two*__という名前を持つノードが見つかったら、そのノードに__*two*__というアトムを束縛する。
- __two__（という名前をつけたノード）に対して、__IO.puts("Hello")を送信__する。
- __two__（という名前をつけたノード）に対して、__IO.puts("World")を送信__する。

```erlang:Terminal_1
iex(one@electronnoMacBook-Pro)4> two = :global.whereis_name :two
#PID<11937.71.0>
iex(one@electronnoMacBook-Pro)5> IO.puts(two, "Hello")
:ok
iex(one@electronnoMacBook-Pro)6> IO.puts(two, "World!")
:ok
iex(one@electronnoMacBook-Pro)7> 
```

###Node２

- Node２を立ち上げる。（ノード名： __*:two*__) 
- __*Node.connect*関数__を使って、__Node１に接続する。__（その結果、Node１からも、Node２にアクセスできるようになる）
- __*global*__に__*:two*__というノード名で、自分自身を登録する。
- 送信者Node１から送られてきたメッセージ受信した、__IO.puts("Hello")を受信__する。
- __IO.puts("Hello")が評価（実行）__される。
- 送信者Node１から送られてきたメッセージ受信した、__IO.puts("World")を受信__する。
- __IO.puts("World")が評価（実行）__される。

```erlang:Terminal_1
diy@electronnoMacBook-Pro ~ % iex --sname two
Erlang/OTP 24 [erts-12.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]

Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(two@electronnoMacBook-Pro)1> Node.connect(:"one@electronnoMacBook-Pro")
true
iex(two@electronnoMacBook-Pro)2> :global.register_name(:two, :erlang.group_leader)
:yes
Hello                                  
World!                                 
iex(two@electronnoMacBook-Pro)3> 
```

##入出力の順序

####手順１（Node１側）

- Node１を立ち上げる。（ノード名： __*:one*__) 

```erlang:Terminal_1
diy@electronnoMacBook-Pro ~ % iex --sname one
Erlang/OTP 24 [erts-12.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]

Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(one@electronnoMacBook-Pro)1>
```

####手順２（Node２側）

- Node２を立ち上げる。（ノード名： __*:two*__) 
- __*Node.connect*関数__を使って、__Node１に接続する。__（その結果、Node１からも、Node２にアクセスできるようになる）__
- __*global*__に__*:two*__というノード名で、自分自身を登録する。

```erlang:Terminal_2
diy@electronnoMacBook-Pro ~ % iex --sname two
Erlang/OTP 24 [erts-12.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]

Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(two@electronnoMacBook-Pro)1> Node.connect(:"one@electronnoMacBook-Pro")
true
iex(two@electronnoMacBook-Pro)2> :global.register_name(:two, :erlang.group_leader)
:yes
```
####手順３（Node１側）

- __*:two*__という名前を持つノードのノードIDを探す（この時すでに、手順２で、Node２側が起動されていて、__*global*__に__*:two*__というノード名が登録済み）
- __*whereis*__と__*:two*__の間に、半角スペースが必要
- __*:two*__という名前を持つノードが見つかったら、そのノードに__*two*__というアトムを束縛する。

```erlang:Terminal_1
iex(one@electronnoMacBook-Pro)1> two = :global.whereis_name:two
** (SyntaxError) iex:2:15: keyword argument must be followed by space after: whereis_name:

iex(one@electronnoMacBook-Pro)4> two = :global.whereis_name :two
#PID<11937.71.0>
iex(one@electronnoMacBook-Pro)5>
```

####手順４（Node１側）

- __two__（という名前をつけたノード）に対して、__IO.puts("Hello")を送信__する。

```erlang:Terminal_2
iex(one@electronnoMacBook-Pro)5> IO.puts(two, "Hello")
:ok
```

####手順５（Node２側）

- 送信者Node１から送られてきたメッセージ受信した、__IO.puts("Hello")を受信__する。
- __IO.puts("Hello")が評価（実行）__される。

```erlang:Terminal_1
iex(two@electronnoMacBook-Pro)2> :global.register_name(:two, :erlang.group_leader)
:yes
Hello 
```

####手順６（Node１側）

- __two__（という名前をつけたノード）に対して、__IO.puts("World")を送信__する。

```erlang:Terminal_1
iex(one@electronnoMacBook-Pro)6> IO.puts(two, "World!")
:ok
iex(one@electronnoMacBook-Pro)7> 
```

####手順７（Node２側）

- 送信者Node１から送られてきたメッセージ受信した、__IO.puts("World")を受信__する。
- __IO.puts("World")が評価（実行）__される。

```erlang:Terminal_2
iex(two@electronnoMacBook-Pro)2> :global.register_name(:two, :erlang.group_leader)
:yes
Hello                                  
World!                                 
iex(two@electronnoMacBook-Pro)3> 
```