Help us understand the problem. What is going on with this article?

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(偶数月定期開催)やプログラミング入門ハンズオン、もくもく会を主催しています

image.png

先日、「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

インストール方法2. asdf経由でインストールする

下記URLの手順に沿って、asdf経由でElixirをインストールします
https://qiita.com/nishiuchikazuma/items/b9d319732ddb540fd990

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

Elixirをインストールするために必要なErlangは、バイナリでインストールするか、ソースコードからビルドするかで、手順が多少、異なります

なお、以降の手順は、sudo bash等でrootになってから行ってください

A)Erlangをバイナリでインストールする場合

最新版であれば、下記手順でインストールしてください

なお、最新版以外のバージョンを入れる場合は、下記URLで拾えるバイナリダウンロードのURLで、wgetのURL、およびcdコマンドを適宜変更してください
https://www.erlang-solutions.com/resources/download.html

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

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がインストール済みだと、上記中にエラーで中断することがあるため、エラー時は、下記コマンドでアンインストールして、再度インストールしてください

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

B)Erlangをソースコードからビルドする場合

上記バイナリインストールでは無く、ソースコードからビルドしたい場合は、下記手順となります

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

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

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は、ソースコードからビルドして、インストールします

1.8.1より新しいバージョンが今後リリースされた場合は、下記URLにて、各バージョン配下にある「Assets」内の「Source code(tar.gz)」のURLで、wgetのURLを変更してください
https://github.com/elixir-lang/elixir/releases/

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

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

iexでElixir REPLが起動すれば成功です(起動後、Ctrl+Cを2回押しで抜けてください)

iex
Erlang/OTP 21 [erts-10.3.5.6] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]

Interactive Elixir (1.8.1) - press Ctrl+C to exit (type h() ENTER for hel

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

下記URLを、「Docker Community Edition (CE)」までスクロールし、利用OS毎のDockerをインストールします
https://www.docker.com/get-docker

image.png

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

docker pull elixir

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

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では、Enum.sort()を使います

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

image.png

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

image.png

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

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

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

image.png

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

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

image.png

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

image.png

つまり、データの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を始めたきっかけが取材されています

image.png

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

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

piacerex
福岡でプログラマしながらIT商社とIT企業を経営してます。Elixir/Kerasをよく使う。Elixirコミュ#fukuokaex、福岡理学部#FukuokaScienceを主催。プログラマ歴36年/XPer歴19年/デジタルマーケッター/経営者/CTO/技術顧問数社。 シボと重力子放射線射出装置は別腹(^^)
https://github.com/piacerex
karabiner
主にシステム開発・アプリ開発・ Webサイト制作を行う会社です
http://www.karabiner.tech/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした