4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに: Elixirの紹介

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

第1章: Elixirの基本概念

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

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

Hello.world()

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

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のプロセスモデルを利用しており、軽量で効率的です。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# ルーティング設定 (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を生成します。ビューはテンプレートにデータを渡す役割を果たします。

# テンプレートの作成 (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を構築できます。

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

# チャットルームの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操作を紹介します。

# ファイルへの書き込み
{: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を使った基本的なスクレイピングの例を紹介します。

# 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をエンコードおよびデコードする方法を紹介します。

# 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の強力な並行処理機能を利用して、複数のタスクを同時に実行する方法を紹介します。

# 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を活用するための一助となれば幸いです。

4
0
0

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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?