<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Clojure / Drkcore</title><link>http://blog.kzfmix.com/Clojure</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Tue, 12 Jan 2010 10:33:58 +0919</lastBuildDate><item><title>pythonでthreadingとmultiprocessing</title><link>http://blog.kzfmix.com/entry/1255607430</link><description>&lt;p&gt;&lt;a href="http://blog.bestinclass.dk/index.php/2009/10/python-vs-clojure-evolving/"&gt;Python vs Clojure – Evolving « Best in Class&lt;/a&gt;をみてて、「ほう」となったので、手元のmacbookで。&lt;/p&gt;

&lt;p&gt;t_seq.py &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def count(n):
    while n &amp;gt; 0: n -= 1

count(100000000)
count(100000000)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;t_thread.py &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from threading import Thread

def count(n):
    while n &amp;gt; 0: n -= 1

t1 = Thread(target=count,args=(100000000,))
t1.start()
t2 = Thread(target=count,args=(100000000,))
t2.start()
t1.join()
t2.join()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;t_mprocessing.py &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from  multiprocessing import Process

def count(n):
    while n &amp;gt; 0:
        n -= 1

t1 = Process(target=count,args=(100000000,))
t1.start()
t2 = Process(target=count,args=(100000000,))
t2.start()
t1.join()
t2.join()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;結果&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time python t_seq.py;time python t_thread.py;time python t_mprocessing.py

real    0m17.032s
user    0m16.886s
sys 0m0.067s

real    0m37.139s
user    0m29.756s
sys 0m23.039s

real    0m8.777s
user    0m16.973s
sys 0m0.083s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Clojureのほう&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user=&amp;gt; (defn countdown [n] (when (pos? n) (recur (dec n))))

