7~8年前にerlang触ったっきり、久々にさわったというレベルなので間違い色々あるかと思います。
変数に再代入できるの!?っていうのが久々にさわって驚いたトコ(実際は再定義?みたいな感じらしいですが)
でも、いろいろ便利に使えるようになってるなと感じます。
環境関連
releaseすると動かない(raspberry pi 4Bに環境作ったとき)
- インストール手順が適当すぎただけかも。。。
-
Elixir.Calendar.ISOがなんとか
ってエラーがいっぱい出た。 - Elixir のcompled with Erlang/OTP xxとErlang/OTP xxのバージョンが違う
$ elixir --version
Erlang/OTP 22 [erts-10.7] [source] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Elixir 1.10.0 (62db05d) (compiled with Erlang/OTP 21)
→ ソースからビルドし直し → ここを参考
$ sudo apt install m4 libncurses5-dev libssl-dev
$ wget http://erlang.org/download/otp_src_22.3.tar.gz
$ tar xzvf otp_src_22.3.tar.gz
$ cd otp_src_22.3/
$ ./configure --enable-hipe
$ make
$ sudo make install
$ cd ../
$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir/
$ make clean test
$ sudo make install
$ elixir --version
Erlang/OTP 22 [erts-10.7] [source] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Elixir 1.11.0-dev (62db05d) (compiled with Erlang/OTP 22)
これで解決。
port:80(wellknown port)が使えない
これはlinux/debianならこんな感じで。。。かなぁ。
- ケーパビリティを設定
sudo setcap 'cap_net_bind_service=+ep' /path/to/program
- elixirの場合
sudo setcap 'cap_net_bind_service=+ep' WORKING_DIRECTORY/_build/prod/rel/{release-name}/erts-{...version}/bin/beam.smp
warningがいっぱい
ネットにころがってるサンプルみながら作ると、いろいろ怒られました。
cowboy_req.replyの戻りが、よくあるサンプルとちがう
-
ネットにころがってるサンプル(__cowboy 1.x__系はこれで正解)
{:ok, resp} = :cowboy_req.reply(200,headers, body, req)
-
これから使うなら__cowboy 2.x__系かなninenines.eu
req2 = :cowboy_req.reply(200,headers, body, req)
- 戻り値はタプルではないらしい。
Elixir 1.11.0-devになってからの問題か?
開発版だけれども、非推奨になっているものは見直したほうが良い気がする。
-
Supervisor.Spec.worker/3が非推奨に変わった
- workerを使わない→hexdocs
- GenServerを使うモジュールつくって、Supervisorで呼び出してねって感じ。かな?
- workerを使わない→hexdocs
-
Logger.info("")がワーニング
-
will never return since it differs in the 2nd argument from the success typing arguments
- 第2引数が関数じゃないといかんと…
- これは正式リリースでは起きないと思うが解決策
-
Logger.info(fn() -> "" end)
#みたいに匿名関数化。しょっちゅう出てくるので
def info(arg) do
fn() -> arg end
|> Logger.info
end
#みたいに関数化してもよいかも。
LoggerのConfigの書き方が変わったっぽい
# Elixir 1.10まで
# config :logger, level: :info
# Elixir 1.11.0-dev
config :logger,
compile_time_purge_matching: [
[level_lower_than: :info]
]
ドキュメント関係の整理
最初にサンプルみて勘違い。みんなすると思うんだ…
@doc """
サンプル~みたいなやつ
"""
こんなん、単純な複数行コメントだと思うって…
-
@moduledoc
- モジュールの説明
-
false
でプライベートモジュール化
-
- モジュールの説明
-
@doc
- 関数の説明
-
false
にしても呼び出し可能
-
- 関数の説明
-
@impl
- コールバック実装時のコールバック元モジュールの明示化
困りながらも、ちょっと作ってみた感想
楽!
erlangを生で触るより、かなり楽。
erlangはとても面白いのですが、とっつきにくい!
それに、ライブラリ揃える。ドキュメント書く、実行・リリースする。
っていうのが楽になってるなーというのが感想。
おまけ
vsCodeに入れたExtension
- local
- Remote-SSH
- Raspberry piにつないで開発用
- Remote-Containers
- DockerにRaspberryPiと同じelixir環境作って開発用
- Remote-SSH
- remote
- ElixirLS
- vscode-elixir
vsCode + Elixirは
昔の、vi + コンソールとは比べ物にならんほど楽になってるね!
ま、vsCodeにvim Extensionいれてますが。