Genieのメモ

JuliaのWebアプリケーションフレームワークGenieを試しに使って、最低限動くところを確認した後、諦めたのでそのメモ

ちなみに、挫折したprjはこれ

概要

  • Scaffold
    • 構築
    • View
    • Controller
    • Model
    • Routing
  • 挫折ポイント

構築

GenieはWeb applicationのフレームワークです。 ruby on railsのようなものです。

Scaffold自体の作成は

Genie.REPL.new_app("your_cool_new_app")

でできます. この時は,ここをコピーしているようです。

webアプリを起動する場合は以下のファイルをjulia samp.jl で起動すればいいです。

using Genie
import Genie.Router: route
fpath = "."
# ファイルパス
Genie.REPL.load_app(fpath)
Genie.config.run_as_server = true

route("/hello") do
  "Hello world!"
end

using Sampapp

# 0.0.0.0を指定しないとDockerでは動作しない
Genie.AppServer.startup(8000, "0.0.0.0")

Model

  • データベースの作成 REPL側で以下をする.
SearchLight.Generator.new_resource("Question")

これでmigrationファイルができる. migrationファイルを以下のように編集する.

module CreateTableQuestions

import SearchLight.Migrations: create_table, column, primary_key, add_index, drop_table

function up()
  create_table(:questions) do
    [
      primary_key()
      column(:question, :string)
      column(:author, :string)
    ]
  end

  add_index(:questions, :column_name)
end

function down()
  drop_table(:questions)
end

end
SearchLight.Migration.last_up()

で起動する.

モデルファイルの名前はテーブル名の複数形 - カラムの設定

  ### FIELDS
  id::DbId
  question::String
  author::String

  ### VALIDATION
  validator::ModelValidator
  • データの保存
Question(question = b[2], author = b[3]) |> SearchLight.save!
  • データベースの設定
dev:
  adapter: SQLite
  database: db/ask.sqlite
  host:
  username:
  password:
  port:
  config:

Controller

module QuestionsController

using Genie.Renderer
using Genie.Router
using SearchLight, Questions

function new()
  html!(:questions, :new)
end

function create()
  Question(question = @params(:question_precise), author = @params(:question_author)) |> save 
  redirect_to(:questions) 
end

function delete(id::Integer)
  SearchLight.delete(SearchLight.find_one!!(Question, id))
  redirect_to(:questions) 
end

function index()
  """
  :questions : questions resource(dir) 
  :questiontop: name of viewfile, questiontop.jl.html
  questions: @var :questions in jl.html
  """
  html!(:questions, Symbol("questiontop.jl.html"), questions = SearchLight.all(Question))
end

end # module

View

$(question.question)questionテーブルの question カラムの値

挫折ポイント

せっかく、ちゃんと動くとこまで確認したが、これ以上はもう限界だと思って諦めることにした。 具体的につらかったのは理由を一つずつあげていく

  • Genieが普通にひどいバグで起動しなかった時がある。
    • logに関するパスが設定がミスして、動かない等、本番環境で使うには課題も多数ある状態であった。

Genieをロードした段階で以下のエラーが出た。

  ERROR: LoadError: LoadError: UndefVarError: log_path! not defined
Stacktrace:
 [1] getproperty at ./sysimg.jl:13 [inlined]
 [2] load() at /Users/take/go/src/github.com/chaspy/ask/volume/samp_app/src/App.jl:204
 [3] top-level scope at none:0
 [4] include at ./boot.jl:326 [inlined]
 [5] include_relative(::Module, ::String) at ./loading.jl:1038
 [6] include(::Module, ::String) at ./sysimg.jl:29
 [7] include(::String) at ./client.jl:403
 [8] top-level scope at none:0
  • Postgresがうまく起動しない
    • LibPQの連携がエラーになり、正しくデータを埋め込めない。
  • Herokuで公開できない。
    • いろいろ課題があったが、そのままだとJuliaのPackageを読み込めず起動しない。
  • 挙動が遅い
    • 画面遷移も異様に時間がかかる。

実用にも現状耐えられず、使用感も悪かったため、挫折しました。 Julia自体はいい言語ですが、Web appのようにあまりなれていないものを使うにはとても大変でした。

ただ、この勉強で、Julia自体の挙動についてはかなり詳しくなりましたし、大規模アプリは少人数開発すると地獄を生むんだなと改めて実感しました。

// コードブロック