初心者から始めるElixirチュートリアル

## はじめに: Elixirの紹介

Elixir（エリクサー）は、2012年にJosé Valimによって開発された関数型プログラミング言語です。Erlangの仮想マシンであるBEAMの上に構築されており、高い並行性と柔軟性を提供します。Elixirは、並行処理や分散システムに特化しており、リアルタイムアプリケーションの開発に最適です.

## 第1章: Elixirの基本概念

Elixirは関数型プログラミングの概念を採用しており、コードの可読性やバグの削減に寄与します。ここでは、Elixirの基本的な構文とデータ型について説明します。

```elixir
# 基本的なElixirコード例
defmodule Hello do
  def world do
    IO.puts "こんにちは、世界！"
  end
end

Hello.world()
```

## 第2章: パターンマッチングと制御構造

Elixirの強力な機能の一つにパターンマッチングがあります。これにより、データの構造を簡単に操作できます。

```elixir
# パターンマッチングの例
{a, b} = {1, 2}
IO.puts a  # 出力: 1
IO.puts b  # 出力: 2

# 制御構造の例
case {1, 2, 3} do
  {1, x, 3} -> IO.puts "xは#{x}です"
  _ -> IO.puts "マッチしませんでした"
end
```

## 第3章: 並行処理とプロセス

Elixirの並行処理は、Erlangのプロセスモデルを利用しており、軽量で効率的です。

```elixir
# プロセスの生成とメッセージ送信
pid = spawn(fn -> 
  receive do
    message -> IO.puts "メッセージ: #{message}"
  end
end)

send(pid, "こんにちは、プロセス！")
```

## 第4章: ElixirとErlangの相互運用性

ElixirはErlangのライブラリをそのまま利用できるため、既存のErlangコードを活用することができます。

```elixir
# ErlangのモジュールをElixirで利用
:crypto.hash(:sha256, "Elixir")
```

## 第5章: Elixirのプロジェクト構造

Elixirプロジェクトは、Mixというビルドツールを使用して管理されます。Mixを使うことで、依存関係の管理やテストの実行が簡単になります。

```bash
# 新しいプロジェクトの作成
mix new my_project

# プロジェクトディレクトリに移動
cd my_project

# プロジェクトの構造
# my_project/
# ├── lib/
# ├── test/
# ├── mix.exs
```

## 第6章: Phoenixフレームワークの紹介

PhoenixはElixirのためのWebフレームワークで、高速なリアルタイムアプリケーションの開発を可能にします。

```bash
# Phoenixプロジェクトの作成
mix phx.new my_phoenix_app

# サーバーの起動
cd my_phoenix_app
mix phx.server
```

## 第7章: Phoenixのルーティングとコントローラー

Phoenixのルーティングは、リクエストを適切なコントローラーアクションにマッピングします。ここでは、基本的なルーティングとコントローラーの設定を紹介します。

```elixir
# ルーティング設定 (lib/my_phoenix_app_web/router.ex)
scope "/", MyPhoenixAppWeb do
  pipe_through :browser

  get "/", PageController, :index
end

# コントローラーの定義 (lib/my_phoenix_app_web/controllers/page_controller.ex)
defmodule MyPhoenixAppWeb.PageController do
  use MyPhoenixAppWeb, :controller

  def index(conn, _params) do
    render(conn, "index.html")
  end
end
```

## 第8章: Phoenixのテンプレートとビュー

Phoenixでは、EExテンプレートを使用してHTMLを生成します。ビューはテンプレートにデータを渡す役割を果たします。

```elixir
# テンプレートの作成 (lib/my_phoenix_app_web/templates/page/index.html.eex)
<h1>ようこそ、<%= @name %>さん！</h1>

# ビューの定義 (lib/my_phoenix_app_web/views/page_view.ex)
defmodule MyPhoenixAppWeb.PageView do
  use MyPhoenixAppWeb, :view
end

# コントローラーでビューにデータを渡す
def index(conn, _params) do
  render(conn, "index.html", name: "太郎")
end
```

## 第9章: Phoenixのリアルタイム機能とLiveView

Phoenixのリアルタイム機能は、WebSocketを使用してクライアントとサーバー間の双方向通信を可能にします。Phoenix LiveViewを使用すると、JavaScriptなしでリアルタイムのインタラクティブなUIを構築できます。

```elixir
# LiveViewのセットアップ (lib/my_phoenix_app_web/live/counter_live.ex)
defmodule MyPhoenixAppWeb.CounterLive do
  use Phoenix.LiveView

  def mount(_params, _session, socket) do
    {:ok, assign(socket, :count, 0)}
  end

  def handle_event("increment", _value, socket) do
    {:noreply, update(socket, :count, &(&1 + 1))}
  end

  def render(assigns) do
    ~L"""
    <div>
      <h1>カウント: <%= @count %></h1>
      <button phx-click="increment">増加</button>
    </div>
    """
  end
end

# ルーティングにLiveViewを追加 (lib/my_phoenix_app_web/router.ex)
live "/counter", CounterLive
```