#'user/countdown
user=&amp;gt; user=&amp;gt; (time (doall (pmap countdown (repeat 2 100000000))))
"Elapsed time: 8164.085 msecs"
(nil nil)
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 12 Jan 2010 10:33:58 +0919</pubDate><category>Python</category><category>macbook</category><category>Clojure</category></item><item><title>ClojureとScala</title><link>http://blog.kzfmix.com/entry/1259325447</link><description>&lt;p&gt;説明だけみるとPro Scalaのほうが面白そうな気がするが両方とも欲しい気分&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1430272317/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51dWGdAPwUL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;Practical Clojure (Expert's Voice in Open Source)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    Luke Vanderhart&lt;br /&gt;
    Apress / 4308円 ( 2010-05-17 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;&lt;div class="awsxom"&gt;
    &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/143022844X/ref=nosim/kaerutyuuihou-22"&gt;
    &lt;img src="http://ecx.images-amazon.com/images/I/51Un7%2Bth3yL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
    &lt;strong&gt;Pro Scala: Monadic Design Patterns for the Web&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
    Gregory Meredith&lt;br /&gt;
    Apress / ?円 ( 2011-07-30 )&lt;br /&gt;
    &lt;br /&gt;
    &lt;br clear="all" /&gt;
    &lt;/div&gt;&lt;/p&gt;&lt;/p&gt;</description><pubDate>Fri, 27 Nov 2009 21:38:02 +0919</pubDate><category>Clojure</category><category>Scala</category></item><item><title>Programming Clojure chapter 6-9</title><link>http://blog.kzfmix.com/entry/1254138839</link><description>&lt;p&gt;駆け足で。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1934356336/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51p4G8yo2-L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Programming Clojure (Pragmatic Programmers)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Stuart Halloway &lt;br /&gt;
Pragmatic Bookshelf / ￥ 3,198 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;h4&gt;Chapter 6 (Concurrency)&lt;/h4&gt;

&lt;p&gt;STMを使う。STMはデータベースでいうACIDのうちACIを提供する。実際にいくつか書いてみないと理解できない感じ。&lt;/p&gt;

&lt;h4&gt;Chapter 7 (Macros)&lt;/h4&gt;

&lt;p&gt;マクロ&lt;/p&gt;

&lt;h4&gt;Chapter 8 (Multimethods)&lt;/h4&gt;

&lt;p&gt;マルチメソッドの話。&lt;/p&gt;

&lt;h4&gt;Chapter 9 (Cloure in the Wild)&lt;/h4&gt;

&lt;p&gt;以下の事柄に関して簡単に説明
- tet-isを使ったユニットテストについて
- データベースアクセス
- Compojureというweb application framework&lt;/p&gt;

&lt;p&gt;章の最後にLancetっていうRakeみたいなソフトウェアでの実例で説明してるんだけど、Lancet使ったことないのでイメージが掴みにくかった。&lt;/p&gt;

&lt;p&gt;もう少しClojure触ってから再度読み直すとよいかもしれん。&lt;/p&gt;
</description><pubDate>Mon, 28 Sep 2009 20:54:51 +0919</pubDate><category>Clojure</category></item><item><title>Programming Clojure chapter 5</title><link>http://blog.kzfmix.com/entry/1253959664</link><description>&lt;p&gt;どんどん読む。5章はfunctional programmingに関して。遅延評価についてもふれている。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1934356336/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51p4G8yo2-L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Programming Clojure (Pragmatic Programmers)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Stuart Halloway &lt;br /&gt;
Pragmatic Bookshelf / ￥ 3,198 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;clojureは(jvmが?)末尾最適化しないので、tail recursionでなくself recursionをすべし。&lt;/p&gt;

&lt;p&gt;self recursionはrecurを使う。またはlazy-seqをつかって遅延評価させる。&lt;/p&gt;

&lt;p&gt;mutual recursionの場合はtrampolineという最適化テクニックを使うとよいらしい(未消化)。&lt;/p&gt;
</description><pubDate>Sat, 26 Sep 2009 19:09:05 +0919</pubDate><category>Clojure</category></item><item><title>Programming Clojure chapter 4</title><link>http://blog.kzfmix.com/entry/1253941422</link><description>&lt;p&gt;4章はsequenceという抽象の話がメイン。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1934356336/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51p4G8yo2-L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Programming Clojure (Pragmatic Programmers)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Stuart Halloway &lt;br /&gt;
Pragmatic Bookshelf / ￥ 3,198 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;clojureではsequenceの操作関数は重要。若干関数リファレンスみたいになってしまっている部分もあるが、それは仕方ない。どうせ、実際にコード書くときに何度も見返すことになるので、lispとか触ったことがあれば軽く読み流せる章。&lt;/p&gt;
</description><pubDate>Sat, 26 Sep 2009 14:03:54 +0919</pubDate><category>Clojure</category></item><item><title>Programming Clojure chapter 3</title><link>http://blog.kzfmix.com/entry/1253932076</link><description>&lt;p&gt;3章はJava周りと最適化の話&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1934356336/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51p4G8yo2-L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Programming Clojure (Pragmatic Programmers)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Stuart Halloway &lt;br /&gt;
Pragmatic Bookshelf / ￥ 3,198 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;h4&gt;Syntactic Sugar&lt;/h4&gt;

&lt;p&gt;javaのメソッドを呼ぶための使いやすい構文糖衣が用意されている/(slash)と.(dot)が重要&lt;/p&gt;

&lt;h4&gt;Collection&lt;/h4&gt;

&lt;p&gt;ClojureのCollectionはconcurrency-safeらしい。&lt;/p&gt;

&lt;h4&gt;Lancet&lt;/h4&gt;

&lt;p&gt;Clojureのビルドツール。これは使ってみないと読んだだけではよくわからん。&lt;/p&gt;
</description><pubDate>Sat, 26 Sep 2009 11:28:17 +0919</pubDate><category>Clojure</category></item><item><title>たらい回し関数</title><link>http://blog.kzfmix.com/entry/1253929156</link><description>&lt;p&gt;&lt;a href="http://blog.headius.com/2009/04/how-jruby-makes-ruby-fast.html"&gt;jrubyのたらい回し関数のエントリ&lt;/a&gt;みてたらClojureでもやってみたくなった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Clojure 1.0.0-
user=&amp;gt; (defn tak [x y z] 
      (if (&amp;gt;= y x) 
      z 
      (tak (tak (- x 1) y z) (tak (- y 1) z x) (tak (- z 1) x y))))
#'user/tak
user=&amp;gt; (time (dotimes [_ 100] (tak 24 16 8)))
"Elapsed time: 27580.504 msecs"
nil
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ついでにOCamlでも&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;let rec tak x y z =
  if y &amp;gt;= x then z
  else tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y)
;;

for a = 1 to 100 do
  ignore(tak 24 16 8)
done
;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;まずはバイトコードで。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ocamlc tak.ml -o tak.exe
$ time ./tak.exe 

real    0m10.777s
user    0m10.692s
sys     0m0.033s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ネイティブコードにコンパイルすると&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ocamlopt tak.ml -o tak_opt.exe
$time ./tak_opt.exe 

real    0m1.130s
user    0m1.119s
sys     0m0.006s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;結構はやい。&lt;/p&gt;

