SlideShare une entreprise Scribd logo
1  sur  47
Elixir入門 第1回
「パターンマッチ」&「パイプ」で
JSONパースアプリをサクっと書く
with Docker
2017/03/29 ver0.5作成
2017/04/06 ver0.9作成
2017/04/13 ver1.0作成
2017/06/07 ver1.1作成
1
1. Elixirを学ぶと得られること
2. DockerでElixirを使えるようにする
3. はじめてのElixirプログラミング
4. パターンマッチ
5. JSONパースに必要なライブラリ導入
6. パイプ
7. JSONパースアプリを仕上げる
8. 応用①:コードを洗練させる
9. 応用②:Qiita API以外のJSONパース
10.これからElixirを学んでいくあなたへ
目次
※ページ最下部の章番号/ページは、Dave Thomas著「プログラミングElixir」の関連記載です。ご参考ください
2
1.Elixirを学ぶと得られること
3
1.Elixirを学ぶと得られること
を学ぶと、以下のような苦難から解放されます
a. C10K問題などのソフトウェア性能問題からの解放
b. JSONパーサを手続き的にチマチマ書くことからの解放
c. オブジェクト設計という「余計な仕事」からの解放
d. 他の関数型言語での脱落からの解放
e. 複雑なマルチスレッドプログラミング/デバッグからの解放
f. 1958年に生まれた素晴らしいプログラミングパラダイムを
使いこなせなかった呪いからの解放
結果、プログラミングやプログラマ/エンジニアとしての普段の仕事
が、とても楽しくなります
4
2.DockerでElixirを使えるようにする
5
2.DockerでElixirを使えるようにする
Elixirを使い始めるのに、3種類の方法があります
① yumやapt/Homebrew/Chocolateyを使う
② 各OS用のElixirをダウンロード、インストールする
③ DockerでElixirイメージをインスト―ル(pull)する
このうち、最もてっとり早いのは、③のDockerを使うことです
(OS毎の差異影響も受けないのでオススメ)
Dockerをインストールしてみましょう
https://www.docker.com/get-docker
.
Dockerが入ったら、以下コマンドでElixirイメージをDLしましょう
> docker pull trenpixster/elixir
6
2.DockerでElixir:ローカルPCのフォルダ共有
ローカルPCのフォルダをDockerでマウントして開発可能とするた
め、Docker設定「Shared Drives」でドライブ共有をONします
Windowsであれば、その前にWindowsフォルダ共有のポート
(TCP/445)にアクセスできるようにしておきます
※ウイルスチェッカーとWindowsファイアウォールの両方にブロック設定がある場合がある
7
2.DockerでElixir:Elixirの起動
以下コマンドで、Docker上のElixirイメージを起動します
※紫字の部分は、【ローカルPCの共有したいパス】:【Docker上でマウントされるパス】
ElixirのREPL (対話シェル) である「iex」を起動します
> docker run --rm -v /c/piacere/code:/code -i -t
trenpixster/elixir /bin/bash
root@0e27c970ec14:/code# Docker上のElixirイメージ
内にあるbashが起動した
# iex
Erlang/OTP 19 [erts-8.2] [source-fbd2db2] [64-bit]
[smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.4.1) - press Ctrl+C to exit (type h()
ENTER for help)
iex(1)>
※参照:第1章 P4
8
2.DockerでElixir:REPLでのElixir
REPL内でElixirの簡単なプログラミングができます
iexから抜けてbashに戻るには、Ctrl+cを2回入力します
iex(1)> 1+2
3
iex(2)> list = [ 123, "abc", 456, true ]
[123, "abc", 456, true]
iex(3)> Enum.sort( list )
[123, 456, true, "abc"]
iex(4)> map = %{ "key2" => "abc", "key1" => 123 }
%{"key1" => 123, "key2" => "abc"}
iex(5)> Enum.sort( map )
[{"key1", 123}, {"key2", "abc"}]
iex(6)>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
#
リストは[]で囲む
マップは%{}で囲む
2種類書き方がある
①%{k1: "v1"…}
②%{"k1" => "v1"…}
9
3.はじめてのElixirプログラミング
10
3.はじめてのElixirプログラミング:新規PJ作成
以下コマンドでElixirのプロジェクトを作成します
※紫字の部分は、作成するプロジェクト名 (全部、小文字で打つこと)
以下のようなフォルダ/ファイルが作られます
プログラミングするソースコードは、libフォルダ配下に作ります
# mix new crawl
# pwd;find . | sort | sed '1d;s/^.//;s//([^/]*)$/|--1/;s//[^/|]*/| /g'
/code/sample
|--_build
|--config
|--deps
|--lib
|--mix.exs
|--README.md
|--test
mixはビルドツール ※Railsのbundler+rake的なもの
※参照:第13章 P131
11
3.はじめてのElixirプログラミング:ビルド、実行
lib/Misc.exを作り、お好きなエディタで以下を入力します
ファイル保存したら、以下コマンドでビルドします
iexが起動されるので、以下のように作成した関数を実行します
defmodule Misc do
def sort( values ) do
Enum.sort(values )
end
end
# cd crawl
# iex –S mix
ーS:フォルダ配下のScript実行
mix:Script名
※参照:第6章 P45~46、第7章 P63
Elixirは関数をモジュール内に定義します
defmodule~end:モジュール定義
def~end:関数定義
iex> Misc.sort( [ 5, 1, 3 ] )
[1, 3, 5]
リスト等のコレクションをソートする
12
3.はじめてのElixirプログラミング:1行関数
関数の呼出時、”()”は省略できます
関数は、以下のように1行でも書け、endも省略できます
リストだけで無く、マップも同じ関数定義でソートできます
(キー名でソートがかかります)
defmodule Misc do
def sort( values ), do: Enum.sort( values )
end
※参照:第6章 P47、第8章 P78
iex> recompile()
iex> Misc.sort %{ "key2" => "abc", "key1" => 123 }
[{"key1", 123}, {"key2", "abc"}]
iex> Misc.sort %{ No: "no need", Yes: "need", NA: "N/A" }
[NA: "N/A", No: "no need", Yes: "need"]
iex> Misc.sort [ 5, 1, 3 ]
[1, 3, 5]
iexを抜けずにコード変更を反映できる
13
4.パターンマッチ
14
4.パターンマッチ:引数でのマッチ
いよいよ、他の言語に無い、Elixirのパワフルな面を見ていきます
下記赤囲みの関数を追加してください
以下のように入力して、作成した関数を試します
マップの”k2”キーの値抽出を、ナント引数だけで実装できます
他の言語では、そもそも引数では定義不可で、ロジックとして書く
のも骨が折れますが、Elixirなら非常にカンタンです
defmodule Misc do
def match_sample( %{ k2: value } ), do: value
…
iex> recompile()
iex> Misc.match_sample %{ k1: "v1", k2: "v2", k3: "v3" }
"v2"
※参照:第6章 P47~49、第8章 P80
15
4.パターンマッチ:複数関数の呼び分け
キーだけで無く、値でマッチしての関数の呼び分けも可能です
以下のように、上と下の関数が、値に応じて、呼び分けされます
他の言語なら、関数呼び出し後にif文で分岐するような処理が、
引数でのパターンマッチで分岐できます
(Elixirでも、if文は一応使えるのですが、パターンマッチで片付くので、使う場面があまり無いです)
defmodule Misc do
def match( %{ Yes: "we can" } ), do: "Barack Obama"
def match( %{ Yes: need } ), do: need
…
iex> recompile()
iex> Misc.match %{ No: "-", Yes: "we can", NA: "N/A" }
"Barack Obama"
iex> Misc.match %{ No: "-", Yes: "we do", NA: "N/A" }
"we do"
※参照:第6章 P47~48、第8章 P80
16
4.パターンマッチ:マッチしない場合
該当キーがマップ内に存在しない場合、マッチエラーになります
引数に”_”を指定すると、その他としてマッチできるようになります
defmodule Misc do
def match( %{ Yes: "we can" } ), do: "Barack Obama"
def match( %{ Yes: need } ), do: need
def match( _ ), do: "Yes...NOT EXIST"
…
iex> Misc.match( %{ No: "-", NA: "N/A" } )
** (FunctionClauseError) no function clause matching in
Crawl.match/1
(crawl) lib/Qiita.ex:5: Crawl.match(%{NA: "N/A", No: "-"})
※参照:第6章 P47~48
iex> recompile()
iex> Misc.match %{ No: "-", NA: "N/A" }
"Yes...NOT EXIST"
17
4.パターンマッチ:関数内でのマッチ
もし、関数内でマッチさせるなら、以下のような書き方になります
(ただ、関数の引数でマッチする書き方の方が推奨です)
実行結果は、引数パターンマッチ版と同じです
defmodule Misc do
def match_inner( input_map ) do
%{ Yes: need } = input_map
need
end
…
iex> recompile()
iex> Misc.match_inner %{ No: "-", Yes: "we can", NA: "N/A" }
"we can"
※参照:第4章 P27
18
4.パターンマッチ:リストのパターンマッチ
リストは、先頭を「head」、以降を「tail」でパターンマッチできます
※参照:第7章 P64~66、68~69
iex> [ head1 | tail1 ] = [ 5, 8, 3, 1 ]
[5, 8, 3, 1]
iex> head1
5
iex> tail1
[8, 3, 1]
iex> [ head2 | tail2 ] = tail1
[8, 3, 1]
iex> head2
8
iex> tail2
[3, 1]
…
19
4.パターンマッチ:リストのパターンマッチ
head/tailにより、リストの巡回が可能です
リストの要素を先頭から順に拾って繋げるだけなので、引数と全く
変わらないリストが返ります
※参照:第7章 P64~66、68~69
defmodule Misc do
def nop( [ head | tail ], rows ), do: nop( tail, rows ++ [ head ] )
def nop( [], rows ), do: rows
…
iex> recompile()
iex> Misc.nop( [ 5, 8, 3, 1 ], [] )
[5, 8, 3, 1]
20
5.JSONパースに必要なライブラリ導入
21
5.JSONパースに必要なライブラリ導入
JSONパーサアプリを書く前段として、ElixirのHTTPclientであ
るHTTPoisonと、JSONparserであるPoisonを導入します
まず、mix.exsに下記赤囲み部分を追加してください
次に、以下コマンドで各モジュールを取得します(要ネット接続)
defmodule Crawl.Mixfile do
…
defp deps do
[
{ :httpoison, "~> 0.7.2" },
{ :poison, "~> 1.5" }
]
end
end
# mix deps.get
※参照:第13章 P137~143
22
追加したモジュールを使い、Qiita API呼出と、返ってくるJSON
(以下参照)のパースを行います
5.JSONパースに必要なライブラリ導入
23
lib/Crawl.exを作り、HTTPoisonでQiita APIの呼び出しを
行うコードを書きます
実行すると、Qiitaから取得したJSONが出力されます
前ページで見たBody部だけで無く、StatusCode等も見れます
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
end
end
# iex –S mix
iex> Crawl.get
%HTTPoison.Response{body: "[{"rendered_body":"nu003ch2u003en
…
,"title":"AWS EC2にElixir/Phoenixをインストール","updated_at":"2017-02-10T13:08:41+09:00",
…(他記事が複数並ぶ)…
"twitter_screen_name":null,"website_url":null}}]",
…(Body部以外のHeader等が複数並ぶ)…
{"Content-Length", "4293"}, {"Connection", "keep-alive"}], status_code: 200}
5.JSONパースに必要なライブラリ導入
※参照:第13章 P137~143
24
5.JSONパースに必要なライブラリ導入
StatusCodeが取得成功を示す「200」のときだけ、Body部を
抜き出し、パターンマッチしやすい変換を行います
変換後のBody部だけが出力されます
defmodule Crawl do
def get() do
response = HTTPoison.get!( "https://qiita.com/api/v2/items?query=
Elixir" )
body = body( response )
Poison.decode!( body )
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
end
iex> recompile()
iex> Crawl.get
[%{"body" => "# ElasticBeanstalk Custom Platformとは?nn今までのElasticBeanstalkでは事前定義済み
…
"title" => "AWS EC2にElixir/Phoenixをインストール",
…(他記事が複数並ぶ)…
"twitter_screen_name" => nil, "website_url" => nil}}]
※参照:第13章 P137~143
25
6.パイプ
26
作ったget()を見ると、Qiita取得→Body抽出→JSONデコード
という流れを、変数で受け渡しており、まどろっこしいです
一方、変数を無くすと、流れと逆になるため、読みにくいです
defmodule Crawl do
def get() do
response = HTTPoison.get!( "https://qiita.com/api/v2/items?query=
Elixir" )
body = body( response )
Poison.decode!( body )
end
…
※参照:第6章 P54~55
6.パイプ
defmodule Crawl do
def get() do
Poison.decode!( body( HTTPoison.get!( "https://qiita.com/api/v2/items?
query=Elixir" ) ) )
…
27
Elixirでは、これを直感的かつスマートに書けて、ステキです
"|>"はパイプ演算子と呼ばれ、前の処理の出力を、次の処理
の第1引数として暗黙で渡します
引数が複数ある場合は、第2引数以降を()で指定も可能です
※下記はサンプルなので動きません
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body
|> Poison.decode!
end
…
6.パイプ
※参照:第6章 P54~55
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body( %{ status_code: _ }, "ERROR: not 200" )
|> Poison.decode!
28
7.JSONパースアプリを仕上げる
29
7.JSONパースアプリを仕上げる
これまで作成したコードをベースに、「Qiita APIを呼び、記事タイ
トルをリストアップするアプリ」に仕上げていきましょう
Poison.decodeでパターンマッチしやすく変換されたBodyは、
以下のような、「1記事1マップ」をリストでまとめたフォーマットに
なっています
記事タイトルのリストアップには、このリストを巡回し、各マップの
titleを抽出すればOKです
[
%{"body" => "【1件目の記事内容】", "created_at" => "【作成日】", "title" => "【1件目の記事タイトル】"},
%{"body" => "【2件目の記事内容】", "created_at" => "【作成日】", "title" => "【2件目の記事タイトル】"},
…
%{"body" => "【n件目の記事内容】", "created_at" => "【作成日】", "title" => "【n件目の記事タイトル】"}
]
30
記事タイトルを抽出するコードを追加します
上のtitle_list()は、変換されたBodyのリストを第1引数で受け、
抽出したタイトルを溜め込むリストを第2引数としています
7.JSONパースアプリを仕上げる
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body
|> Poison.decode!
|> title_list( [] )
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( [ head | tail ], titles ) do
%{ "title" => json_title } = head
added_titles = [ json_title ] ++ titles
title_list( tail, added_titles )
end
def title_list( [], titles ), do: titles
end
※参照:第7章 P64~66、68~69
31
Bodyリストの先頭マップを「head」、以降のマップ群を「tail」で
扱えるようにし、head内に存在する”title”キーの値、つまり記事
タイトルをパターンマッチで抽出し、「json_title」に持たせます
7.JSONパースアプリを仕上げる:タイトルの抽出
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body
|> Poison.decode!
|> title_list( [] )
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( [ head | tail ], titles ) do
%{ "title" => json_title } = head
added_titles = [ json_title ] ++ titles
title_list( tail, added_titles )
end
def title_list( [], titles ), do: titles
end
※参照:第4章 P27
32
抽出したタイトルを”[”と”]”で囲むことでリスト化し、”++”でタイ
トルを溜め込むリストである「titles」の先頭に連結します
なお、初回時は、titlesには空リストである[]が渡されています
7.JSONパースアプリを仕上げる:タイトルの連結
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body
|> Poison.decode!
|> title_list( [] )
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( [ head | tail ], titles ) do
%{ "title" => json_title } = head
added_titles = [ json_title ] ++ titles
title_list( tail, added_titles )
end
def title_list( [], titles ), do: titles
end
※参照:第7章 P75
33
以降のマップ群「tail」に対し、引き続き、抽出を行うため、
title_list()を再度呼びます
tailが空リストになったら、下のtitle_list()が呼ばれ、完了です
7.JSONパースアプリを仕上げる:再帰リスト処理
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body
|> Poison.decode!
|> title_list( [] )
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( [ head | tail ], titles ) do
%{ "title" => json_title } = head
added_titles = [ json_title ] ++ titles
title_list( tail, added_titles )
end
def title_list( [], titles ), do: titles
end
※参照:第7章 P68~69
34
titleの抽出を、まず簡単なデータでテストします
うまく抽出できました
次に、Qiita記事でtitleを抽出します
こうして、たった15行のコードで、「Qiita APIを呼び、記事タイト
ルをリストアップするアプリ」が書けました
7.JSONパースアプリを仕上げる
iex> recompile()
iex> Crawl.title_list [ %{ "body" => "b1", "title" => "t1" }, %{ "body" => "b2", "title" => "t2" } ]
["t2", "t1"]
iex> Crawl.get
["Advent Calendar 2016 投稿数の多いユーザランキング(上位50位)",
"スタートアップ企業の技術選定でPhoenix(Elixir)&React(JS)+時々Echo(go)を採用した",
"弊社で検討したフルスタック寄りWebアプリケーションフレームワークの比較",
"PhoenixでAPIによるログイン機能を実装する",
"新人(候補)を教育することになったので、弊社の教育方針と教材まとめの記事(リンク集)を作っておく",
…(他記事が複数並ぶ)…
"Elixir/Phoenix環境をElasticBeanstalk Custom Platformで構築してみた"]
35
書かれたコードを見直すと、タイトル抽出は比較的難しいものの、
メインの処理は、JSON取得→Body抽出→JSONデコード→
複数title抽出と、とても直感的で分かりやすいコードです
7.JSONパースアプリを仕上げる
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body
|> Poison.decode!
|> title_list( [] )
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( [ head | tail ], titles ) do
%{ "title" => json_title } = head
added_titles = [ json_title ] ++ titles
title_list( tail, added_titles )
end
def title_list( [], titles ), do: titles
end
36
8.応用① コードを洗練させる
37
より直感的なコードに改善できます
第1引数でBodyのみ受けるtitle_list()を設けることで、最初は
空が確定している空リストの指定が省略できます
8.応用① コードを洗練させる:自明な引数の省略
defmodule Crawl do
def get() do
HTTPoison.get!( "https://qiita.com/api/v2/items?query=Elixir" )
|> body
|> Poison.decode!
|> title_list
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( body ), do: _title_list( body, [] )
defp _title_list( [ head | tail ], titles ) do
%{ "title" => json_title } = head
added_titles = [ json_title ] ++ titles
_title_list( tail, added_titles )
end
defp _title_list( [], titles ), do: titles
end
※参照:第7章 P69
38
URL指定も関数化し、検索キーワードもパラメータ化します
パイプで簡単に処理を継ぎ足せるのが、Elixirらしいところです
8.応用① コードを洗練させる:URL指定の分離
defmodule Crawl do
def get( query  "Elixir" ) do
url( query )
|> HTTPoison.get!
|> body
|> Poison.decode!
|> title_list
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( body ), do: _title_list( body, [] )
defp _title_list( [ head | tail ], titles ) do
%{ "title" => json_title } = head
added_titles = [ json_title ] ++ titles
_title_list( tail, added_titles )
end
defp _title_list( [], titles ), do: titles
def url( query ), do: "https://qiita.com/api/v2/items?query=#{query}"
end
#{~}で、引数や変数の値を展開できる
””でパラメータ未指定時のデフォルト引数が指定可能
39
「head」と「tail」を関数内でパターンマッチしている部分を、引数
で”title”を直接パターンマッチするようにし、title連結部分も”|”
でのリスト連結に変えれば、よりコードが短縮できます
※やや難しいので、今はニュアンスを理解する程度でもOKです
8.応用① コードを洗練させる:リスト巡回の短縮
defmodule Crawl do
def get( query  "Elixir" ) do
url( query )
|> HTTPoison.get!
|> body
|> Poison.decode!
|> title_list
end
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( body ), do: _title_list( body, [] )
defp _title_list( [ %{ "title" => json_title } | tail ], titles ) do
_title_list( tail, [ json_title | titles ] )
end
defp title_list( [], titles ), do: Enum.reverse( titles )
def url( query ), do: "https://qiita.com/api/v2/items?query=#{query}"
end
※参照:第6章 P54
40
8.応用① コードを洗練させる:モジュール分離
共通ロジックを別モジュールに括りだします
Parse.exを以下内容で作成し、Crawl.ex側も修正します
defmodule Parse do
def body( %{ status_code: 200, body: json_body } ), do: json_body
def title_list( body ), do: _title_list( body, [] )
defp _title_list( [], titles ), do: titles
defp _title_list( [ %{ "title" => json_title } | tail ], titles ) do
_title_list( tail, [ json_title | titles ] )
end
end
Parse.ex
Crawl.ex
defmodule Crawl do
def get( query  "Elixir" ) do
url( query )
|> HTTPoison.get!
|> Parse.body
|> Poison.decode!
|> Parse.title_list
end
def url( query ), do: "https://qiita.com/api/v2/items?query=#{query}"
end
41
9.応用② Qiita API以外のJSONパース
42
9.応用② Qiita API以外のJSONパース
Qiita API以外のAPIも、ほぼ同じコードでJSONパースできます
「はてなAPI」のJSONは、若干壊れている (笑) ので、デコード
前に文字列操作で補正をかけるパイプを追加します
defmodule Hatena do
def get( query  "Elixir" ) do
url( query )
|> HTTPoison.get!
|> Parse.body
|> String.slice( 1..-3 ) # そのままだとinvalidなJSONなので加工
|> Poison.decode!
|> Parse.title_list
end
def url( query ), do: "http://b.hatena.ne.jp/entrylist/json?sort=count&url=#{query}"
end
Hatena.ex
# iex -S mix
iex> Hatena.get
["【翻訳】超高速なJSON APIをElixirフレームワークのPhoenixでビ...",
"2015/08/22/ElixirとPhoenixとMithrilのFFスタックでChatアプリを作っ...",
…(他記事が複数並ぶ)…
" Elixir ご紹介 // Speaker Deck"]
43
9.応用② Qiita API以外のJSONパース
「Wikipedia API」のJSONは、Qiita APIより2段、深い階層
構造なので、titleを抽出できる階層まで下るパイプを追加します
defmodule Wikipedia do
def get( query  "Elixir" ) do
url( query )
|> HTTPoison.get!
|> Parse.body
|> Poison.decode!
|> dig
|> Parse.title_list
end
def url( query ), do: "https://ja.wikipedia.org/w/api.php?format=json&action=query
&list=search&srsearch=#{query}"
def dig( %{ "query" => %{ "search" => search } } ), do: search
end
Wikipedia.ex
# iex -S mix
iex> Wikipedia.get
["熊沢千絵",
"プログラミング言語一覧",
…(他記事が複数並ぶ)…
"エリクサー"]
44
9.応用② Qiita API以外のJSONパース
「Github API」は、検索パラメータの指定が異なるので、検索パ
ラメータに渡すデフォルト値を変えます
defmodule Github do
def get( query  "Elixir-lang/Elixir" ) do # 例.rails/rails
url( query )
|> HTTPoison.get!
|> Parse.body
|> Poison.decode!
|> Parse.title_list
end
def url( query ), do: "https://api.github.com/repos/#{query}/issues"
end
Github.ex
# iex -S mix
iex> Wikipedia.get
["Use @optional_callbacks in GenServer",
"Improve no function clause error messages",
…(他記事が複数並ぶ)…
"Make Mix more friendly for newcomers"]
45
10.これからElixirを学んでいくあなたへ
46
10.これからElixirを学んでいくあなたへ
今回は、Elixirの入門ということで、パターンマッチやパイプといった
Elixirの基本的な機能についてご説明しました
関数型言語が、「そこまで難しく無いかも?」と思っていただけたら
この入門としては大成功です
Java等のオブジェクト言語に慣れた方ほど、とっつき難いところが
関数型言語にはありますが、Elixirは入門向きだと思います
逆に、プログラミングはこれから、という方にとっては、余計な知識
を入れずにElixirを直感で理解できる、良い機会です
仕事でも趣味でも、プログラミングライフをエンジョイしてください!

Contenu connexe

Tendances

Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTMasahiro Nagano
 
about Thrift
about Thriftabout Thrift
about ThriftNaoya Ito
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium MobileNaoya Ito
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方kwatch
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + PerlNaoya Ito
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Taro Hirose
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014Rui Hirokawa
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixirk1complete
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 

Tendances (20)

Reading Anorm 2.0
Reading Anorm 2.0Reading Anorm 2.0
Reading Anorm 2.0
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
 
about Thrift
about Thriftabout Thrift
about Thrift
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
Titanium Mobile
Titanium MobileTitanium Mobile
Titanium Mobile
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
 
ES6 in Practice
ES6 in PracticeES6 in Practice
ES6 in Practice
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + Perl
 
Zabbix API
Zabbix APIZabbix API
Zabbix API
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
 
実"戦"CakePHP Plugin
実"戦"CakePHP Plugin実"戦"CakePHP Plugin
実"戦"CakePHP Plugin
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
 
Akka stream
Akka streamAkka stream
Akka stream
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5
 

Similaire à Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります

Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
traceur-compilerで未来のJavaScriptを体験
traceur-compilerで未来のJavaScriptを体験traceur-compilerで未来のJavaScriptを体験
traceur-compilerで未来のJavaScriptを体験Toshio Ehara
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISPMasaomi CHIBA
 
Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTterurou
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験Toshio Ehara
 
Web講座 第9回
Web講座 第9回Web講座 第9回
Web講座 第9回nanametown
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Shinsuke Sugaya
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Hiroshi Ito
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
覚醒JavaScript  -ES6で作るIsomophicアプリケーション-覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
覚醒JavaScript -ES6で作るIsomophicアプリケーション-Oonishi Keitarou
 
Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Yo Takezawa
 
オープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミングオープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミングSho Okada
 

Similaire à Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります (20)

Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
traceur-compilerで未来のJavaScriptを体験
traceur-compilerで未来のJavaScriptを体験traceur-compilerで未来のJavaScriptを体験
traceur-compilerで未来のJavaScriptを体験
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISP
 
Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LT
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験
 
Web講座 第9回
Web講座 第9回Web講座 第9回
Web講座 第9回
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
覚醒JavaScript  -ES6で作るIsomophicアプリケーション-覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
覚醒JavaScript -ES6で作るIsomophicアプリケーション-
 
Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築
 
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
 
APIKit
APIKitAPIKit
APIKit
 
オープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミングオープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミング
 

Plus de fukuoka.ex

AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」fukuoka.ex
 
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」fukuoka.ex
 
Elixir入門「第5回:Visualixirで見るマルチプロセス」
Elixir入門「第5回:Visualixirで見るマルチプロセス」Elixir入門「第5回:Visualixirで見るマルチプロセス」
Elixir入門「第5回:Visualixirで見るマルチプロセス」fukuoka.ex
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますfukuoka.ex
 
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」fukuoka.ex
 
AI入門「第1回:AIの歴史とTensorFlow」
AI入門「第1回:AIの歴史とTensorFlow」AI入門「第1回:AIの歴史とTensorFlow」
AI入門「第1回:AIの歴史とTensorFlow」fukuoka.ex
 
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」fukuoka.ex
 

Plus de fukuoka.ex (7)

AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
 
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
 
Elixir入門「第5回:Visualixirで見るマルチプロセス」
Elixir入門「第5回:Visualixirで見るマルチプロセス」Elixir入門「第5回:Visualixirで見るマルチプロセス」
Elixir入門「第5回:Visualixirで見るマルチプロセス」
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
 
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
 
AI入門「第1回:AIの歴史とTensorFlow」
AI入門「第1回:AIの歴史とTensorFlow」AI入門「第1回:AIの歴史とTensorFlow」
AI入門「第1回:AIの歴史とTensorFlow」
 
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
 

Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります