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自体の挙動についてはかなり詳しくなりましたし、大規模アプリは少人数開発すると地獄を生むんだなと改めて実感しました。