Edited at

Excelから関数型言語マスター1回目:データ行の”並べ替え”と”絞り込み”

(この記事は、「Elixir or Phoenix Advent Calendar 2017」の3日目です)


fukuoka.ex代表のpiacereです

ご覧いただいて、ありがとうございます:bow:

私は普段、福岡のスタートアップ企業のCTOとして、「ビッグデータ分析+AI・ML開発」を行うElixir/Phoenix/Vue.js/Kerasリードプログラマをしながら、福岡Elixirコミュニティ「fukuoka.ex」のMeetUp(偶数月定期開催)やプログラミング入門ハンズオン、もくもく会を主催しています

先日、「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. インストーラ/Homebrewを使う

  2. ソースコードからビルドする

  3. DockerでElixirイメージをインスト―ル (pull) する

Windows/macOSは1.、Linux含むUNIX系は2.、普段Dockerを使い慣れている方は3.がオススメです


インストール方法1. インストーラ/Homebrewを使う

下記URLの手順に沿って、Elixirをインストールします

https://elixir-lang.org/install.html

Windowsはインストーラをダウンロードしてインストール、macOSはHomebrewでインストールと、簡単です

なお、Linux含むUNIX系の手順も記載されていますが、手順通りにすると、古いバージョンがインストールされるため、2. の方が良いです


インストール方法2. ソースコードからビルド

以下の手順通り、まずErlang/OTPをyum等でインストールします(以降の手順は、sudo bash等でrootになってから行ってください)

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

古いErlangがインストール済みだと、上記がエラーで中断することがあるため、エラー時は、下記コマンドでアンインストールして、再度インストールしてください

yum erase erlang-erts-R16B-03.18.el7.x86_64

yum erase erlang

任意のErlangのバージョンをインストールしたい場合は、下記の通り、ソースコードからビルドしてください

なお、Erlang/OTPのマイナーバージョンによっては、インストール後に調子悪かったり、Elixirのインストールやiex起動に失敗するケースがあるので、その場合は、マイナーバージョンを1つ下げる等を行うと、うまくいくことがあります

下記URLにて、各バージョンのtar.gzのURLを確認し、wgetのURLを変更してください

http://erlang.org/download

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

次に、Elixirをソースコードからビルドして、インストールします

なお、下記以外の手順として、git cloneやgit checkoutで行った場合、インストールおよびiex起動がうまくいかないこともあるため、下記手順の通り、リリースアーカイブからダウンロードして進めることをオススメします

こちらも、実施するタイミング次第では、新しいものがリリースされているかも知れないので、気になる方は、下記URLにて、各バージョン配下にある「Assets」内の「Source code(tar.gz)」のURLで、wgetのURLを変更してください

https://github.com/elixir-lang/elixir/releases/

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


インストール方法3. DockerでElixirイメージをpull

下記URLを、「Docker Community Edition (CE)」までスクロールし、利用OS毎のDockerをインストールします

https://www.docker.com/get-docker

その後、以下コマンドでElixirイメージを入れます

docker pull elixir

以下コマンドで、Elixirイメージのコンテナを起動します

docker run -p 4000:4000 -i -t  trenpixster/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では、Enum.sort()を使います

iex内で、実際にコードを打って、試してみてください

パイプ「|>」により「データ→並べ替え」という流れの順で書くこともできます


Excelの「フィルタ」をElixirで書いてみる

次は、Excelの「フィルタ」をElixirで書いてみます

データの「フィルタ」は、Elixirでは、Enum.filter()を使います

Enum.filter()内のfn( n )は、データの1つ1つの値を変数n※として、後ろの処理 (青枠) に渡す、という意味で、青枠の処理では、1つ1つの値が「999」で無いことをチェックしています

※この「n」は、fn()で指定した変数と、後ろの処理で同一であれば、どんな変数名でも構いません

なお「fn」は、関数 (function) を意味しており、その後の「->」から「end」までの間が、関数の処理を意味しています

つまり、データの1つ1つの値が、「999で無いことをチェック」するという関数に順に渡され、 「999で無い値」だけが残るようフィルタされている、というのが、Enum.filter()で行われている処理です

なお、「999」以外の数字や、以下のような「!=」以外も使えるので、いろいろ試してみてください

「==」、「>=」、「>」、「<=」、「<」

あと、「n <= 323 && n >= 999」や「n == 323 || n == 54」みたいな書き方もできます


終わり

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

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

次回は、「列の抽出とWeb表示」を行います

あと、Advent Calendarの方、明日は、@tuchiro さんの「ElixirでSI開発入門 #1 Ectoで悲観的ロック」です




:stars::stars::stars::stars::stars: お知らせ :stars::stars::stars::stars::stars:

先日、fukuoka.exアドバイザーズ(コア運営メンバーのこと)のインタビュー記事を公開しました

昔やっていた、超大規模案件で苦しんでいたところから、Elixirを始めたきっかけが取材されています


p.s.「いいね」よろしくお願いします

ページ左上の

のクリックを、どうぞよろしくお願いします:bow:

ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください!:tada: