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


７～８年前にerlang触ったっきり、久々にさわったというレベルなので間違い色々あるかと思います。

変数に再代入できるの！？っていうのが久々にさわって驚いたトコ（実際は再定義？みたいな感じらしいですが）
でも、いろいろ便利に使えるようになってるなと感じます。

## 環境関連
### releaseすると動かない（raspberry pi 4Bに環境作ったとき）

* インストール手順が適当すぎただけかも。。。
* `Elixir.Calendar.ISOがなんとか`ってエラーがいっぱい出た。
* Elixir のcompled with Erlang/OTP xxとErlang/OTP xxのバージョンが違う

``` bash
$ 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)
```

→　ソースからビルドし直し　→　[ここを参考](https://qiita.com/takasehideki/items/210f8a7172807d0c9e5b)

``` bash
$ 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
```

``` bash
$ 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](https://ninenines.eu/docs/en/cowboy/2.2/manual/cowboy_req.reply/)
    + `req2 = :cowboy_req.reply(200,headers, body, req)`
    + 戻り値はタプルではないらしい。

### Elixir 1.11.0-devになってからの問題か？
開発版だけれども、[非推奨](https://hexdocs.pm/elixir/master/compatibility-and-deprecations.html)になっているものは見直したほうが良い気がする。

1. Supervisor.Spec.worker/3が非推奨に変わった
	* workerを使わない→[hexdocs](https://hexdocs.pm/elixir/master/Supervisor.html)
	  + GenServerを使うモジュールつくって、Supervisorで呼び出してねって感じ。かな？

1. Logger.info("")がワーニング
	* `will never return since it differs in the 2nd argument from the success typing arguments`
		+ 第2引数が関数じゃないといかんと…
		+ これは正式リリースでは起きないと思うが解決策

``` ex
Logger.info(fn() -> "" end)
#みたいに匿名関数化。しょっちゅう出てくるので
def info(arg) do
  fn() -> arg end
  |> Logger.info
end
#みたいに関数化してもよいかも。
```

### LoggerのConfigの書き方が変わったっぽい

``` exs
# Elixir 1.10まで
# config :logger, level: :info
# Elixir 1.11.0-dev
config :logger,
 compile_time_purge_matching: [
   [level_lower_than: :info]
 ]
 ```

* Configモジュール自体も変わるらしい
    + use Mix.Config（[非推奨](https://hexdocs.pm/mix/Mix.Config.html)）
    + import Config（[置き換え](https://hexdocs.pm/elixir/master/Config.html)）

### ドキュメント関係の整理
最初にサンプルみて勘違い。みんなすると思うんだ…

``` ex
@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いれてますが。