## 第10章: Phoenixの実際の使用例: チャットアプリケーション

Phoenixを使用して、リアルタイムチャットアプリケーションを構築する例を紹介します。このアプリケーションでは、ユーザー間でメッセージをリアルタイムで送受信できます。

```elixir
# チャットルームのLiveView (lib/my_phoenix_app_web/live/chat_room_live.ex)
defmodule MyPhoenixAppWeb.ChatRoomLive do
  use Phoenix.LiveView

  def mount(_params, _session, socket) do
    {:ok, assign(socket, :messages, [])}
  end

  def handle_event("send_message", %{"message" => message}, socket) do
    {:noreply, update(socket, :messages, &[message | &1])}
  end

  def render(assigns) do
    ~L"""
    <div>
      <h1>チャットルーム</h1>
      <ul>
        <%= for message <- @messages do %>
          <li><%= message %></li>
        <% end %>
      </ul>
      <form phx-submit="send_message">
        <input name="message" type="text" placeholder="メッセージを入力" />
        <button type="submit">送信</button>
      </form>
    </div>
    """
  end
end

# ルーティングにチャットルームを追加 (lib/my_phoenix_app_web/router.ex)
live "/chat", ChatRoomLive
```

## 第11章: ElixirによるファイルI/O操作

Elixirでは、ファイルの読み書きが簡単に行えます。ここでは、基本的なファイルI/O操作を紹介します。

```elixir
# ファイルへの書き込み
{:ok, file} = File.open("example.txt", [:write])
IO.binwrite(file, "こんにちは、Elixir！")
File.close(file)

# ファイルの読み込み
{:ok, content} = File.read("example.txt")
IO.puts("ファイル内容: #{content}")
```

## 第12章: ElixirによるWebスクレイピング

ElixirでWebスクレイピングを行うには、HTTPクライアントとHTMLパーサーを使用します。ここでは、HTTPoisonとFlokiを使った基本的なスクレイピングの例を紹介します。

```elixir
# mix.exsに依存関係を追加
defp deps do
  [
    {:httpoison, "~> 1.8"},
    {:floki, "~> 0.30.0"}
  ]
end

# Webページの取得と解析
defmodule Scraper do
  def fetch_titles(url) do
    {:ok, response} = HTTPoison.get(url)
    {:ok, document} = Floki.parse_document(response.body)
    titles = Floki.find(document, "h1") |> Floki.text()
    IO.puts("ページタイトル: #{titles}")
  end
end

Scraper.fetch_titles("https://example.com")
```

## 第13章: ElixirによるJSONの操作

Elixirでは、JSONデータの操作が簡単に行えます。ここでは、Jasonライブラリを使用してJSONをエンコードおよびデコードする方法を紹介します。

```elixir
# mix.exsに依存関係を追加
defp deps do
  [
    {:jason, "~> 1.2"}
  ]
end

# JSONのエンコードとデコード
defmodule JsonExample do
  def encode_and_decode do
    data = %{name: "太郎", age: 30}
    json = Jason.encode!(data)
    IO.puts("JSON: #{json}")

    decoded = Jason.decode!(json)
    IO.inspect(decoded)
  end
end

JsonExample.encode_and_decode()
```

## 第14章: Elixirによる並行タスクの実行

Elixirの強力な並行処理機能を利用して、複数のタスクを同時に実行する方法を紹介します。

```elixir
# Taskを使用した並行処理
defmodule ConcurrentTasks do
  def run_tasks do
    task1 = Task.async(fn -> perform_task("タスク1") end)
    task2 = Task.async(fn -> perform_task("タスク2") end)

    Task.await(task1)
    Task.await(task2)
  end

  defp perform_task(name) do
    IO.puts("#{name}を実行中...")
    :timer.sleep(1000)
    IO.puts("#{name}が完了しました")
  end
end

ConcurrentTasks.run_tasks()
```

## 第15章: まとめと次のステップ

Elixirの多様な機能を活用することで、ファイル操作やWebスクレイピング、JSON操作、並行処理など、さまざまなタスクを効率的に実行できます。次のステップとして、これらの技術を組み合わせて、より複雑なアプリケーションを開発し、Elixirの可能性をさらに探求してみましょう。

---

この記事を通じて、Elixirの実用的な機能を学び、日本の開発者がElixirを活用するための一助となれば幸いです。