&lt;p&gt;そういえば&lt;a href="http://blog.kzfmix.com/tag/Moosp"&gt;MooseでLisp&lt;/a&gt;はたらい回し関数はしるくらいまではやっとこうと思いつつ止まってしまっていたのに今気づいた。&lt;/p&gt;
</description><pubDate>Sat, 26 Sep 2009 11:15:11 +0919</pubDate><category>OCaml</category><category>Clojure</category></item><item><title>Programming Clojure chapter 2</title><link>http://blog.kzfmix.com/entry/1253880838</link><description>&lt;p&gt;2章はClojureの基本的な説明。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1934356336/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51p4G8yo2-L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Programming Clojure (Pragmatic Programmers)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Stuart Halloway &lt;br /&gt;
Pragmatic Bookshelf / ￥ 3,198 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;h4&gt;キーワードは関数として使える。&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;user=&amp;gt; (defstruct book :title :author)
#'user/book
user=&amp;gt; (def b (struct book "Programming Clojure" "Stuart Halloway"))
#'user/b
user=&amp;gt; (b :title)
"Programming Clojure"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これは以下のようにキーワードが先にきても良い。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user=&amp;gt; (:title b)
"Programming Clojure"
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;namespacesの変更&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;(in-ns name)
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;meta-data&lt;/h4&gt;

&lt;p&gt;^が使える。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user=&amp;gt; ^#'str
{:ns #&amp;lt;Namespace clojure.core&amp;gt;, :name str, :file "clojure/core.clj",
 :line 322, :arglists ([] [x] [x &amp;amp; ys]), :tag java.lang.String,
 :doc "With no args, returns the empty string. With one arg x, 
 returns\n  x.toString().  (str nil) returns the empty string.
 With more than\n  one arg, returns the concatenation of the str 
 values of the args."}
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Fri, 25 Sep 2009 21:31:48 +0919</pubDate><category>Clojure</category></item><item><title>clojureでフィボナッチ</title><link>http://blog.kzfmix.com/entry/1253877531</link><description>&lt;p&gt;遅延評価つかうとこんなに簡単&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(def fibs (lazy-cat [0 1]   (map + fibs (rest fibs))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;みてみる&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user=&amp;gt; (take 20 fibs)
(0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181)
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Fri, 25 Sep 2009 20:18:51 +0919</pubDate><category>Clojure</category></item><item><title>Programming Clojure chapter 1 </title><link>http://blog.kzfmix.com/entry/1253796302</link><description>&lt;p&gt;導入&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1934356336/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/51p4G8yo2-L._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Programming Clojure (Pragmatic Programmers)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Stuart Halloway &lt;br /&gt;
Pragmatic Bookshelf / ￥ 3,198 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;定番の&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user=&amp;gt; (defn hello [name] (str "Hello, " name))
#'user/hello
user=&amp;gt; (hello "kzfm")
"Hello, kzfm"
user=&amp;gt; (hello "clojure")
"Hello, clojure"
user=&amp;gt; (str *1 " and " *2)
"Hello, clojure and Hello, kzfm"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;エラーが出たときにstacktrace&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user=&amp;gt; (/ 1 0)
java.lang.ArithmeticException: Divide by zero (NO_SOURCE_FILE:0)
user=&amp;gt; (.printStackTrace *e)
java.lang.ArithmeticException: Divide by zero (NO_SOURCE_FILE:0)
    at clojure.lang.Compiler.eval(Compiler.java:4543)
        at clojure.core$eval__3990.invoke(core.clj:1728)
    at clojure.main$repl__5813$read_eval_print__5825.invoke(main.clj:176)
    at clojure.main$repl__5813.doInvoke(main.clj:193)
    at clojure.lang.RestFn.invoke(RestFn.java:426)
    at clojure.main$repl_opt__5853.invoke(main.clj:247)
    at clojure.main$legacy_repl__5878.invoke(main.clj:288)
    at clojure.lang.Var.invoke(Var.java:346)
    at clojure.main.legacy_repl(main.java:29)
    at clojure.lang.Repl.main(Repl.java:20)
Caused by: java.lang.ArithmeticException: Divide by zero
    at clojure.lang.Numbers.divide(Numbers.java:138)
    at user$eval__16.invoke(NO_SOURCE_FILE:6)
    at clojure.lang.Compiler.eval(Compiler.java:4532)
    ... 9 more
nil
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;requireでなくてuseを使うのはpythonでいうimport some_moduleでなくて from some_module import * をしている感じ&lt;/p&gt;

&lt;p&gt;lancetっていうビルドシステムも用意されている(RubyのRakeみたいなもの?)&lt;/p&gt;
</description><pubDate>Thu, 24 Sep 2009 21:56:57 +0919</pubDate><category>Clojure</category></item></channel></rss>