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

みどりねこ日記

よくわからないけど、頑張りますよ。

Clojure on Mac OS X Lion : heroku + compojure + hiccup

絶賛テスト前でつらいので現実逃避してClojureで遊んでみた。

開発は Emacs + nrepl + clojure-mode + leingingen です。

https://github.com/technomancy/clojure-mode

https://github.com/kingtim/nrepl.el

https://github.com/technomancy/leiningen

このへんを見てもらえばだいたい準備できるかと。

gem install heroku

でherokuコマンドを用意。 今回は postgresql も使ったので

brew install postgresql
export PORT=8080
initdb pg

ここでメモリ足りないみたいなエラー吐かれたので

sudo sysctl -w kern.sysv.shmall=65536
sudo sysctl -w kern.sysv.shmmax=16777216
initdb pg
postgres -D pg&
createdb script
export DATABASE_URL=postgres://localhost:5432/script
heroku create --stack cedar

適当になにか書く。

git init
git add .
git commit -m "initial commit"
git push heroku master

うまくherokuにpushできたら、

heroku open

で確認できます。

もしうまくpushできないのなら、コンパイルがきちんと通るか試してみてください。あと、使うライブラリによってはなぜかApplication Error吐かれます。hiccup.page-helpersはだめでした。

heroku側でpostgresql使おうと思ったら、

heroku addons:add shared-database

でエラー。 どうやらheroku-postgresqlを使うべきらしい。 それにあわせてDBのパスも変える。

heroku addons:add heroku-postgresql
export HEROKU_POSTGRESQL_CYAN_URL=postgres://localhost:5432/script

準備できたのでhiccupでHTMLを生成してもらって、compojureでルーティングしてもらう。

さすがLispというべきか、こういうデータ構造は書きやすい。

(defn page-template [title body]
  (html
   [:html
    [:head
     [:meta {:charset "utf-8"}]
     [:title title]
     [:script {:src "http://code.jquery.com/jquery-latest.js"}]
     [:script {:src "/js/bootstrap.min.js"}]
     [:script {:src "/google-code-prettify/prettify.js"}]
     [:link {:rel "stylesheet" :href "/google-code/prettify/prettify.css"}]
     [:link {:rel "stylesheet" :href "/css/bootstrap.css"}]
     [:link {:rel "icon" :href "/favicon.ico"}]]
    [:body {:onload "prettyPrint()"}
     [:div {:id "header" :class "page-header container"}
      [:h1
       [:a {:href "/"} "~"] "/" title]]
     [:div {:class "row"}
      [:div {:class "span1"}]
      [:div {:id "menu" :class "container span2"} (menu)]
      [:div {:class "span1"}]
      [:div {:id "content" :class "container span12"} body]]
     [:footer {:style "text-align:center"}
      "generated by compojure and hiccup."]]]))

(defn page-not-found []
  (page-template
   "404"
   [:div {:id "not-found"}
    "404 page not found"]))