読者です 読者をやめる 読者になる 読者になる

Block Rockin’ Codes

back with another one of those block rockin' codes

Yesod のインストールとチュートリアルやってみた

haskell yesod

intro

Haskell 勉強中なんですが、なんか仕様やらばかりやってるのも飽きてきたので、
Web アプリを作ってみようと思い、噂の Yesod を試してみました。


とりあえず、環境作りとチュートリアルまで。
環境づくりはいろいろハマった。。

YBlog - Haskell web programming

インストール

とりあえず Haskell Platform から。

Download Haskell

Mac なのでインストーラで入れました。
結構サイズが大きいですね。


インストールすると、$HOME/.cabal/bin にパスが通り
Haskell 用パッケージ管理システムである cabal が使えるようになります。

$ cabal update

yesod を入れる方法が quickstart と tutorial で2つ出てきた。

$ cabal install yesod-platform
$ cabal install yesod cabal-dev

違いがわからないけど、前者にしておこう。

で、実行するとエラー。

Resolving dependencies...
Downloading ansi-terminal-0.5.5...
Configuring ansi-terminal-0.5.5...
ghc: could not execute: /Developer/usr/bin/gcc

こんな感じのが延々出る。

どうやら /Develper/usr/bin/gcc を探してるみたいだけど、
自分の環境では /usr/bin/gcc なので見つからないのが原因らしい。
(というか、gcc 絶対パスか、、強引だな。。)


symlink でもいいけど、使う gcc 指定できたりしないかなと思い
方法を探したら、やっぱり symlink らしい。

Mac/emacsでHaskell環境を作る - mizchi log


ということで symlink。
上記リンクでは llvm は対応してないって書いてあるけど、
なんとなく試してみたくて、 mac に入ってる llvm-gcc のまま
リンクを通してみたら、なんかうまく行かなかった模様。


結局参照元の通り、 gcc を下記からダウンロード/インストールしました。


kennethreitz/osx-gcc-installer · GitHub


そして、以下のリンクを張ります。

$ sudo mkdir -p /Developer/usr/bin
$ sudo ln -s /usr/bin/gcc-4.2 /Developer/usr/bin/gcc


そしたら、cabal で yesod をインストール。

本来は

$ cabal install yesod

で良いはずですが、一回入れて失敗してるので、
念の為に

$ cabal install --reinstall yesod


を実行。とりあえずコンパイルは通った模様。


しかし、 yesod コマンドがない。
というか、

$HOME/.cabal/bin

にパスを通すように書いてあるけど、
実際に yesod のバイナリができているのは、

$HOME/Library/Haskell/bin

だったので、とりあえずそちらを PATH に加えた。


こうして yesod コマンドが使えるようになったら、

$ yesod init

でプロジェクトを作成。
ここでは sample というプロジェクト名にしました。

$ cd sample
$ cabal install
$ yesod devel


http://localhost:3000 を確認。


途中色々あったけど、なんとか動いたよう。


表示された画面の下に表示されているようにテストも動かす。

$ yesod test


動いてるみたい。

チュートリアル

チュートリアルに戻って

.gitignore に以下を加えて git init 〜 commit

cabal-dev
dist
.static-cache
static/tmp
*.sqlite3


yesod は更新を検知してビルドをやり直してくれるようなので、(hot reloding 的な)
立ち上げっぱなしで次へ。


Some last minute words

大事なファイルは以下

config/routes
url と code のマッピングを定義
Handler/
url にアクセスが有った場合に、呼び出されるコードを保持するファイル
templates/
html, js, css のテンプレート
config/models
永続化するオブジェクトを定義する(database table)


Echo
/echo/[some text]

<h1>some text</h1>

を返すサーバを作る。


config/routes に

/echo/#String EchoR GET

を追加。フォーマットは URL handler HTTPMethod


追加してサーバが自動でリビルドを走らせると

Application.hs:31:1: Not in scope: `getEchoR'


というエラーが出る。
getEchoR が無いから。


Handler/Home.hs に実装

getEchoR :: String -> Handler RepHtml
getEchoR theText = do
    defaultLayout $ do
        [whamlet|<h1>#{theText}|]


コンパイルされて

Starting devel application
Devel application launched: http://localhost:3000


(TADA! = 「ジャジャ〜ン」の意味らしい。)

Bulletproof?

URL 型が String 型に変換される時、
参照変換などによって、安全な文字列に変換される。
ここに TypeSafe の強さがあると。

Separate Handlers

EchoR を Echo.hs に分離する。

sample.cabal と Application.hs に記述が必要。


Data.Text

String より Data.Text を使ったほうが良い。


Mirror

GET と POST で作成
Data.Text.reverse を使用

Blog

簡易ブログを作成


GET /blog
記事のリスト表示
POST /blog
記事の作成
GET /blog/


id の記事を表示


スキーマは config/models に

Article
    title   Text
    content Html
    deriving


Html が Read, Show, Eq のインスタンスじゃなかったら、
deriving が必要。無いとエラー。らしい。



Handler/Blog.hs を作る。

最初は、モジュールにしたりなどのブロック

entryForm は areq を使ってる。


areq type label default_value

  • article.hamlet
  • articles.hamlet

以外に

  • articleAddError.hamlet


が必要。


その他リソース

紹介されてるもの。

おまけ

outro

完成品はこちら。
https://github.com/Jxck/yesod-tutorial

お手本はこちら。
https://github.com/yogsototh/yosog


インストール周りで微妙にハマッてしまったけど、
とりあえずひと通り動くところまではできました。


まだ Haskell 自体学び始めなので、 Yesod も書いてて半分はなんだか分からない状態だけど、
とりあえずフレームワーク自体は、よくある Web のフレームワークと近いニュアンスが、
ところどころにあるので、雰囲気くらいはつかめたかと思います。


あと、色々なビルドに時間が結構かかるなぁと。
環境構築自体は最初だけだからいいとして、
yesod のコマンド自体が重いのは、 Rails みたいに
実行を早くするモジュールとかあるのかな?


あとは、まだ SQLite しか試していないけど、 Monog と合わせるとどうなるのかあたりも、
見てみたいと思います。


引き続き、少しづつやっていこうと思います。