初心者によるElixir入門①

## はじめに

筆者はphp・ruby/railsの経験があります
ruby/railsを触っている人は比較的Elixirは取っ付きやすいと聞いていましたが
最近仕事でElixirを使うことになりましたので初心者ながらに入門メモです
Elixirを入門しようと思いwebなどで調べても英語ばかりでドキュメントやサンプル、日本語の記事や情報が少なく他の言語と比べると少し取っ付きずらいと思った方も多いかもしれません
筆者もその一人で現在Elixirの勉強中で少しでも参考になればとこちらで記事にまとめていきます
（記事で間違い等ございましたら、コメントで教えていただけますと助かります）

## Elixirとは

Elixir（エリクサー）は、Erlangプログラミング言語の仮想マシン（BEAM）上で動作する関数型プログラミング言語です
Jose Valimによって開発され、2011年に初めて公開されました
ElixirはErlangの強力な並行処理と分散処理の機能を継承しており、同時に構文がシンプルで直感的な特徴を持っています
Elixirは並行処理、分散処理、耐障害性に優れたシステムの開発に適しており、特に通信基盤、リアルタイムシステム、分散データベースなどの領域で広く利用されています

## Elixirの特徴
・**関数型プログラミング**
    Elixirは関数型プログラミングの原則に基づいています。不変性（immutability）や高階関数、再帰など、関数型プログラミングの概念が取り入れられています
    
・**並行処理と分散処理**
    ErlangのVM（BEAM）によって提供される強力な並行処理と分散処理機能を利用できます。これにより、大規模かつ高い信頼性が要求されるシステムの構築が得意です
    
・**拡張性と保守性**
    ElixirはErlangのメタプログラミング機能を利用しており、動的なコード生成やマクロの使用が可能です。これにより、柔軟で拡張性の高いコードを書くことができます

・**Phoenixフレームワーク**
    ElixirはWebアプリケーションを開発するための強力なフレームワークであるPhoenixをサポートしています。Phoenixは高いパフォーマンスと使いやすさを備えており、ElixirによるWeb開発を効果的にサポートします

・**パターンマッチング**
    Elixirは強力なパターンマッチング機能を提供しており、コードをよりシンプルで明瞭に書くことができます

## ErlangからElixirへ

Erlang（アーラン）は、Ericsson（エリクソン）社が開発したプログラミング言語で、主に通信システムや分散システム向けに設計されています
Erlangは以下の特徴があります
「並行処理と分散処理・独自のプロセスモデル・不変性（Immutability）と関数型プログラミング・パターンマッチング・耐障害性」
Erlangは通信機器や大規模な分散システム、リアルタイムおよび高可用性を求められるアプリケーションの開発に特に適しています

とこのようにErlangの説明を簡単にしましたが、前提としてErlangがありそして特性を受け継ぎ、よりシンプルな構文を提供しているElixirと繋がります


## Elixirのサービスへの繋がり

Elixirを使っている有名なサービスの一つがDiscordです
DiscordではElixirを一部で使用しているようで、特にリアルタイムなチャットや通知など、高い並行処理性能が必要な機能にElixirが使われているようです


また調べてみると他サービスでもElixirは他の言語と組み合わせて使われている印象があり、部分的にElixirの強みを活かしたリアルタイム周りの実装や並行処理性能を活かした機能などをElixirは実装してそれ以外web側やアプリ側は別の言語と組み合わせて使われいるのが多い言語なのかと印象を受けました
余談ですが筆者もDiscordを使っており、Elixirを使っているサービスを調べている時にDiscordと聞き凄く腑に落ちました、Discord以外だと筆者は知っているサービスが無く今後流行るサービスの裏側ではリアルタイム周りではElixirつかってますみたいなのが増えそうだなと思いました

## Elixirの入門として

公式ドキュメント
https://hexdocs.pm/elixir/1.16/introduction.html

Elixir School
https://elixirschool.com/ja/

Programming Elixir
https://pragprog.com/titles/elixir16/programming-elixir-1-6/

