ExcelからElixir入門①：データ並替え／絞り込み

【本コラムは、2分で読めて、10分くらいでお試しいただけます】
[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/086dca63-bd51-531c-7c27-d0004acb4633.png)

# Excel位カンタンな関数型プログラミング言語「Elixir」

「関数型言語」の習得が、なかなか進まない、といったことをよく聞きます

特に、「オブジェクト指向言語」に慣れ親しんだ方ほど、苦しんでいるようです

Elixirは、「ExcelやGoogleスプレッドシートを使う位、簡単」なので、「関数型言語」の習得が進まない方には、オススメの言語です

また、プログラミングが初めての方でも、Excel／Googleスプレッドシートでできることが、Elixirも同じようにできると分かれば、習得しやすいでしょう

この「Excelから関数型言語マスター」シリーズでは、Excel／Googleスプレッドシートと同じ機能を、Elixirでも実践するだけ … というカンタンなところからスタートし、その延長で、Elixir／Phoenixによる「Web＋DB開発」や「Web＋外部API開発」、「Web上でのグラフ描画」、「サーバーサイドだけでSPA開発（React／Vue.jsとの比較アリ）」、「本番リリース」までサクっと行えることを実感いただくシリーズです

Elixirそのものが2022年段階でいったい何をできるのかや、どんな魅力があるのかを知りたい方は、下記コラムもご覧ください

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

# このシリーズはどのように始まったか？

