Submit Search
Upload
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
•
9 likes
•
5,933 views
fukuoka.ex
Follow
Elixirの「パターンマッチ」と「パイプ」、各種ライブラリを使って、JSON APIを叩き、JSONをパースするアプリをサクっと書いてみます
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 36
Recommended
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
fukuoka.ex
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
Takayuki Shimizukawa
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
例外設計における大罪
例外設計における大罪
Takuto Wada
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
書籍 「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」 を通して伝えたいFlaskのプラクティス.pdf
書籍 「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」 を通して伝えたいFlaskのプラクティス.pdf
taisa831
Recommended
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
fukuoka.ex
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
Takayuki Shimizukawa
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
例外設計における大罪
例外設計における大罪
Takuto Wada
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
書籍 「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」 を通して伝えたいFlaskのプラクティス.pdf
書籍 「Python FlaskによるWebアプリ開発入門 物体検知アプリ&機械学習APIの作り方」 を通して伝えたいFlaskのプラクティス.pdf
taisa831
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
ゲームアプリの数学@GREE GameDevelopers' Meetup
ゲームアプリの数学@GREE GameDevelopers' Meetup
gree_tech
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
KLab Inc. / Tech
Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介ver.2
Tsunenori Oohara
【Unity道場】物理シミュレーション完全マスター
【Unity道場】物理シミュレーション完全マスター
Unity Technologies Japan K.K.
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
ShunsukeNakamura17
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
オープンソースのAPIゲートウェイ Kong ご紹介
オープンソースのAPIゲートウェイ Kong ご紹介
briscola-tokyo
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
fukuoka.ex
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
Tokoroten Nakayama
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
fukuoka.ex
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
fukuoka.ex
More Related Content
What's hot
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
ゲームアプリの数学@GREE GameDevelopers' Meetup
ゲームアプリの数学@GREE GameDevelopers' Meetup
gree_tech
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
PostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
KLab Inc. / Tech
Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介ver.2
Tsunenori Oohara
【Unity道場】物理シミュレーション完全マスター
【Unity道場】物理シミュレーション完全マスター
Unity Technologies Japan K.K.
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
ShunsukeNakamura17
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
オープンソースのAPIゲートウェイ Kong ご紹介
オープンソースのAPIゲートウェイ Kong ご紹介
briscola-tokyo
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
fukuoka.ex
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
Tokoroten Nakayama
What's hot
(20)
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
ゲームアプリの数学@GREE GameDevelopers' Meetup
ゲームアプリの数学@GREE GameDevelopers' Meetup
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
PostgreSQLアンチパターン
PostgreSQLアンチパターン
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介ver.2
【Unity道場】物理シミュレーション完全マスター
【Unity道場】物理シミュレーション完全マスター
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
オープンソースのAPIゲートウェイ Kong ご紹介
オープンソースのAPIゲートウェイ Kong ご紹介
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
Similar to Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
fukuoka.ex
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
fukuoka.ex
Web講座 第9回
Web講座 第9回
nanametown
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Shogo Sensui
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
fukuoka.ex
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
fukuoka.ex
Real world android akka
Real world android akka
Taisuke Oe
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
Yu Nobuoka
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
Noritada Shimizu
Emscripten使ってみた
Emscripten使ってみた
Yuusuke Jinguuji
Hakodate - simple framework
Hakodate - simple framework
Hiroaki Murayama
IdrisでWebアプリを書く
IdrisでWebアプリを書く
Hideyuki Tanaka
20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある
IgaHironobu
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
Shinsuke Sugaya
ATN No.2 Scala事始め
ATN No.2 Scala事始め
AdvancedTechNight
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
Nodejuku01 ohtsu
Nodejuku01 ohtsu
Nanha Park
Everyday Life with clojure.spec
Everyday Life with clojure.spec
Kent Ohashi
おもにEXcelだけで出来る自動化技術
おもにEXcelだけで出来る自動化技術
Takanobu Mizuta
Similar to Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
(20)
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
やや関数型を意識した風Elixir/Phoenixご紹介
やや関数型を意識した風Elixir/Phoenixご紹介
Web講座 第9回
Web講座 第9回
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Real world android akka
Real world android akka
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
Emscripten使ってみた
Emscripten使ってみた
Hakodate - simple framework
Hakodate - simple framework
IdrisでWebアプリを書く
IdrisでWebアプリを書く
20181025 若手LT会 Codableあるある
20181025 若手LT会 Codableあるある
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
ATN No.2 Scala事始め
ATN No.2 Scala事始め
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Nodejuku01 ohtsu
Nodejuku01 ohtsu
Everyday Life with clojure.spec
Everyday Life with clojure.spec
おもにEXcelだけで出来る自動化技術
おもにEXcelだけで出来る自動化技術
More from fukuoka.ex
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
fukuoka.ex
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
fukuoka.ex
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
fukuoka.ex
Elixir入門「第5回:Visualixirで見るマルチプロセス」
Elixir入門「第5回:Visualixirで見るマルチプロセス」
fukuoka.ex
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
fukuoka.ex
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
fukuoka.ex
AI入門「第1回:AIの歴史とTensorFlow」
AI入門「第1回:AIの歴史とTensorFlow」
fukuoka.ex
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
fukuoka.ex
More from fukuoka.ex
(8)
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
AI入門「第4回:ディープラーニングの中身を覗いて、育ちを観察する」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
Elixir入門「第5回:Visualixirで見るマルチプロセス」
Elixir入門「第5回:Visualixirで見るマルチプロセス」
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
重力プログラミング入門「第1回:地球の重力下で人工衛星を公転軌道に乗せる」
AI入門「第1回:AIの歴史とTensorFlow」
AI入門「第1回:AIの歴史とTensorFlow」
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
AI入門「第2回:Scala/Spark/Mahoutでレコメンドエンジンを作る」
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
1.
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作成 2017/10/23 ver1.5(Elixir 1.5検証済)作成
2.
1 1. Elixirを学ぶと得られること 2. DockerでElixirを使えるようにする 3.
はじめてのElixirプログラミング 4. パターンマッチ 5. JSONパースに必要なライブラリ導入 6. パイプ 7. JSONパースアプリを仕上げる 8. 応用:Qiita API以外のJSONパース 9. これからElixirを学んでいくあなたへ 目次 ※ページ最下部の章番号/ページは、Dave Thomas著「プログラミングElixir」の関連記載です。ご参考ください
3.
2 1.Elixirを学ぶと得られること
4.
3 1.Elixirを学ぶと得られること を学ぶと、以下のような苦難から解放されます a. C10K問題などのソフトウェア性能問題からの解放 b. JSONパーサを手続き的にチマチマ書くことからの解放 c.
オブジェクト設計という「余計な仕事」からの解放 d. 他の関数型言語での脱落からの解放 e. 複雑なマルチスレッドプログラミング/デバッグからの解放 f. 1958年に生まれた素晴らしいプログラミングパラダイムを 使いこなせなかった呪いからの解放 結果、プログラミングやプログラマ/エンジニアとしての普段の仕事 が、とても楽しくなります
5.
4 2.DockerでElixirを使えるようにする
6.
5 2.DockerでElixirを使えるようにする Elixirを使い始めるのに、3種類の方法があります ① yumやapt/Homebrew/Chocolateyを使う ② 各OS用のElixirをダウンロード、インストールする ③
DockerでElixirイメージをインスト―ル(pull)する このうち、最もてっとり早いのは、③のDockerを使うことです (OS毎の差異影響も受けないのでオススメ) Dockerをインストールしてみましょう https://www.docker.com/get-docker . 以下コマンドでElixirイメージをDLしましょう (要ネット接続) > docker pull trenpixster/elixir WindowsやMacの手順は、第3回も無いため、 自信が無いときはDockerが良いかと思います
7.
6 2.DockerでElixir:ローカルPCのフォルダ共有 ローカルPCのフォルダをDockerでマウントして開発可とするため、 Docker設定「Shared Drives」でドライブ共有をONします Windowsであれば、その前にWindowsフォルダ共有のポート (TCP/445)にアクセスできるようにしておきます ※ウイルスチェッカーとWindowsファイアウォールの両方にブロック設定がある場合がある もし設定する場所が分からない 場合や、FWのポートを空けたく ない時は、Docker内部のviで 編集やコピペを行ってください
8.
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
9.
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"…}
10.
9 3.はじめてのElixirプログラミング
11.
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
12.
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] リスト等のコレクションをソートする
13.
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を抜けずにコード変更を反映できる
14.
13 4.パターンマッチ
15.
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
16.
15 4.パターンマッチ:複数関数の呼び分け キーだけで無く、値でマッチしての関数の呼び分けも可能です 以下のように、上と下の関数が、値に応じて、呼び分けされます 他の言語なら、関数呼び出し後に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
17.
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"
18.
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
19.
18 5.JSONパースに必要なライブラリ導入
20.
19 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
21.
20 追加したモジュールを使い、Qiita API呼出と、返ってくるJSON (以下参照)のパースを行います 5.JSONパースに必要なライブラリ導入
22.
21 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
23.
22 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
24.
23 6.パイプ
25.
24 作った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" ) ) ) …
26.
25 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!
27.
26 7.JSONパースアプリを仕上げる
28.
27 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件目の記事タイトル】"} ]
29.
28 記事タイトルをパターンマッチで抽出するコードを追加します 書かれたコードを見直すと、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! |> Enum.map( fn( %{ "title" => title } ) -> title end ) end def body( %{ status_code: 200, body: json_body } ), do: json_body end ※参照:第7章 P64~66、68~69
30.
29 Qiita記事でtitleを抽出します こうして、たった15行のコードで、「Qiita APIを呼び、記事タイト ルをリストアップするアプリ」が書けました 7.JSONパースアプリを仕上げる iex> Crawl.get ["Advent
Calendar 2016 投稿数の多いユーザランキング(上位50位)", "スタートアップ企業の技術選定でPhoenix(Elixir)&React(JS)+時々Echo(go)を採用した", "弊社で検討したフルスタック寄りWebアプリケーションフレームワークの比較", "PhoenixでAPIによるログイン機能を実装する", "新人(候補)を教育することになったので、弊社の教育方針と教材まとめの記事(リンク集)を作っておく", …(他記事が複数並ぶ)… "Elixir/Phoenix環境をElasticBeanstalk Custom Platformで構築してみた"]
31.
30 8.応用:Qiita API以外のJSONパース
32.
31 8.応用:Qiita API以外のJSONパース Qiita API以外のAPIも、ほぼ同じコードでJSONパースできます 「はてなAPI」のJSONは、若干壊れている
(笑) ので、デコード 前に文字列操作で補正をかけるパイプを追加します defmodule Hatena do def get() do HTTPoison.get!( "http://b.hatena.ne.jp/entrylist/json?sort=count&url=Elixir" ) |> body |> String.slice( 1..-3 ) # そのままだとinvalidなJSONなので加工 |> Poison.decode! |> Enum.map( fn( %{ "title" => title } ) -> title end ) end def body( %{ status_code: 200, body: json_body } ), do: json_body end # iex -S mix iex> Hatena.get ["【翻訳】超高速なJSON APIをElixirフレームワークのPhoenixでビ...", "2015/08/22/ElixirとPhoenixとMithrilのFFスタックでChatアプリを作っ...", …(他記事が複数並ぶ)… " Elixir ご紹介 // Speaker Deck"] lib/hatena.ex
33.
32 8.応用:Qiita API以外のJSONパース 「Wikipedia API」のJSONは、Qiita
APIより2段、深い階層 構造なので、titleを抽出できる階層まで下るパイプを追加します defmodule Wikipedia do def get() do HTTPoison.get!( "https://ja.wikipedia.org/w/api.php?format=json&action=query&list =search&srsearch=Elixir" |> body |> Poison.decode! |> dig |> Enum.map( fn( %{ "title" => title } ) -> title end ) end def body( %{ status_code: 200, body: json_body } ), do: json_body def dig( %{ "query" => %{ "search" => search } } ), do: search end # iex -S mix iex> Wikipedia.get ["熊沢千絵", "プログラミング言語一覧", …(他記事が複数並ぶ)… "エリクサー"] lib/wikipedia.ex
34.
33 8.応用:Qiita API以外のJSONパース 「Github API」は、検索パラメータの指定を変更します defmodule
Github do def get() do HTTPoison.get!( "https://api.github.com/repos/Elixir-lang/Elixir/issues" ) |> body |> Poison.decode! |> Enum.map( fn( %{ "title" => title } ) -> title end ) end def body( %{ status_code: 200, body: json_body } ), do: json_body end # iex -S mix iex> Github.get ["Use @optional_callbacks in GenServer", "Improve no function clause error messages", …(他記事が複数並ぶ)… "Make Mix more friendly for newcomers"] lib/github.ex
35.
34 9.これからElixirを学んでいくあなたへ
36.
35 9.これからElixirを学んでいくあなたへ 今回は、Elixirの入門ということで、パターンマッチやパイプといった Elixirの基本的な機能についてご説明しました 関数型言語が、「そこまで難しく無いかも?」と思っていただけたら この入門としては大成功です Java等のオブジェクト言語に慣れた方ほど、とっつき難いところが 関数型言語にはありますが、Elixirは入門向きだと思います 逆に、プログラミングはこれから、という方にとっては、余計な知識 を入れずにElixirを直感で理解できる、良い機会です 仕事でも趣味でも、プログラミングライフをエンジョイしてください!