1.

Julia Genie.jl 入門 — Rails ライク Web フレームワーク完全ガイド

編集
この記事の要点
  • Genie.jl は Julia 製の フルスタック Web フレームワーク。Rails / Django にインスパイア
  • インストール: using Pkg; Pkg.add("Genie")、起動: Genie.up()
  • MVC 構造: routes.jl / Controller / View (Flax / Markdown / HTML)
  • ORM は SearchLight.jl (Active Record 風)、リアクティブ UI は Stipple.jl
  • ホットリロード / WebSocket / API ジェネレータ / Docker 対応で本番運用可能

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 コードを <% %> で埋め込む形式です。


ユーザー一覧

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 周辺
ORMSearchLight.jlActiveRecordDjango ORM
テンプレートFlax / MarkdownERB / HAMLDjango Templates
リアクティブStipple.jlHotwireHTMX (外部)
速度非常に速い (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 圧勝。

編集
Post Share
子ページ
  1. インストール
  2. アプリケーションの作成
  3. エラー一覧
  4. ローカルのウェブアプリケーションサーバーの起動方法
  5. アプリケーションのロード
  6. コントローラーの作成と基本
同階層のページ

同階層のページはありません