プログラミング Elixir(第2版)
https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Elixir-%E7%AC%AC2%E7%89%88-Dave-Thomas/dp/4274226379

上記がElixirの入門としておすすめになります
筆者は日本語で読める「Elixir School」と「プログラミング Elixir(第2版)」で学んでいます

## コミュニティ
Elixir Forum
https://elixirforum.com/

Slack
https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd%7Ew

Elixirで困ったらとりあえずSlack workspaceに参加すると助けになるかもしれません

# 実践
前置きが長くなりました
次から実際にElixirをインストールして軽く動かしてみましょう

## 1. インストール

最新のバージョンは公式サイトからご確認ください
https://elixir-lang.org/

Macでbrewを使ってインストールする例です

```bash
# Elixirのインストール（Mac）
brew install elixir

# インストール後バーション確認
elixir -v
```

## 2. 対話モード(iex)

ElixirにはIExという対話シェルが付属しています
コンソール上で関数の呼び出しや処理の実行などができ大変便利です

railsを使ったことのある人はrails consoleみたいな物と言うとしっくりくると思います

```bash
# ターミナルから「iex」を実行してコンソールを起動
$ iex
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit] [dtrace]

Interactive Elixir (1.15.7) - press Ctrl+C to exit (type h() ENTER for help)
iex>
```

※iexを終了するには、Ctrl+Cを2回押してください

## 3. iexを触ってみる

**・変数代入や計算**
```elixir
iex> x = 10
10

iex> x
10

iex> x + 5
15

iex> x / 2
5.0
```
コンソール上で変数の代入や計算など実行確認できます

**・関数の呼び出し**
```elixir
iex> IO.puts "Hello, Elixir!"
Hello, Elixir!
:ok

iex> String.length "Hello, Elixir!"
14
```
コンソール上でElixirの組み込み関数を呼び出せます
（自分で定義した関数も同様です）

**・ヘルプの表示**
```elixir
iex> h String.length

                               def length(string)

  @spec length(t()) :: non_neg_integer()

Returns the number of Unicode graphemes in a UTF-8 string.

## Examples

    iex> String.length("elixir")
    6

    iex> String.length("եոգլի")
    5
```
h 関数名コマンドで関数に関するヘルプを表示できます

## 4. 基本的な構文
Elixirの構文はRubyと非常に似ています
Rubyを触ったことのある人取っ付きやすいと思います

```elixir
# 変数の宣言
name = "Elixir"

# 関数の定義
defmodule Test do
  def hello(name) do
    IO.puts "Hello, #{name}!"
  end
end

# モジュールの使用
Test.hello(name)
```

上記の例を実際にiexで動かしてみましょう
iexを起動後に丸っとコピペで大丈夫です
```elixir
iex(1)> name = "Elixir"
"Elixir"
iex(2)> defmodule Test do
...(2)>   def hello(name) do
...(2)>     IO.puts "Hello, #{name}!"
...(2)>   end
...(2)> end
{:module, Test,
 <<70, 79, 82, 49, 0, 0, 6, 84, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 236,
   0, 0, 0, 24, 12, 69, 108, 105, 120, 105, 114, 46, 72, 101, 108, 108, 111, 8,
   95, 95, 105, 110, 102, 111, 95, 95, 10, ...>>, {:hello, 1}}
iex(3)> Test.hello(name)
Hello, Elixir!
:ok
```

## まとめ
長くなってしまったので初回はここまでにします、次回は筆者も？となったElixirの特徴的なパターンマッチング周りをやろうかと思います
他にもElixirを使う上でPhoenixフレームワークなど深く関わってきますので
Phoenixでwebサイト作るぐらいまで筆者も学習進めそこまで記事にまとめていけるように頑張りたいと思います

今回色々調とElixirのことを調べてみましたが、それまでは流行り始めてきた言語かなーぐらいの印象でした
しかし調べていると実はDiscordで使われているとか他の言語とは違いElixirならでは強みがあるので今後Elixirの活用も増えていきそうな印象を受けました