1. piacerex

    No comment

    piacerex
Changes in body
Source | HTML | Preview
@@ -1,223 +1,222 @@
(この記事は、[「Elixir or Phoenix Advent Calendar 2017」](https://qiita.com/advent-calendar/2017/elixir-or-phoenix)の3日目です)
----
[fukuoka.ex](https://fukuokaex.fun/)代表の[piacere](https://twitter.com/piacere_ex)です
ご覧いただいて、ありがとうございます:bow:
私は普段、福岡のスタートアップ企業のCTOとして、「ビッグデータ分析+AI・ML開発」を行うElixir/Phoenix/Vue.js/Kerasリードプログラマをしながら、[<b>福岡Elixirコミュニティ「fukuoka.ex」</b>](https://fukuokaex.connpass.com/)のMeetUp(偶数月定期開催)やプログラミング入門ハンズオン、もくもく会を主催しています
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/608acb8f-bb81-0634-a5e1-aa37ac6cd2c9.png)](https://fukuokaex.connpass.com/)
先日、「fukuoka.ex #8 ~2018年 春のElixir入学式~」というMeetUpを開催し、その中で、Elixir入門者向けのセッションの登壇しましたので、その一部をコラム化してみようと思います
# Excelを使う位カンタンな関数型プログラミング言語「Elixir」
「関数型言語」の習得が、なかなか進まない、といったことをよく聞きます
特に、「オブジェクト指向言語」に慣れ親しんだ方ほど、苦しんでいるようです
Elixirは、「Excel使う位、簡単」なので、「関数型言語」の習得が進まない方には、オススメの言語です
また、プログラミングが初めての方でも、Excelでできることが、Elixirも同じようにできると分かれば、習得しやすいでしょう
この「Excelから関数型言語マスター」シリーズでは、Excelと同じ機能を、Elixirでも実現できる、というところからスタートし、その延長で、Elixir/Phoenixによる「Web+DB開発」や「Web+外部API開発」、「Web上でのグラフ描画」まで作れる、ということを実感していただこうと思います
# 事前準備:Elixirのインストール
Elixirを使い始めるのに、3種類の方法があります
1. インストーラを使う                ※Windowsはこれがオススメ
2. asdf経由でインストールする            ※macOS/Linux含むUNIX系はこれがオススメ
3. ソースコードからビルドする
4. DockerでElixirイメージをインスト―ル (pull) する   ※Dockerに使い慣れている方向け
## インストール方法1. インストーラを使う
下記URLの手順に沿って、Elixirをインストールします
https://elixir-lang.org/install.html
Windowsはインストーラをダウンロードしてインストールします
macOSはHomebrewでインストールします(ただし、インストール方法2のasdfの方が良いことがあります)
Linux含むUNIX系は、記載されている手順だと、古いバージョンのElixirがインストールされるため、インストール方法2./3.をオススメします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/c45e99a6-00b7-80a6-3aed-31099ee1b8dc.png)
## インストール方法2. asdf経由でインストールする
下記URLの手順に沿って、asdf経由でElixirをインストールします
https://qiita.com/nishiuchikazuma/items/b9d319732ddb540fd990
## インストール方法3. ソースコードからビルド
Elixirをインストールするために必要なErlangは、最新版を入れるか、任意のバージョンを入れるかで、手順が多少、異なります
### A)Erlangの最新版をインストールする場合
以下の手順通り、まずErlang/OTPをyum等でインストールします(以降の手順は、sudo bash等でrootになってから行ってください)
```sh
yum install epel-release
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
-yum install erlang
```
erlでErlang REPLが起動すれば成功です(起動後、Ctrl+Cを2回押しで抜けてください)
```
erl
Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1]
Eshell V10.2 (abort with ^G)
1>
```
#### ※インストール中にエラーが出る場合は…
古いErlangがインストール済みだと、上記中にエラーで中断することがあるため、エラー時は、下記コマンドでアンインストールして、再度インストールしてください
```sh
yum erase erlang-erts-R16B-03.18.el7.x86_64
yum erase erlang
```
### B)Erlangの任意のバージョンをインストールする場合
任意のErlangのバージョンをインストールしたい場合は、下記の通り、ソースコードからビルドしてください
なお、Erlang/OTPのマイナーバージョンによっては、インストール後に調子悪かったり、Elixirのインストールやiex起動に失敗するケースがあるので、その場合は、マイナーバージョンを1つ下げる等を行うと、うまくいくことがあります
下記URLにて、各バージョンのtar.gzのURLを確認し、wgetのURLを変更してください
http://erlang.org/download
```sh
yum install gcc
yum install ncurses ncurses-devel
wget http://erlang.org/download/otp_src_21.2.tar.gz
tar vzfx otp_src_21.2.tar.gz
cd otp_src_21.2/
./configure --enable-hipe
make && make install
export PATH="${PATH}:/usr/local/lib/erlang/bin"
```
erlでErlang REPLが起動すれば成功です(起動後、Ctrl+Cを2回押しで抜けてください)
```
erl
Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1]
Eshell V10.2 (abort with ^G)
1>
```
### Elixirのインストール
Elixirは、ソースコードからビルドして、インストールします
なお、下記以外の手順として、git cloneやgit checkoutで行った場合、インストールおよびiex起動がうまくいかないこともあるため、下記手順の通り、リリースアーカイブからダウンロードして進めることをオススメします
こちらも、実施するタイミング次第では、新しいものがリリースされているかも知れないので、気になる方は、下記URLにて、各バージョン配下にある「Assets」内の「Source code(tar.gz)」のURLで、wgetのURLを変更してください
https://github.com/elixir-lang/elixir/releases/
```sh
yum install gcc
wget https://github.com/elixir-lang/elixir/archive/v1.8.1.tar.gz
tar vzfx v1.8.1.tar.gz
cd elixir-1.8.1
export PATH="${PATH}:/usr/local/bin"
make && make install
elixir -v
```
## インストール方法4. DockerでElixirイメージをpull
下記URLを、「Docker Community Edition (CE)」までスクロールし、利用OS毎のDockerをインストールします
https://www.docker.com/get-docker
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/3cf42635-c02e-c62f-f39c-62dfd62df79b.png)
その後、以下コマンドでElixirイメージを入れます
```sh
docker pull elixir
```
以下コマンドで、Elixirイメージのコンテナを起動します
```sh
docker run -p 4000:4000 -i -t elixir /bin/bash
```
# Excelの「並べ替え」をElixirで書いてみる
さて、Elixirのインストールが完了したので、Excelの「並べ替え」をElixirで書いてみましょう
シェルやコマンドプロントを起動し、その中で、Elixirのコードをインタラクティブに実行できる「iex」コマンドを起動します
```
iex
Interactive Elixir (1.6.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```
データの「並べ替え」は、Elixirでは、<b><font color="red">Enum.sort()</font></b>を使います
iex内で、実際にコードを打って、試してみてください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/7b36f810-59c9-d7dc-9fe4-feebb9fc5edb.png)
パイプ「|>」により「データ→並べ替え」という流れの順で書くこともできます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/7aab6b8a-7ec2-6dbb-359b-b57c8cb55e6a.png)
# Excelの「フィルタ」をElixirで書いてみる
次は、Excelの「フィルタ」をElixirで書いてみます
データの「フィルタ」は、Elixirでは、<b><font color="red">Enum.filter()</font></b>を使います
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/dab4be1f-e6e6-88cf-787d-e09267757096.png)
Enum.filter()内のfn( n )は、データの1つ1つの値を変数n※として、後ろの処理 (青枠) に渡す、という意味で、青枠の処理では、1つ1つの値が「999」で無いことをチェックしています
※この「n」は、fn()で指定した変数と、後ろの処理で同一であれば、どんな変数名でも構いません
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/af34fbb4-eeaf-3f62-5a39-32fa00ca059d.png)
なお「fn」は、関数 (function) を意味しており、その後の「->」から「end」までの間が、関数の処理を意味しています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/41d46540-5673-bfe5-cb1a-5d420b54379a.png)
つまり、データの1つ1つの値が、「999で無いことをチェック」するという関数に順に渡され、 「999で無い値」だけが残るようフィルタされている、というのが、Enum.filter()で行われている処理です
なお、「999」以外の数字や、以下のような「!=」以外も使えるので、いろいろ試してみてください
「==」、「>=」、「>」、「<=」、「<」
あと、「n <= 323 && n >= 999」や「n == 323 || n == 54」みたいな書き方もできます
# 終わり
Excelの「並べ替え」「フィルタ」と同じことをElixirで書いてみましたが、思ったよりカンタンだったのでは無いでしょうか?
「関数型言語」と聞くだけで、複雑そうだったり、これまで聞いたことが無い用語が飛び交う世界…というのが、一般的なイメージだったかと思いますが、そうでは無く、Excelとやっていることは同じなんだ、ということをElixirから感じていただけたら幸いです
[次回は、<b>「列の抽出とWeb表示」</b>](https://qiita.com/piacere_ex/items/b7787580fce5f148242f#_reference-15d862e0dedbe9d9069e)を行います
あと、Advent Calendarの方、明日は、@tuchiro さんの[「ElixirでSI開発入門 #1 Ectoで悲観的ロック」](https://qiita.com/tuchiro/items/7b04b0661cfa4a7af179)です
<br>
:stars::stars::stars::stars::stars:<b> お知らせ </b>:stars::stars::stars::stars::stars:
先日、[<b>fukuoka.exアドバイザーズ(コア運営メンバーのこと)のインタビュー記事</b>](http://dame.engineer/archives/391#post-391)を公開しました
昔やっていた、超大規模案件で苦しんでいたところから、Elixirを始めたきっかけが取材されています
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/207b2a1a-12a5-21fa-d087-86f466524b3b.png)](http://dame.engineer/archives/391#post-391)
# p.s.「いいね」よろしくお願いします
ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください!:tada: