Open3

Replit上で、ElixirのHexに登録されているライブラリをインストールして利用する

MzRyuKaMzRyuKa

ReplitのテンプレートでElixirを選択して、Create Replを実行する。

すると、テンプレートを元にプロジェクトが出来上がるが、exsベースでの作成となる。

※ファイルもmain.exsが一つあるのみ

この時、Hex上のライブラリを利用したい場合、一旦実行環境へライブラリのインストールをしておく必要がある。

Elixirのv1.12以降であれば、Mix.install/2を利用して、exs上でHexのライブラリをインストールしておける。

Shell欄でElixirのバージョンを確認してみると、Elixir 1.13.4 (compiled with Erlang/OTP 24)であった。
なので、Mix.install/2が利用できる。

MzRyuKaMzRyuKa

exs上で、HTTPでJsonデータを返すAPIにアクセスする前提とする。

利用するライブラリは、「httpoison」と「jason」の2つ。

main.exsの先頭にMix.install/2でこの二つをインストールするように対応。
バージョンの指定は、それぞれのHexDocに記載してあったバージョンで記述。

main.exs
## Mix.install/2を利用して、exs上でhttpoisonとjasonを利用する
Mix.install([
  {:httpoison, "~> 2.0"},
  {:jason, "~> 1.4"}
])

IO.puts("done Mix.install/2")  # ←これは、実行を確認するために用意したもので、特に必要ではない

一通りコードを記載したら、画面上の「▶️Run」をクリック。
都度、Shall I install Hex? Shall I install feber3? と聞かれるので、「Y」を入力してEnterクリックでインストールを進めていく。

Could not find Hex, which is needed to build dependency :httpoison
Shall I install Hex? (if running non-interactively, use "mix local.hex --force") [Yn] Y 
* creating /home/runner/ReptitElixirGetConnpassEvents/.mix/archives/hex-2.0.6
Resolving Hex dependencies...
Resolution completed in 0.145s
New:
  certifi 2.9.0
  hackney 1.18.1
  httpoison 2.1.0
  idna 6.1.1
  jason 1.4.0
  metrics 1.0.1
  mimerl 1.2.0
  parse_trans 3.3.1
  ssl_verify_fun 1.1.6
  unicode_util_compat 0.7.0
* Getting httpoison (Hex package)
* Getting jason (Hex package)
* Getting hackney (Hex package)
* Getting certifi (Hex package)
* Getting idna (Hex package)
* Getting metrics (Hex package)
* Getting mimerl (Hex package)
* Getting parse_trans (Hex package)
* Getting ssl_verify_fun (Hex package)
* Getting unicode_util_compat (Hex package)
Could not find "rebar3", which is needed to build dependency :parse_trans
I can install a local copy which is just used by Mix
Shall I install rebar3? (if running non-interactively, use "mix local.rebar --foYn] Y
* creating /home/runner/ReptitElixirGetConnpassEvents/.mix/rebar
* creating /home/runner/ReptitElixirGetConnpassEvents/.mix/rebar3
===> Analyzing applications...
===> Compiling parse_trans
===> Analyzing applications...
===> Compiling mimerl
===> Analyzing applications...
===> Compiling metrics
===> Analyzing applications...
===> Compiling unicode_util_compat
===> Analyzing applications...
===> Compiling idna
==> jason
Compiling 10 files (.ex)
Generated jason app
==> ssl_verify_fun
Compiling 7 files (.erl)
Generated ssl_verify_fun app
===> Analyzing applications...
===> Compiling certifi
===> Analyzing applications...
===> Compiling hackney
==> httpoison
Compiling 3 files (.ex)
Generated httpoison app
done Mix.install/2

インストールを進めていくと、左側位なるFilesの箇所で、.hex.mixのディレクトリが作られているのがわかる。

MzRyuKaMzRyuKa

connpassの公開APIを利用して、データを取得、および出力を確認するようにする。

connpassの公開APIの仕様はこちら

で、肝心のソースコードはこちら

main.exs
## Mix.install/2を利用して、exs上でhttpoisonとjasonを利用する
Mix.install([
  {:httpoison, "~> 2.0"},
  {:jason, "~> 1.4"}
])

base_request_url = "https://connpass.com/api/v1/event/?"
url = Enum.join([base_request_url,
  "/api/v1/event/?",
  "ym=202305&",
  "keyword=elixir&",
  "order=2&",
  "count=10"], "")
IO.puts("url : #{url}")

# エラーは一旦無視して、レスポンスがただしい場合のみを想定する
# エラーも考慮するときは、HTTPoison.getを利用。
response = HTTPoison.get!(url)
result = response
|> Map.get(:body)
|> Jason.decode!()

"results_available: #{result["results_available"]}"
|> IO.puts()

"results_returned: #{result["results_returned"]}"
|> IO.puts()

result["events"]
|> Enum.map(fn(m) -> %{title: m["title"], url: m["series"]["url"]} end)
|> IO.inspect()

んで、実行結果はこちら。

以下はコンソールの実行結果はこちら。

url : https://connpass.com/api/v1/event/?/api/v1/event/?ym=202305&keyword=elixir&order=2&count=10
results_available: 953
results_returned: 10
[
  %{
    title: "LiveViewJP#17:画像識別AIや音声識別AI、お絵描きAIをLivebookでハンズオン",
    url: "https://liveviewjp.connpass.com/"
  },
  %{
    title: "piyopiyo.ex #16:スライド1枚から3枚まで!げきよわLT会!",
    url: "https://piyopiyoex.connpass.com/"
  },
  %{
    title: "ElixirMobile#2:ElixirDesktopスマホアプリ作成ハンズオン",
    url: "https://fukuokaex.connpass.com/"
  },
  %{
    title: "NervesJP #39 Build a Weather Station を読む会 7回目",
    url: "https://nerves-jp.connpass.com/"
  },
  %{title: "OkazaKirin.beam #103", url: "https://okazakirin-beam.connpass.com/"},
  %{
    title: "LiveViewJP#16:LiveViewでリアルタイムWeb/SPAを開発する",
    url: "https://liveviewjp.connpass.com/"
  },
  %{title: "OkazaKirin.beam #102", url: "https://okazakirin-beam.connpass.com/"},
  %{
    title: "ElixirImp#30:Livebookの機能を使い倒そう",
    url: "https://fukuokaex.connpass.com/"
  },
  %{
    title: "ElixirImpオフ会:都心で焼肉ゥッ(日付は変動するかもだけどそれでも良ければ)",
    url: "https://fukuokaex.connpass.com/"
  },
  %{title: "OkazaKirin.beam #101", url: "https://okazakirin-beam.connpass.com/"}
]
Interactive Elixir (1.13.4) - press Ctrl+C to exit (type h() ENTER for help)