私は普段、福岡のスタートアップ企業のCTOとして、「ビッグデータ分析＋AI・ML開発」を行うElixir／Phoenix／React／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入学式～」](https://fukuokaex.connpass.com/event/85038/)というMeetUpを開催し、その中で、Elixir入門者向けのセッションの登壇したのですが、それをコラム化したのが、このシリーズの①～③にあたります

**■「ExcelからElixir入門」シリーズの目次**
[**①データ並替え／絞り込み**](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1)
|> [**②データ列抽出、Web表示**](https://qiita.com/piacere_ex/items/b7787580fce5f148242f)
|> [<b>③WebにDBデータ表示</b>](https://qiita.com/piacere_ex/items/a7558adc6856e3577dc6)
|> [<b>④Webに外部APIデータ表示</b>](https://qiita.com/piacere_ex/items/4c212615a4eb699dd109)
|> [<b>⑤Webにグラフ表示</b>](https://qiita.com/piacere_ex/items/290b76b76d5ff8e019bf)
|> [**⑥SPAからPhoenix製APIを呼び出す（表示編）【LiveView版】**](https://qiita.com/piacerex/items/64e77b85bfb4c6832662)
|> [**⑦SPAからPhoenix製APIを呼び出す（更新編）【LiveView版】**](https://qiita.com/piacerex/items/78ee0d2ad8cca0927980)
|> [<b>⑧Gigalixirに本番リリース</b>](https://qiita.com/piacerex/items/1a9cbcc740ca3707eaec)
|> [**⑨ElixirサーバサイドのみでReactと同じSPA／リアルタイムUIが作れる「LiveView」**](https://qiita.com/piacerex/items/3f8ee18c9443d63955bf)
|> [**⑩ElixirサーバサイドSPAをスマホで見るためにGigalixirリリース**](https://qiita.com/piacerex/items/583174d72e6fc0cd289e)
|> [**⑪Gigalixir上のLiveViewアプリに独自ドメイン名を付与して正式なアプリ公開**](https://qiita.com/piacerex/items/b61348c282395167fd8c)
|> [**⑫Elixir／PhoenixのCRUD Webアプリをリリース**](https://qiita.com/piacerex/items/511f24888c7350639d0b)

<h3>:ocean::ocean::ocean: Elixir Advent Calendar: 言語カテゴリ1位 & 全カテゴリ2位！ :ocean::ocean::ocean:</h3>

例年を遥かに超える盛り上がりを見せ、堂々のトップ獲得ッ！ :qiita: :tada: :confetti_ball:

https://qiita.com/advent-calendar/2022/elixir
https://qiita.com/advent-calendar/2022/ranking/feedbacks
https://qiita.com/advent-calendar/2022/ranking/feedbacks/categories/programming_languages
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/356a15c6-0dbb-097e-38f3-a1b4fed47555.png)](https://qiita.com/advent-calendar/2022/ranking/feedbacks/categories/programming_languages)

# 事前準備：Elixirのインストール

Elixirを使い始めるのに4種類の方法がありますが、うち2種類をここでは紹介します … <b><font color="red">いずれかを実施すればOK</font></b>です（≒全部をやらなければいけないと誤解される方が割と多いのでご注意）

**①インストーラを使う** 　　　　　　　　　　　　 ※Windows／Mac／Ubuntuはこれがオススメ
**②DockerでElixirイメージをインスト―ル (pull)** 　※Ubuntu以外のLinuxやその他OSはこちらがオススメ

なお、複数バージョンのElixir／Erlangを使い分ける場合、asdfを使う手もありますが、入門向けでは無いため、ここでは割愛します（同様の理由で、ソースコードからのビルドも割愛します）

## インストール方法①：インストーラを使う

- **Windows**
  - **WSL2**：[基本Ubuntuの手順ですが、WSL導入から行うコラムをご用意しています](https://qiita.com/piacerex/items/01e89435af0f7a454ad2)
  - **WSL2を使わない**：[公式HPからインストーラをダウンロード](https://github.com/elixir-lang/elixir-windows-setup/releases/download/v2.1/elixir-websetup.exe)してインストール
- **Mac**：Homebrewでインストール
- **Ubuntu**：[こちらの手順をご覧ください](https://qiita.com/piacerex/items/01e89435af0f7a454ad2)
- **Ubuntu以外のUNIX**：下記Docker（公式の手順で最新版が入らないことがあるので）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/0e853815-5b83-61e1-9447-2f424880bf9c.png)

## インストール方法②：DockerでElixirイメージをpull

下記URLにアクセスすると、下図のような感じで、利用OS毎のDockerがダウンロードできます
https://www.docker.com/get-docker
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/e8d472de-bc21-82fc-2106-c8c1c0dbc1f3.png)

Dockerインストール後、以下コマンドでElixirイメージを入れ、Elixirイメージのコンテナを4000番ポートフォワード（これはPhoenix用です）で起動します

```sh
sudo docker pull elixir
sudo docker run -p 4000:4000 -i -t elixir /bin/bash
```

なお、Windowsの場合は、下記の通り、sudo無しで実行してください

```sh
docker pull elixir
docker run -p 4000:4000 -i -t elixir /bin/bash
```

# Excelの「並べ替え」をElixirで書いてみる

さて、Elixirのインストールが完了したので、Excelの「並べ替え」をElixirで書いてみましょう

シェルやコマンドプロントを起動し、その中で、Elixirのコードをインタラクティブに実行できる「iex」コマンドを起動します

```
iex
```

下記のように表示され、iexの入力待ちとなればiex起動は成功です（Ctrl+Cを2回で終了できます）

```
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.14.2) - 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」みたいな書き方もできます

# ElixirはExcel／Googleスプレッドシートと同じ位カンタン

Excelの「並べ替え」「フィルタ」と同じことをElixirで書いてみましたが、思ったよりカンタンだったのでは無いでしょうか？

「関数型言語」と聞くだけで、複雑そうだったり、これまで聞いたことが無い用語が飛び交う世界…というのが、一般的なイメージだったかと思いますが、そうでは無く、Excel／Googleスプレッドシートとやっていることは同じなんだ、ということをElixirから感じていただけたら幸いです

[次回は、**「列の抽出とWeb表示」** を行います](https://qiita.com/piacere_ex/items/b7787580fce5f148242f#_reference-15d862e0dedbe9d9069e)

# 【参考】本コラムの検証環境

本コラムは、以下環境で検証しています（恐らくUbuntu実機やMacでも動きます）

- Windows11
  - WSL2／Ubuntu 22.04＋Elixir 1.15.5 (Erlang/OTP 25)　※[**最新版のインストール手順はコチラ**](https://qiita.com/piacerex/items/01e89435af0f7a454ad2)
  - WSL2／Ubuntu 22.04＋Docker Compose＋Elixir 1.13.4 (Erlang/OTP 25)
- Windows 10
  - 実機＋Elixir 1.14.2 (Erlang/OTP 25)
  - 実機＋Elixir 1.14.0 (Erlang/OTP 25)
  - WSL2／Ubuntu 20.04＋Elixir 1.14.2 (Erlang/OTP 25)
  - Docker／Debian 11.6＋Elixir 1.14.2 (Erlang/OTP 25)
  - WSL2／Ubuntu 18.04＋Elixir 1.13.0 (Erlang/OTP 24)
  - 実機＋Elixir 1.11.3 
  - 実機＋Elixir 1.8.1
  - 実機＋Elixir 1.6.x
  - Docker＋Elixir 1.6.x

: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)