Clojureの今

Presenter Notes

登尾(のぼりお)

  • Twitter ID: tnoborio
  • ニャンパス株式会社

ノマドな、
Clojureでアジャイル開発する会社

nyampass

Presenter Notes

(何か作りたくなる) Clojureの今

Presenter Notes

話したいこと

Clojure 1.3 / Leiningenの進化

ClojureScript

Clojure on Heroku

Presenter Notes

Clojure 1.3

9/13 Clojure RC0がリリース

前のめりに仕様を追いかけてはいないので
普段1.2を使ってる人から見たうれしいポイント

Presenter Notes

Clojure 1.3 RC0の実行方法

1 $ ant
2 $ java -cp clojure-1.3.0-RC0.jar clojure.main
3 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
4 Clojure 1.3.0-RC0
5 user=> *clojure-version*
6 {:major 1, :minor 3, :incremental 0, :qualifier "RC0"}

Presenter Notes

Leiningenの場合

1 (defproject hoge "0.1"
2     :main hoge.core
3   :description "FIXME: write description"
4   :dependencies [[org.clojure/clojure "1.3.0-master-SNAPSHOT"]]
5 
6   :repositories {"sonatype-oss-public"
7                  "https://oss.sonatype.org/content/groups/public/"})

swank-clojureもアップデート

1 :dev-dependencies [[swank-clojure "1.4.0-SNAPSHOT"]]

Presenter Notes

1.3で何が嬉しいか

パフォーマンスの改良

プリミティブ型の強化

 1 (defn fib [n]
 2     (if (<= n 1)
 3     1
 4     (+ (fib (dec n)) (fib (- n 2)))))
 5 
 6 (time (fib 38))
 7 "Elapsed time: 4100.272 msecs"
 8 
 9 !clojure
10 ;; hint arg and return
11 (defn fib ^long [^long n]
12 (if (<= n 1)
13     1
14     (+ (fib (dec n)) (fib (- n 2)))))
15 
16 (time (fib 38))
17 "Elapsed time: 674.706 msecs"
  • 竹内関数でのClojure 1.2との比較 4倍差(当社比)

Presenter Notes

例外のメッセージが分かりやすく

Presenter Notes

defrecordの改良(1)

まずdefrecord

1 (defrecord MyRecord [a b])
2 
3 (MyRecord. 1 2)
4 
5 (into (MyRecord. 1 2) {:a 3, :b 4})

Presenter Notes

defrecordの改良(2)

マップからの作成

1 (MyRecord/create {:a 3 :b 4})

シリアライズ

1 (binding [*print-dup* true]
2     (pr-str (MyRecord. 1 2)))
3 "#user.MyRecord[1, 2]"

キーを返す

1 user=> (MyRecord/getBasis)
2 [a b]

Presenter Notes

doc、find-docは、clojure.replに

 1 (use 'clojure.repl)
 2 user> (doc keys)
 3 -------------------------
 4 clojure.core/keys
 5 ([map])
 6  Returns a sequence of the map's keys.
 7 nil
 8 
 9 user> (reflect "")
10 {:bases #{java.io.Serializable java.lang.Comparable java.lang.Object java.lang.CharSequence}, :flags #{:public :final}, :members #{#clojure.reflect.Method{:name valueOf, :return-type java.lang.String, :declaring-class java.lang.String, :parameter-types [boolean], ...

Presenter Notes

Leiningenの進化

自動化ツール

  • lein run - 実行
  • lein retest 最後に失敗したネームスペースのテストを実行
  • lein search - リポジトリから検索

プラグイン

  • lein daemon - デーモン化
  • lein ring - ringサーバの起動

Presenter Notes

ClojureScript

https://github.com/clojure/clojurescript

  • JavaScriptへ書き出されるClojure
  • JavaScript is Assembly Language for the Web
  • アプローチとしてはCoffeeScriptと同じ
  • Google Closureと連携

インストール

1 $ git clone git://github.com/clojure/clojurescript.git
2 $ cd clojurescript
3 $ script/bootstrap

Presenter Notes

ClojureScript(2)

jsが生成されるということは

  • ブラウザ
  • スマートフォンではTitanium / PhoneGap
  • サーバサイドではNode

Presenter Notes

ClojureScript(3)

Node

1 (ns nodehello)
2 
3 (defn -main [& args]
4     (println (apply str (map [\ "world" "hello"] [2 0 1]))))
5 (set! *main-cli-fn* -main)

実行

1 $ node nodehello.js 
2 hello world

Presenter Notes

Clojure on Heroku

heroku

Presenter Notes

Clojure on Heroku(2)

サムネイル生成をするサンプル ( http://hollow-cloud-463.herokuapp.com/ )

https://gist.github.com/1130459

 1 (ns demo.web
 2   ...
 3   (import java.io.ByteArrayOutputStream
 4           javax.imageio.ImageIO
 5           java.awt.image.BufferedImage
 6           java.awt.image.BufferedImage))
 7 ...
 8 (defroutes main-routes
 9     (GET "/test" _ "ok")
10     (GET "/map/" [] (templates.upload/index))
11     (POST "/" _ make-thumbnail))
12 
13 (def app
14     (-> #'main-routes
15         handler/site))
16 
17 (defn -main []
18     (let [port (Integer/parseInt (or (System/getenv "PORT")
19                                      "18080"))]
20         (run-jetty (var app) {:port port})))

Presenter Notes

Clojure on Heroku(3)

gitでデプロイ

 1 $ git push heroku
 2 Counting objects: 9, done.
 3 Delta compression using up to 4 threads.
 4 Compressing objects: 100% (3/3), done.
 5 Writing objects: 100% (5/5), 405 bytes, done.
 6 Total 5 (delta 2), reused 0 (delta 0)
 7 
 8 -----> Heroku receiving push
 9 -----> Clojure app detected
10 -----> Installing Leiningen
11        Downloading: leiningen-1.5.2-standalone.jar
12        Downloading: rlwrap-0.3.7
13        Writing: lein script
14 -----> Installing dependencies with Leiningen
15        Running: lein deps :skip-dev
16        Copying 17 files to /tmp/build_3hcdo3j5w5sj3/lib
17 -----> Discovering process types
18        Procfile declares types -> web
19 -----> Compiled slug size is 11.6MB
20 -----> Launching... done, v12
21        http://hollow-cloud-463.herokuapp.com deployed to Heroku
22 
23 To git@heroku.com:hollow-cloud-463.git
24    870c10f..17e70a1  master -> master

Presenter Notes

Clojure on Heroku(4)

  • MonboDBも利用できる
  • その場合、congomongo

https://github.com/aboekhoff/congomongo

mongohq

Presenter Notes

Clojureハッカソン Tokyo.clj(clojure-ja)

Presenter Notes

おしまい

Presenter Notes