ElixirでIoT#1.1.1：ラズパイへのErlang/Elixir環境の構築

この記事は[「fukuoka.ex(その2) Elixir Advent Calendar 2017」](https://adventar.org/calendars/2871)の2日目，および
[「Raspberry Pi Advent Calendar 2017」](https://qiita.com/advent-calendar/2017/raspberry-pi)の19日目です．

昨日は，@zacky1972さんの「[ZEAM開発ログv0.1.4 Python/NumPyとElixir/Flow一本勝負！ElixirはAI/ML業界に革命をもたらすか!?](https://qiita.com/zacky1972/items/5e7a31b3ee03bc0d31dd)」でした．

# はじめに

どうもこんにちは．
[fukuoka.ex](https://fukuokaex.connpass.com/)という福岡のElixir/PhoenixコミュニティにてIoT芸を披露している者です．
巷を賑わせている新しめの関数型言語である**ElixirでIoTできるよ！？**と喧伝しております．

[これまでの連載記事](https://qiita.com/advent-calendar/2017/elixir-or-phoenix)はこちら．
　|> [ElixirでIoT#1.0：IoTボードへのLinux環境の準備](https://qiita.com/takasehideki/items/9e3db412a40659233384)
　|> [ElixirでIoT#1.1：IoTボードへのElixir環境の構築とEEloTツールキットの紹介](https://qiita.com/takasehideki/items/fc570ae92a895caed213)
　|> [ElixirでIoT#1.2：いろいろ分かるベンチマークを整備してみる](https://qiita.com/takasehideki/items/e1dcb4058c7d0b51d554)
　|> [ElixirでIoT#1.3：IoTボードで動いた！Phoenixが立った！性能評価と考察](https://qiita.com/takasehideki/items/0aa644639f81c2ad0bbc)
　|> [ElixirでIoT#2.1：Nervesって何者？ラズパイでLチカできんの！？](https://qiita.com/takasehideki/items/94820516ec95b85bae32)

Elixirユーザの皆さまにはいろいろそこそこ反響をいただいて感謝の限りです．
ラズパイユーザな皆さまにも，**ラズパイでElixir使えるよ！？**ということを知っていただければと思い，#1の内容を編集して，やはり季節外れですが空いていた[「Raspberry Pi Advent Calendar 2017」](https://qiita.com/advent-calendar/2017/raspberry-pi)に投下しようと考えた次第です．

今回は，ラズパイへのErlang/Elixirの構境構築方法と，その自動化スクリプト（ツールキット）を紹介します．


## 御礼:bow:

:star2::star2::star2::star2:<b>　各種ランキングに39回のランクインを達成しました　</b>:star2::star2::star2::star2:

4/27～5/19までの23日間に毎日お届けした[「季節外れのfukuoka.ex Elixir or Phoenix Advent Calendar」](https://qiita.com/advent-calendar/2017/elixir-or-phoenix) は，[Qiitaトップページトレンドランキング](https://qiita.com/trend)に3回，[「はてなブックマーク」のホットエントリー「テクノロジー」カテゴリ](https://b.hatena.ne.jp/hotentry/it)に2回もランクインし，他ランキングも含めると，<font color="red"><b>トータル39回ものランクイン</b></font>を果たしました！

<b>Qiita「いいね」数は合計322件</b>もいただき，感謝の極みです．
fukuoka.exアドバイザーズとfukuoka.exキャストの一同，みなさまの暖かい応援に励まされています．引き続き[「季節外れのfukuoka.ex(その2) Elixir Advent Calendar」](https://qiita.com/advent-calendar/2017/elixir-or-phoenix)でも応援お願いします:bow:

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/b3880591-5315-f686-24ae-e02115c2f0c3.png)](https://qiita.com/advent-calendar/2017/elixir-or-phoenix)



## Elixirとは？

Elixirは2012年に登場した新しい関数型言語です．ErlangのVM上で走ります．[次に来る大物Web言語](https://qiita.com/HirofumiTamori/items/0dfdbada30c7d8f183fd)と言われています．

Elixirには以下の特徴があります．

- 読み書きしやすく，生産性が高い．
- 並行処理（並列処理）のプログラミングが簡単に実現できる．
- 分散システム対応／スケールしやすい．
- 軽量で耐障害性が高い．

**あれっ？これってIoTでも使えるんじゃね！？？**


# Linux環境の準備

ElixirはLinux上で動作しますので，まずはもちろんLinux環境を用意する必要があります．詳細は「[ElixirでIoT#0：IoTボードへのLinux環境の準備](https://qiita.com/takasehideki/items/9e3db412a40659233384)」にてまとめてあります．

筆者の環境では[Raspberry Pi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)を使っていますが，他のバージョンのラズパイでも環境構築の手順は変わらないはずです．
カーネルは[Raspbian Stretch with Desktop 4.9](https://www.raspberrypi.org/downloads/raspbian/)と[Ubuntu MATE 16.04](https://ubuntu-mate.org/raspberry-pi/)の２種類を試しています．

- Raspbianのバージョン情報

```shell-session
$ uname -a 
Linux raspberrypi 4.9.80-v7+ #1098 SMP Fri Mar 9 19:11:42 GMT 2018 armv7l GNU/Linux
$ cat /etc/issue
Raspbian GNU/Linux 9 \n \l
```

- Ubuntu MATEのバージョン情報


```shell-session
$ uname -a 
Linux piu-desktop 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l armv7l armv7l GNU/Linux
$ cat /etc/issue
Ubuntu 16.04.2 LTS \n \l
```



# Elixir環境の構築


## コマンドでの導入

まずはコマンドラインでのインストール方法を紹介します．
とはいっても，[Installing Elixir](https://elixir-lang.org/install.html)に従えば良いだけです．

ただしコマンドラインでの導入には注意点があります．
`apt`等のパッケージ管理システムでインストールした場合は，下記に示している通りかなり古いバージョンのElixirが導入されます．本記事の執筆時点（2018/05/21）での最新版は1.6.5です．


### Raspbianの場合


```shell-session
$ echo "deb https://packages.erlang-solutions.com/debian stretch contrib" | sudo tee /etc/apt/sources.list.d/erlang-solutions.list
$ wget https://packages.erlang-solutions.com/debian/erlang_solutions.asc
$ sudo apt-key add erlang_solutions.asc
$ sudo apt update
$ sudo apt install elixir

$ elixir --version 
Erlang/OTP 19 [erts-8.2.1] [source] [smp:4:4] [async-threads:10] [kernel-poll:false]

Elixir 1.3.3
```


### Ubuntuの場合


```shell-session
$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
$ sudo apt-get update
$ sudo apt-get install esl-erlang
$ sudo apt-get install elixir

$ elixir --version 
Elixir 1.1.0-dev
```



## ソースからビルド

この通り~~メンテナンスをサボられてる~~OS/Distributionによっては，古いバージョンのElixirが導入されてしまいます．ちょっとElixirをお試ししたいくらいなら古くても問題ないのですが，本格的にプロダクト開発に使い始めると使えない機能やライブラリがあったりで，具合が悪くなることが多々あります．

ということで，**男は黙ってソースからビルド**することにしましょう．
Elixir単体のビルドでも構いませんが，Erlangが古いと`make test`が通らないことがありますので，一緒に最新版を入れてしまいましょう．

ソースからインストールすることで，導入するバージョンを自由に選べたり[HiPE(High Performance Erlang)](https://qiita.com/sile/items/d750019fcab961bbb0a7)を明示的に使えたりと，とっても有用でオススメです．RaspbianではHiPEを導入する際に`m4`が必要になります．
ソースビルドは時間が掛かるのがネックですが，珈琲でも飲みながら気長にお待ちください^^;

`$ sudo apt install git`などでgitクライアントは入っている前提です．

```shell-session
$ sudo apt-get install m4 libncurses5-dev libssl-dev
$ wget http://erlang.org/download/otp_src_20.3.tar.gz
$ tar xzvf otp_src_20.3.tar.gz
$ cd otp_src_20.3/
$ ./configure --enable-hipe
$ make
$ sudo make install
$ cd ../
$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir/
$ git checkout v1.6.5
$ make clean test
$ sudo make install
```

全て成功したら`/usr/local/bin/`にElixir環境がインストールされます．

インストール結果を確認してみましょう．

```shell-session
$ which elixir
/usr/local/bin/elixir

$ elixir --version 
Erlang/OTP 20 [erts-9.3] [source] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Elixir 1.6.5 (compiled with OTP 20)
```

無事に執筆時点の最新版を導入することができました．


# 自動化スクリプトの紹介

いちいちコマンドを打ち込むのもメンドくないですか？なので，Elixir/Erlangを自動インストールするスクリプトを用意しました．
下記のGitHubリポジトリで公開しているツールキットの[`install.sh`](https://github.com/takasehideki/EEloT/blob/master/install.sh)です．


- [EEloT: **E**valuation toolkit for **El**ixir on I<b>oT</b> board](https://github.com/takasehideki/EEloT)

なお，3文字目はIoTの大文字`I`ではなくElixirの小文字`l`です^^;

Elixir/Erlang環境構築のための使い方はとっても簡単です．スクリプト内の一部のコマンドはsudoで動作します．

- `$ ./install.sh`
    - パッケージ管理システムからElixir/Erlangを導入します．
    - OS/Distributionは自動検知します．現状ではRaspbian,Ubuntu,macOSに対応しています（要望があれば他のDistributionにも対応します）
- `$ ./install.sh　clean`
    - パッケージ管理システムから導入したElixir/Erlangを削除します．地味に便利です．
- `$ ./install.sh　source`
    - Elixir/Erlangをソースからビルドします．
    - 現状ではErlang OTP 20.3とElixir 1.6.5が`/usr/local/bin/`にインストールされるようにしています．


# まとめ

- ElixirってIoTでも使えるんじゃね！？？
- 男は黙ってソースビルド
- [EEloT](https://github.com/takasehideki/EEloT)を使えばIoTボードへのElixir環境構築もお手のもの


明日のfukuoka.ex的な記事は@piacere_exさんの
「[Excelから関数型言語マスター番外編：なぜ関数型言語は習得できないか？](https://qiita.com/piacere_ex/items/8fad067885aed73bf789)」です．お楽しみに！


## お知らせ

:alarm_clock::alarm_clock::alarm_clock::alarm_clock:<b>　満員御礼！Elixir MeetUpを6月末に開催します　</b>:alarm_clock::alarm_clock::alarm_clock::alarm_clock:
<font color="red"><b>※応募多数により、増枠しました</b></font>
[<b>「fukuoka.ex#11：DB／データサイエンスにコネクトするElixir」</b>](https://fukuokaex.connpass.com/event/87241)を6/22(金) 19時に開催します．

私も**「ElixirでIoTやってみた」**芸を披露する予定です．
ラズパイとGrovePiを使って，環境データをセンシングしてさくっとWeb表示できたらおもろいかな？と思っています
（ちょっと準備に取り掛かり始めたら問題発生しまくり！さぁ当日はどうなる！！><;

[![image.png](https://connpass-tokyo.s3.amazonaws.com/thumbs/cb/13/cb130a03343bc310b07244c308b940db.png)](https://fukuokaex.connpass.com/event/87241)