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


# julia

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

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

http://julialang.org/

![スクリーンショット 2014-05-23 14.24.11.png](https://qiita-image-store.s3.amazonaws.com/0/3985/e8954095-6cef-a2b7-97d9-9d55bb65d9aa.png)

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

# julia?

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

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

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

![スクリーンショット 2014-05-23 14.31.45.png](https://qiita-image-store.s3.amazonaws.com/0/3985/8653570d-1984-6789-93c6-18002f2ad579.png)

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

https://github.com/stevengj/PyCall.jl

# juliaのインストール

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

https://github.com/staticfloat/homebrew-julia/

詳しくは[README.mdを参考](https://github.com/staticfloat/homebrew-julia/blob/master/README.md)のこと。


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

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

https://github.com/JuliaLang/julia-vim

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

```vim:~/.vimrc
NeoBundle 'JuliaLang/julia-vim'
```

```
vim +NeoBundleInstall +qall
```

## コードハイライトの確認

問題なし。

![スクリーンショット 2014-05-23 14.45.20.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2cb19616-2d08-b66e-b67d-8f5c07952298.png)


# WAF Morsel

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

https://github.com/JuliaLang/Morsel.jl

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](https://qiita-image-store.s3.amazonaws.com/0/3985/7d0f3b0b-b7bd-5c2b-970d-023f4541a0fb.png)


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

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

## アプリケーションの実行

[MorselのREADME.mdにあるサンプルコード](https://github.com/JuliaLang/Morsel.jl/blob/a350f033f5302e352ed83cfcc777a6b153f43c11/README.md)をそのまま書いて実行する。


```jl: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](https://qiita-image-store.s3.amazonaws.com/0/3985/e229f491-7bc4-837e-0be8-7168d0a78786.png)

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

![スクリーンショット 2014-05-23 9.04.25.png](https://qiita-image-store.s3.amazonaws.com/0/3985/de27e6ee-a2d4-d335-195d-ea94f74b713e.png)

![スクリーンショット 2014-05-23 9.05.00.png](https://qiita-image-store.s3.amazonaws.com/0/3985/49798cb8-0186-4bda-4214-bcee18d56de2.png)

うむ。起動している。

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

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

template engineはMustache.jlを利用する

https://github.com/jverzani/Mustache.jl

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

## Mustacheのインストール

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

![スクリーンショット 2014-05-23 9.07.00.png](https://qiita-image-store.s3.amazonaws.com/0/3985/cf36fc98-78c2-57f5-643f-3f756364e33b.png)

## 組み込み

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

```jl: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](https://qiita-image-store.s3.amazonaws.com/0/3985/13e1903c-0ad3-4580-3415-2d00e1f2c70e.png)

![スクリーンショット 2014-05-23 13.58.28.png](https://qiita-image-store.s3.amazonaws.com/0/3985/cfc317c3-0ad0-bcc0-e9b0-f95ee4658bf0.png)

# Morselで困ったこと


…Morselの[spec.jl](https://github.com/JuliaLang/Morsel.jl/blob/a350f033f5302e352ed83cfcc777a6b153f43c11/spec.jl)では、
```req.resources[:parameter]``` でパスが取れるような記述があるのだが、

```jl: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のように書くとキーが存在しないと怒られてしまう。

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

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

![スクリーンショット 2014-05-23 14.05.23.png](https://qiita-image-store.s3.amazonaws.com/0/3985/ac2900b7-7374-300b-7dee-e9c0f4dbec62.png)

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

結局、コードを読んで
[res.stateに:route_paramsに対してパスを突っ込んでる](https://github.com/JuliaLang/Morsel.jl/blob/a350f033f5302e352ed83cfcc777a6b153f43c11/src/Morsel.jl#L195)のが
わかったのでそれを利用するようにした。

# その他

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