ちぎりきなかたみに袖をしぼりつつ末の松山波越さじとは
Advent Calendar 2022 93日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
Mix.install/2のサンプル集であるmix_install_examplesからwojtekmach/cを紹介します。
What's Mix.install/2 ?
Mix.install/2は、Elixir 1.12から追加されました。
Elixirでライブラリ(Hex)を追加するのは、1.11まではmix new
でプロジェクトを作らないといけないなど、ひと手間必要でした。
Mix.install/2を使うことで、ちょっとした1ファイルで収まるようなスクリプトを書く際に.exs
のみで完結できるようになりました。
具体例
具体例です。
私がよく使ういつものサンプルです。
Qiita APIを使わせていただいて、Elixir
タグがついた最新の記事を20件取得しています
Mix.install [:req]
"https://qiita.com/api/v2/items?query=tag:Elixir"
|> URI.encode()
|> Req.get!(finch_options: [pool_timeout: 50000, receive_timeout: 50000])
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))
Qiitaさん、いつもありがとうございます!!!
c_libcurl.exs
おもしろそうなサンプルってことで、今日はwojtekmach/cを楽しんでみます。
What's wojtekmach/c ?
Easily use C code in your Elixir projects.
には登録されていないようです。
Run
それでは、c_libcurl.exsを動かしてみます。
以下、そのまま掲載します。
Mix.install([
{:c, github: "wojtekmach/c"}
])
defmodule Curl.MixProject do
use Mix.Project
def project do
[
app: :curl,
version: "1.0.0"
]
end
end
defmodule Main do
def main do
Curl.test()
end
end
defmodule Curl do
use C, compile: "-lcurl"
# Based on https://curl.se/libcurl/c/simple.html
defc(:test, 0, ~S"""
#include <curl/curl.h>
static ERL_NIF_TERM test(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (!curl) {
enif_raise_exception(env, enif_make_string(env, "could not init curl", ERL_NIF_LATIN1));
return -1;
}
curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/json");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
/* always cleanup */
curl_easy_cleanup(curl);
return enif_make_atom(env, "ok");
}
""")
end
Main.main()
defc
の第2引数に文字列でCのコードを埋め込んでいるところが特徴です。
実行
git clone https://github.com/wojtekmach/mix_install_examples.git
cd mix_install_examples
elixir c_libcurl.exs
結果
JSONが表示されました。
C言語のcurl_easy_perform
の実行のところで表示されていました。
前後にprintf("a")
を入れて確かめました。
{
"slideshow": {
"author": "Yours Truly",
"date": "date of publication",
"slides": [
{
"title": "Wake up to WonderWidgets!",
"type": "all"
},
{
"items": [
"Why <em>WonderWidgets</em> are great",
"Who <em>buys</em> WonderWidgets"
],
"title": "Overview",
"type": "all"
}
],
"title": "Sample Slide Show"
}
}
https://httpbin.org/json
にブラウザでアクセスするなり、それこそcurl https://httpbin.org/json
したときに得られる結果と同じものが表示されました。
もしかしたら環境によってはCのコンパイラやcurl/curl.h
を見れるようにするためにsomethingのインストールが必要になるかもしれません。
私はmacOSを使っていまして、Command line tools for Xcodeをインストールしています。
このへんで事足りたのだとおもいます。
Wrapping up 



Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
今回は、mix_install_examplesの中から、c_libcurl.exsをご紹介をしました。
今後も他のサンプルをご紹介していきます。
また、シンプルでいい例をおもいついたら、プルリクを送ってみるのはいいかもしれません。
私は、おもいついた場合には、プルリクを送ってみる気でいます
以上です。
I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.
We Are The Alchemists, my friends!