取り組みの背景 — Elixir/PhoenixとAntigravityが相性抜群な理由
関数型言語の中でも、近年とりわけ注目を集めているのが Elixir です。Erlang VMの上で動作するElixirは、並行処理・耐障害性・スケーラビリティに優れており、チャットやリアルタイムダッシュボードなど「常時接続」を要するアプリケーションにきわめて適しています。そのElixirのWebフレームワークである Phoenix が提供する LiveView は、WebSocketとサーバーサイドレンダリングを組み合わせ、JavaScriptをほぼ書かずにリアルタイムUIを実現できる画期的な技術です。
一方、Antigravity はAI補完エンジンが開発ワークフロー全体に組み込まれたAI-first IDEです。Elixirのような構文が独特の言語においても、Antigravityのインライン補完・コード生成・エラー診断機能は大きな威力を発揮します。パターンマッチングや|>パイプ演算子に不慣れな開発者でも、AntigravityのAIが文脈を理解して適切なコードを提案してくれるため、学習コストを大幅に下げることができます。
ここではAntigravityでElixir/Phoenix LiveView環境を構築し、シンプルなリアルタイムアプリを実装するまでを、ステップバイステップで解説します。
環境準備
必要なツール
- Elixir 1.16以降(OTP 26)
- Phoenix 1.7以降
- PostgreSQL 15以降(Ecto経由で使用)
- Node.js 20以降(アセットビルド用)
- Antigravity 最新版(1.20以降推奨)
Elixir/Phoenixのインストール
macOSの場合は asdf を使ったバージョン管理がおすすめです。
# asdf でElixirをインストール
asdf plugin add erlang
asdf plugin add elixir
asdf install erlang 26.2
asdf install elixir 1.16.2-otp-26
asdf global erlang 26.2
asdf global elixir 1.16.2-otp-26
# Phoenixのインストール
mix local.hex --force
mix archive.install hex phx_new --force
# バージョン確認
elixir --version
# Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:10:10] ...
# Elixir 1.16.2 (compiled with Erlang/OTP 26)AntigravityでElixir拡張機能を有効化
Antigravityを開き、Cmd+Shift+P(macOS)で コマンドパレットを呼び出し、「Extensions: Install Extensions」から ElixirLS をインストールします。インストール後、言語サーバーが起動し、AntigravityのAI補完とElixirLSの型情報が統合されます。
// .antigravity/settings.json
{
"elixirLS.fetchDeps": true,
"elixirLS.dialyzerEnabled": true,
"antigravity.ai.contextFiles": ["lib/", "test/", "config/"]
}contextFiles にプロジェクトのコアディレクトリを指定することで、AntigravityのAIがプロジェクト全体を把握し、より精度の高い補完を提供してくれます。
Phoenixプロジェクトの作成とAntigravity設定
プロジェクト作成
# LiveView有効化でプロジェクト作成
mix phx.new realtime_demo --live
cd realtime_demo
# 依存関係のインストール
mix deps.get
cd assets && npm install && cd ..
# データベース作成
mix ecto.createAntigravityでプロジェクトを開く
# Antigravityでプロジェクトを開く
antigravity .Antigravityがプロジェクトを認識すると、左側のファイルツリーに lib/realtime_demo_web/ と lib/realtime_demo/ のディレクトリが展開されます。AIはPhoenixのディレクトリ構造を理解しており、「LiveViewを追加したい」とチャットに入力するだけで、適切なモジュール骨格を生成してくれます。
ステップバイステップ: リアルタイムカウンターアプリの実装
Step 1: LiveViewモジュールの作成
Antigravityのインラインチャット(Cmd+I)を開き、次のように入力します。
「リアルタイムカウンターのLiveViewを作成してください。
+/-ボタンでカウントを増減し、全ユーザーに即座に反映されるようにしてください」
Antigravityは以下のようなコードを提案してくれます(必要に応じて手修正)。
# lib/realtime_demo_web/live/counter_live.ex
defmodule RealtimeDemoWeb.CounterLive do
use RealtimeDemoWeb, :live_view
@topic "counter"
@impl true
def mount(_params, _session, socket) do
if connected?(socket) do
# 全クライアント間でカウント状態を共有
Phoenix.PubSub.subscribe(RealtimeDemo.PubSub, @topic)
end
{:ok, assign(socket, :count, 0)}
end
@impl true
def handle_event("increment", _params, socket) do
new_count = socket.assigns.count + 1
# 全クライアントに変更を通知
Phoenix.PubSub.broadcast(RealtimeDemo.PubSub, @topic, {:count_updated, new_count})
{:noreply, assign(socket, :count, new_count)}
end
@impl true
def handle_event("decrement", _params, socket) do
new_count = max(socket.assigns.count - 1, 0)
Phoenix.PubSub.broadcast(RealtimeDemo.PubSub, @topic, {:count_updated, new_count})
{:noreply, assign(socket, :count, new_count)}
end
@impl true
def handle_info({:count_updated, new_count}, socket) do
{:noreply, assign(socket, :count, new_count)}
end
@impl true
def render(assigns) do
~H"""
<div class="flex flex-col items-center gap-6 p-12">
<h1 class="text-3xl font-bold">リアルタイムカウンター</h1>
<p class="text-6xl font-mono tabular-nums"><%= @count %></p>
<div class="flex gap-4">
<button phx-click="decrement"
class="px-6 py-3 bg-red-500 text-white rounded-lg text-xl hover:bg-red-600">
−
</button>
<button phx-click="increment"
class="px-6 py-3 bg-green-500 text-white rounded-lg text-xl hover:bg-green-600">
+
</button>
</div>
<p class="text-sm text-gray-500">
接続中の全ユーザーにリアルタイムで同期されます
</p>
</div>
"""
end
end期待する動作: 複数ブラウザタブでアクセスしてボタンを押すと、全タブのカウントが即座に更新されます。
Step 2: ルーティングの設定
# lib/realtime_demo_web/router.ex に追記
scope "/", RealtimeDemoWeb do
pipe_through :browser
live "/", CounterLive, :index
endStep 3: サーバー起動と動作確認
mix phx.server
# [info] Running RealtimeDemoWeb.Endpoint with cowboy 2.11.0 at 0.0.0.0:4000 (http)
# [info] Access RealtimeDemoWeb.Endpoint at http://localhost:4000ブラウザで http://localhost:4000 を開き、別タブやウィンドウでも同じURLを開きます。どちらかのタブで「+」ボタンを押すと、もう一方にもリアルタイムで変更が反映されることを確認できます。
LiveViewとAntigravityの組み合わせでは、このような30〜50行程度のリアルタイムUIであれば、AIチャットで要件を伝えるだけで数分以内にプロトタイプが完成します。
Dockerを使った開発環境の構築については、Antigravity × Docker — コンテナ環境での AI 支援開発ガイド も参考にしてください。コンテナ化によりElixirとPostgreSQLの環境依存を解消できます。
よくあるエラーと対処法
エラー1: (Mix) The database for RealtimeDemo.Repo couldn't be created
PostgreSQLが起動していないか、接続情報が間違っています。
# PostgreSQL起動確認
pg_ctl status -D /usr/local/var/postgresql@15
# 起動していない場合
brew services start postgresql@15
# config/dev.exs のDB設定を確認
# username: "postgres", password: "postgres", hostname: "localhost"エラー2: (UndefinedFunctionError) function Phoenix.PubSub.subscribe/2 is undefined
mix.exs の依存関係に :phoenix_pubsub が含まれていない可能性があります(Phoenix 1.7以降は通常不要ですが、古いバージョンでは明示が必要)。
# mix.exs
defp deps do
[
{:phoenix, "~> 1.7"},
{:phoenix_pubsub, "~> 2.1"}, # 明示的に追加
# ...
]
endエラー3: Antigravityがelixirファイルを認識しない
.antigravity/settings.json でファイルの関連付けを確認します。
{
"files.associations": {
"*.ex": "elixir",
"*.exs": "elixir",
"*.heex": "html-eex"
}
}応用: n8nとの連携でイベント通知を自動化する
LiveViewで捉えたリアルタイムイベント(ユーザーアクション・データ更新)を外部サービスと連携させる際は、Antigravity × n8n: AIエージェントと自動化ワークフローを連携する実践ガイド が参考になります。たとえば、カウンターが一定値に達したらSlack通知を送る、といった自動化をn8nで設定できます。
また、Antigravityの MCP Store には、Elixirプロジェクト向けのMCPサーバー(Hex.pmパッケージ検索・mix task実行など)も登録されており、開発体験をさらに向上させることができます。
まとめ
Antigravity × Elixir/Phoenix LiveViewの組み合わせは、リアルタイムWebアプリ開発に新しい可能性をもたらします。AI補完がElixirの独特な構文を支援してくれることで、関数型プログラミングの学習ハードルが下がり、LiveViewのリアルタイム機能をより素早く実装できるようになります。
- Elixir/Phoenix LIveViewはリアルタイム・高可用性アプリに最適
- AntigravityのAI補完はElixirの関数型構文もしっかりサポート
- PubSubを使えばマルチクライアント同期が数十行で実装可能
- Docker + MCP Storeを組み合わせれば開発環境の再現性も高まる
ぜひ一度、AntigravityでElixirプロジェクトを立ち上げてみてください。AIとリアクティブな関数型言語の組み合わせが、いかに開発体験を変えるかを実感していただけるはずです。