データ流通システムの実証実験 オープンデータへのアクセスをElixirでやってみる

https://qiita.com/official-events/12fc7bacec894d33a981

# はじめに
- NECさんとさくらインターネットさんが、[データ流通システムの実証実験](https://fiware-testbed.jp/)をされています
- [オープンデータへのアクセス](https://documents.fiware-testbed.jp/opendata-access/)を[Elixir](https://elixir-lang.org/)で楽しみたいとおもいます:bangbang::bangbang::bangbang:
- `curl`のコマンド例がドキュメントに書いてあるのできっとできるのでしょうが、やってみたことはとにかくアウトプットしてみることにしています

## [実証環境のご紹介 (PDF)](https://documents.fiware-testbed.jp/file/fiware-handson-1.pdf)
- そもそもこれが、一体全体何なのか私に説明を求められても説明はできません(断言します)
- こちらのPDFの内容がわかりやすいようにおもいましたのでご紹介しておきます
- [FIWARE](https://www.fiware.org/)がポイントのようにおもいます
    - The Open Source Platform for Our Smart Digital Future
- [WireCloud](https://wirecloud.fiware-testbed.jp/)という**データの可視化機能**でこんな可視化ができます
    - [実証環境のご紹介 (PDF)](https://documents.fiware-testbed.jp/file/fiware-handson-1.pdf)の通り進めただけです
    - より詳しくは、[ハンズオン詳細資料 (PDF)](https://documents.fiware-testbed.jp/file/fiware-handson-2.pdf)に書いてあります

![スクリーンショット 2021-09-30 3.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/c898f436-bef6-2f26-97c0-6e8178895560.png)

- 私がやろうとしている「[オープンデータへのアクセス](https://documents.fiware-testbed.jp/opendata-access/)」はこの可視化のもとになったデータをJSON形式で読み取るというものだとおもいます

# 準備
- [実証実験申し込み](https://fiware-testbed.jp/apply.html#contents)をします
    - 申し込みから3日程度のちに、**FIWARE実証実験　アカウント発行のお知らせ**というメールが届きました
    - 私が申し込んだときは3種類のIDが発行されていました
    - これからつかうものは**マーケットプレイスアカウント**です
- 申し込みが済んだらまずは、https://documents.fiware-testbed.jp/ を順にみていくとよさそうです
    - 何度もご紹介しますが、「[実証環境のご紹介 (PDF)](https://documents.fiware-testbed.jp/file/fiware-handson-1.pdf)」がリンクされていますのでまず確認するとよいとおもいます
- [Elixir](https://elixir-lang.org/) 1.12をインストールします
    - `curl`のコマンド例がドキュメントに書いてありますので、[Elixir](https://elixir-lang.org/)を持ち出す必要はないといえばないのですが私は[Elixir](https://elixir-lang.org/)が好きなので[Elixir](https://elixir-lang.org/)でやってみます

# Let's get started :bangbang::bangbang::bangbang:
- [オープンデータへのアクセス](https://documents.fiware-testbed.jp/opendata-access/)を[Elixir](https://elixir-lang.org/)に書いてある`curl`のコマンドを[Elixir](https://elixir-lang.org/)が好きなので[Elixir](https://elixir-lang.org/)で置き換えてやってみました
- 以下、感じてください
    - [Elixir](https://elixir-lang.org/)でHTTP POST、GETをしているだけです
    - [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)にと〜ってもお世話になりました

```elixir:opendata_access.exs
# install Hex
Mix.install([
  {:httpoison, "~> 1.8"},
  {:jason, "~> 1.2"}
])

# トークン取得 (マーケットプレイスアカウントを使う)
body = %{
  username: "userXXX@fiware-testbed.jp",
  password: "xxxxxxxxxxxxxxxxx"
} |> Jason.encode!()        

token = 
HTTPoison.post!("https://orion.fiware-testbed.jp/token", body, [{"Content-type", "application/json"}])
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("access_token")

# エンティティの取得
headers = [{"X-Auth-Token", token}, {"Fiware-Service", "NEC"}, {"Fiware-ServicePath", "/fukuoka_aed"}]

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?type=PointOfInterest", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()

# エンティティ件数の取得
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?options=count", headers)
|> Map.get(:headers)
|> Enum.filter(fn {key, _} -> key == "fiware-total-count" end)
|> Enum.at(0)
|> elem(1)
|> String.to_integer()
|> IO.puts()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?offset=990&limit=6", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()

# ジオフィルタリング
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0020", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Map.get("address")
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "id"))
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities?georel=near;maxDistance:1000&geometry=point&coords=33.579836,130.294118", headers)
|> Map.get(:body)
|> Jason.decode!()
|> Enum.map(& Map.get(&1, "address"))
|> IO.inspect()

# コンパクト表現(Key-Values)
## オプション指定なし

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()

## オプション指定あり
HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=keyValues", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=name,description", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()

HTTPoison.get!("https://orion.fiware-testbed.jp/v2/entities/fukuoka-aed-0001?options=values&attrs=description,name", headers)
|> Map.get(:body)
|> Jason.decode!()
|> IO.inspect()
```

## Run!!!

```
# elixir opendata_access.exs
```

- 「[オープンデータへのアクセス](https://documents.fiware-testbed.jp/opendata-access/)」の実行結果と同じ値が得られることを確認できます

# Wrapping Up :lgtm::lgtm::lgtm::lgtm::lgtm:
- `curl`のコマンド例の通りに[Elixir](https://elixir-lang.org/)でデータアクセスができました
- 次は自分の家の温度・湿度データを送ってみるということをやってみたいとおもっています :rocket::rocket::rocket:
- @kikuzo さんから教えてもらいましたところ、すでにいただいている認証情報でデータを送ることができます!
    - https://qiita.com/torifukukaiou/items/c539cd8a5e0947ebec4d#comment-ac1aef52297088871360
    - ありがとうございます！ :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:
- とりあえず curl でやってみました例を以下に記録しておきます
    - https://qiita.com/torifukukaiou/items/c539cd8a5e0947ebec4d#comment-28d0aa8f2e3134171094
- ~~ガイドは「[IoT Agent利用マニュアル](https://documents.fiware-testbed.jp/iot-agent/)」 が該当するとおもっています~~
    - ~~別途、利用するための設定情報を発行していただく必要があるようです~~
    - ~~**FIWARE実証実験　アカウント発行のお知らせ**というタイトルのメールの送信元に問い合わせてみているというのがいまの私のステータスです~~