LoginSignup
17
6

More than 3 years have passed since last update.

elixirを初めてさわって困ったこと

Last updated at Posted at 2020-04-24

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になってからの問題か?

開発版だけれども、非推奨になっているものは見直したほうが良い気がする。

  1. Supervisor.Spec.worker/3が非推奨に変わった

    • workerを使わない→hexdocs
      • GenServerを使うモジュールつくって、Supervisorで呼び出してねって感じ。かな?
  2. 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]
 ]
  • Configモジュール自体も変わるらしい

ドキュメント関係の整理

最初にサンプルみて勘違い。みんなすると思うんだ…

@doc """
サンプル~みたいなやつ
"""

こんなん、単純な複数行コメントだと思うって…

  • @moduledoc
    • モジュールの説明
      • falseでプライベートモジュール化
  • @doc
    • 関数の説明
      • falseにしても呼び出し可能
  • @impl
    • コールバック実装時のコールバック元モジュールの明示化

困りながらも、ちょっと作ってみた感想

楽!
erlangを生で触るより、かなり楽。
erlangはとても面白いのですが、とっつきにくい!

それに、ライブラリ揃える。ドキュメント書く、実行・リリースする。
っていうのが楽になってるなーというのが感想。

おまけ

vsCodeに入れたExtension

  • local
    • Remote-SSH
      • Raspberry piにつないで開発用
    • Remote-Containers
      • DockerにRaspberryPiと同じelixir環境作って開発用
  • remote
    • ElixirLS
    • vscode-elixir

vsCode + Elixirは
昔の、vi + コンソールとは比べ物にならんほど楽になってるね!
ま、vsCodeにvim Extensionいれてますが。

17
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
6