LoginSignup
37
32

More than 5 years have passed since last update.

【個人メモ】julia製Web Application Framework "Morsel"を試す

Posted at

julia

ここのところ、朝活と称してスバタやタリーズでドヤ顔をしつつ、
エンターキーを押す活動を行っている。
朝8時30分から9時30分まで。だいたい1時間弱。

今日は何をしようかな、と思ってネタ探ししていた。
そういえばjulia触れてないなあとふと思った。

スクリーンショット 2014-05-23 14.24.11.png

...よくわかってないので、簡単なWeb Application Frameworkをいじることで
体験しようかなと考えた。

julia?

Good performance, approaching that of statically-compiled languages like C
と書かれている。

パフォーマンスチェックを自分でやったわけではないけど。
他人の意見によると速くてイケてるのでどっか(機械学習分野)で流行り始めてるとのこと[要出典]

公式サイトのパフォーマンス比較を見ると、Fortranといい勝負だ。

スクリーンショット 2014-05-23 14.31.45.png

自分は試していないのだが、Pythonの関数も呼び出せる。

juliaのインストール

Mac OS Xであるなら、野良Formulaを利用してインストールする。

詳しくはREADME.mdを参考のこと。

エディタでコードハイライトさせたい

vim使ってる。探してみたらあった。

NeoBundleを使ってインストールをする。

~/.vimrc
NeoBundle 'JuliaLang/julia-vim'
vim +NeoBundleInstall +qall

コードハイライトの確認

問題なし。

スクリーンショット 2014-05-23 14.45.20.png

WAF Morsel

julia web frameworkでググってでてきたMorselをいじることにした。

sinatra likeなWeb Application Frameworkとのこと。

MeddleやHTTPServerなどの
ライブラリを利用しているようだ。

https://github.com/JuliaLang/Meddle.jl
https://github.com/JuliaLang/HttpServer.jl

インストール

julia REPLを立ちあげ、コマンドを打ち込んで
Morselをインストールする。

スクリーンショット 2014-05-23 8.46.45.png

…インストールが始まるのだけど、これは楽だなあ

早速Morselを利用してアプリを書いてみる。

アプリケーションの実行

MorselのREADME.mdにあるサンプルコードをそのまま書いて実行する。

test.jl
using Morsel

app = Morsel.app()

route(app, GET | POST | PUT, "/") do req, res
  "This is the root"
end

get(app, "/about") do req, res
  "This app is running on Morsel"
end

start(app, 8000)

このファイルをtest.jlとして保存して、

julia test.jl

という形で起動すれば良い。

スクリーンショット 2014-05-23 9.02.44.png

ブラウザでアクセスしてみる。

スクリーンショット 2014-05-23 9.04.25.png

スクリーンショット 2014-05-23 9.05.00.png

うむ。起動している。

テンプレートエンジン使いたい

テンプレートエンジンを利用して組み込んでみるか…

template engineはMustache.jlを利用する

口ひげさん、色々な言語に対して移植されてるんだな。

Mustacheのインストール

MorselのようにREPLを使ってインストール。

スクリーンショット 2014-05-23 9.07.00.png

組み込み

以下の様な形でソースを書く。

test2.jl
using Morsel
using Mustache

app = Morsel.app()

tpl = mt"Welcome to {{message}}."

route(app, GET | POST | PUT, "/") do req, res
  "This is the root"
end

get(app, "/<message>") do req, res
  render(tpl, {"message" => req.state[:route_params]["message"]})
end

start(app, 8000)

動作チェック

動かしてみる。

julia test2.jl

スクリーンショット 2014-05-23 13.58.07.png

スクリーンショット 2014-05-23 13.58.28.png

Morselで困ったこと

…Morselのspec.jlでは、
req.resources[:parameter] でパスが取れるような記述があるのだが、

spec.jl#L14
# Route with URL vars
route(app, "/hello/<id::Int>/<name::%[a-z]{3}[0-9]{2}>") do req, res
    req.resources[:id] == 99 ? string("Go to hell ", req.resources[:name]) : string("Hello ", req.resources[:name])
end

spec.jlのように書くとキーが存在しないと怒られてしまう。

例えば、以下の感じで書くと...

get(app, "/<message>") do req, res
  render(tpl, {"message" => req.resources[:message]})
end

スクリーンショット 2014-05-23 14.05.23.png

こうなる。キーが見つからない。

結局、コードを読んで
res.stateに:route_paramsに対してパスを突っ込んでるのが
わかったのでそれを利用するようにした。

その他

Qiita、juliaのコードハイライト対応してた。

37
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
32