タイトル: Genie
SEOタイトル: Julia Genie.jl 入門 — Rails ライク Web フレームワーク完全ガイド
| この記事の要点 |
|
Genie.jl とは
Genie は Julia 言語向けの フルスタック Web フレームワーク です。Ruby on Rails や Django の設計思想を Julia 流に落とし込み、データサイエンスのモデルを Web アプリ化することに強みがあります。
機械学習モデルの予測結果を Web API として公開したり、Plots.jl のグラフをリアクティブにダッシュボード化したりするケースで広く採用されています。
インストールと最初のアプリ
# Julia REPL で
using Pkg
Pkg.add("Genie")
# 新規アプリ生成
using Genie
Genie.Generator.newapp("MyApp")
# → MyApp/ ディレクトリが作られ自動で起動
# 起動 (既存プロジェクト)
cd("MyApp")
using Genie
Genie.loadapp()
Genie.up() # デフォルト http://127.0.0.1:8000
ディレクトリ構造
| パス | 役割 |
|---|---|
routes.jl | ルーティング定義 |
app/resources/ | Controller / Model / View |
app/layouts/ | 共通レイアウト HTML |
config/ | 環境設定 (dev / prod / test) |
public/ | 静的ファイル (CSS / JS / 画像) |
db/migrations/ | DB マイグレーション |
bin/ | server / repl 起動スクリプト |
ルーティング
# routes.jl
using Genie.Router
route("/") do
"Hello, Genie!"
end
route("/hello/:name") do
name = params(:name)
"Hello, $(name)!"
end
# GET / POST 明示
route("/items", method = POST) do
title = postpayload(:title)
"Created: $title"
end
# JSON レスポンス
using Genie.Renderer.Json
route("/api/users") do
json([Dict("id" => 1, "name" => "Alice")])
end
Controller
# app/resources/users/UsersController.jl
module UsersController
using Genie.Renderer.Html
function index()
users = [Dict("id" => 1, "name" => "Alice"),
Dict("id" => 2, "name" => "Bob")]
html(:users, :index, users = users)
end
function show()
id = params(:id)
html(:users, :show, id = id)
end
end
# routes.jl
using UsersController
route("/users", UsersController.index)
route("/users/:id", UsersController.show)
View (Flax テンプレート)
HTML テンプレートは Julia コードを <% %> で埋め込む形式です。
<!-- app/resources/users/views/index.jl.html -->
<h1>ユーザー一覧</h1>
<ul>
<% for user in users %>
<li><a href="/users/<%= user["id"] %>"><%= user["name"] %></a></li>
<% end %>
</ul>
ORM: SearchLight.jl
Active Record 風の ORM パッケージです。
using SearchLight, SearchLight.SQLite
# モデル定義
@kwdef mutable struct User <: AbstractModel
id::DbId = DbId()
name::String = ""
email::String = ""
end
# マイグレーション
import SearchLight.Migrations: create_table, column
function up()
create_table(:users) do
[
column(:id, :primary_key)
column(:name, :string)
column(:email, :string)
]
end
end
# クエリ
all_users = SearchLight.all(User)
user = SearchLight.findone(User, name = "Alice")
alice = User(name = "Alice", email = "a@example.com")
SearchLight.save!(alice)
Stipple.jl: リアクティブ UI
Vue.js を裏で動かしつつ Julia 側でモデルを宣言する仕組みです。ダッシュボードを少ない行数で構築できます。
using Genie, Stipple, StippleUI, StipplePlotly
@app begin
@in number_of_points = 100
@out plot_data = []
@onchange number_of_points begin
plot_data = [PlotData(
x = 1:number_of_points,
y = rand(number_of_points),
mode = "lines"
)]
end
end
function ui()
[
slider(1:1000, :number_of_points)
plot(:plot_data)
]
end
@page("/", ui)
Genie.up()
Rails / Django との比較
| 項目 | Genie (Julia) | Rails (Ruby) | Django (Python) |
|---|---|---|---|
| 得意分野 | データ科学 / 数値計算 | 業務 Web 全般 | 業務 Web / ML 周辺 |
| ORM | SearchLight.jl | ActiveRecord | Django ORM |
| テンプレート | Flax / Markdown | ERB / HAML | Django Templates |
| リアクティブ | Stipple.jl | Hotwire | HTMX (外部) |
| 速度 | 非常に速い (JIT) | 中 | 中 |
| エコシステム | 小〜中 | 非常に大きい | 非常に大きい |
本番デプロイ
# 環境変数
export GENIE_ENV=prod
export PORT=8000
export HOST=0.0.0.0
# 起動
julia --project bin/server
# Docker
FROM julia:1.10
WORKDIR /app
COPY . .
RUN julia --project -e 'using Pkg; Pkg.instantiate()'
CMD ["julia", "--project", "bin/server"]
FAQ
Q: Julia 初学者でも Genie で Web 開発できる?
A: 可能。基本構文 (関数定義 / モジュール) と Pkg の使い方を理解していれば、Rails 経験者なら数日でキャッチアップできます。
Q: 大規模本番運用に耐える?
A: Genie 自体は Rails / Django ほど枯れてはいませんが、機械学習モデル提供 API や中規模ダッシュボードでは十分採用されています。
Q: Python の Flask との比較は?
A: Flask は最小フレームワーク、Genie はフルスタック。データ計算速度・型推論で Julia が優位、エコシステムは Python 圧勝。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。
