<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5490593135688721447</id><updated>2012-01-29T19:59:12.834+09:00</updated><category term='incanter'/><category term='processing'/><category term='cellar automata'/><category term='javascript'/><category term='individual based model'/><category term='algorithm'/><category term='clojure'/><title type='text'>Don't think, feel! (別館)</title><subtitle type='html'>"Don't think, feel! It is like a finger pointing away to the moon. Don't concentrate on the finger or you will miss all that heavenly glory." – Bruce Lee
 &lt;p&gt; 本館→ &lt;a href="http://yasuto.wordpress.com/"&gt;http://yasuto.wordpress.com/&lt;/a&gt; &lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-559773697206573065</id><published>2011-08-02T08:26:00.002+09:00</published><updated>2011-08-02T08:27:35.961+09:00</updated><title type='text'>移転します。</title><content type='html'>&lt;a href="http://green.sphere.sc"&gt;http://green.sphere.sc&lt;/a&gt; に移転します。 日本語コンテンツは &lt;a href="http://green.sphere.sc/jp"&gt;http://green.sphere.sc/jp&lt;/a&gt; にあります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-559773697206573065?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/559773697206573065/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/559773697206573065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/559773697206573065'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/08/blog-post.html' title='移転します。'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-2805249427198054618</id><published>2011-06-28T20:56:00.014+09:00</published><updated>2011-06-28T21:30:10.051+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='incanter'/><category scheme='http://www.blogger.com/atom/ns#' term='individual based model'/><title type='text'>basic individual based models / clojure</title><content type='html'>&lt;a href="https://gist.github.com/35bd78f7bb197e39164f"&gt;https://gist.github.com/35bd78f7bb197e39164f&lt;/a&gt; (scripts of clojure with comments in English)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回のソースはブログに載せるのは長すぎる（２つのファイルで３５０行くらい。拡張性を考えて関数を結構細かく分けています。）ので、ソースは載せないです。上記を参考にしてください。いずれは解説を加える予定ですが、こちらじゃなくて、ホームページに載せると思います。（ブログでソースを取り扱うのは何かと面倒なので。）&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;上記プログラムの実行例です。連続時間モデル(イベントベースシミュレーション)も離散時間モデルも同じような図ですが、各シミュレーションは５０回試行したものをそれぞれIncanter chartsを利用してグラフ化しています。1000個体のものを50回試行させてグラフ化した時の時間が２分３０秒ほどかかってます。これは未最適状態です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/-BHGcMAA9x6c/TgnCKAUa-AI/AAAAAAAAASI/5r5dsPveEFc/s400/basic-result10.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5623239086888908802" /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;離散：初期個体数 10でt=100まで&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/-ojSbZFeKb-8/TgnCT5nTdtI/AAAAAAAAASQ/KKhVxnlr-yo/s400/basic-result100.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5623239256887752402" /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;離散：初期個体数100でt=100まで&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/-ZWj1I4EY5Yc/TgnCk2J2guI/AAAAAAAAASY/-ncPh0eUqfY/s1600/basic-result1000.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://1.bp.blogspot.com/-ZWj1I4EY5Yc/TgnCk2J2guI/AAAAAAAAASY/-ncPh0eUqfY/s400/basic-result1000.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5623239548016689890" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;離散：初期個体数 1000でt=100まで&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-rHgqbLE8t90/TgnDWTRTJ9I/AAAAAAAAASw/_A1DImWVl-0/s1600/c-basic-result10.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://4.bp.blogspot.com/-rHgqbLE8t90/TgnDWTRTJ9I/AAAAAAAAASw/_A1DImWVl-0/s400/c-basic-result10.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5623240397646145490" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;連続：初期個体数 10でt=100まで&lt;/div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-2fXyoQdllT0/TgnDTVOG4mI/AAAAAAAAASo/jycKHsVovt8/s1600/c-basic-result100.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://3.bp.blogspot.com/-2fXyoQdllT0/TgnDTVOG4mI/AAAAAAAAASo/jycKHsVovt8/s400/c-basic-result100.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5623240346630021730" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;連続：初期個体数 100でt=100まで&lt;/div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-JCCmBUxI734/TgnDPtSEeCI/AAAAAAAAASg/_nvbFdWkJ7A/s1600/c-basic-result1000.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://2.bp.blogspot.com/-JCCmBUxI734/TgnDPtSEeCI/AAAAAAAAASg/_nvbFdWkJ7A/s400/c-basic-result1000.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5623240284369614882" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;連続：初期個体数 1000でt=100まで&lt;/div&gt;&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-2805249427198054618?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/2805249427198054618/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/basic-individual-based-model-clojure.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/2805249427198054618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/2805249427198054618'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/basic-individual-based-model-clojure.html' title='basic individual based models / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-BHGcMAA9x6c/TgnCKAUa-AI/AAAAAAAAASI/5r5dsPveEFc/s72-c/basic-result10.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-7823877489963331710</id><published>2011-06-28T06:12:00.006+09:00</published><updated>2011-06-28T06:46:36.324+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>メアドの暗号化について / javascript</title><content type='html'>もともと持っていたホームページを改変することを考えててどうしようかって検討してたんだけど、jekyllを利用することを考えてます。jekyllの場合、わざわざブラウザのエディタを使わなくてよいので、emacs/vimで作れるので大変楽です。作成したものをそのまま、ホームページのホスティングに転送するようにしておけばいいですからね。個人のページなんで動的なことが必要なのはあまりないものでこれで十分かと思ったくらいです。&lt;br /&gt;&lt;br /&gt;そこですこしjavascriptをいじってみた。メールアドレス用のスクリプトを作ってました。もっとも、僕の場合、普段からメアドを野ざらしにしているからいまさら暗号化する必要はないんですがね。その暗号を解読する関数ですね。作りは簡単なんですが。nこの長さmの文字列を用意してみます。以下は3つの文字列で5の長さを持ってるものです：&lt;br /&gt;&lt;br /&gt;abcde&lt;br /&gt;fghij&lt;br /&gt;klmno&lt;br /&gt;&lt;br /&gt;ここから先頭から縦に取ってきて順番並べると "afkbglchmdinejo"が作れますね。これを キャラクターコードの配列に置き換えます。(97, 102, 107, 98, 103, 108, 99, 104, 109, 100, 105, 110, 101, 106, 111)これをdecipherに読み込ませると終了です。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush:javascript"&gt;&lt;br /&gt;function decipher(c,n)&lt;br /&gt;{&lt;br /&gt;  var s0 = String.fromCharCode.apply(String, c);&lt;br /&gt;  var s1=new Array(n);&lt;br /&gt;&lt;br /&gt;  for(i=0 ; i &lt; n ; i++){&lt;br /&gt;      s1[i]="";&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  for(i=0 ; i &lt; s0.length/n ; i++){&lt;br /&gt;    for(j=0 ; j &lt; n ; j++){&lt;br /&gt;      s1[j]=s1[j] + s0.charAt(n*i+j);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return(s1);&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;これを実際に使うと次のようになります。node.jsで試してます。&lt;br /&gt;&lt;code&gt;&lt;pre class="brush:javascript"&gt;&amp;gt; var arr = new Array(97, 102, 107, 98, 103, 108, 99, 104, 109, 100, 105, 110, 101, 106, 111);&lt;br /&gt;&amp;gt; var result = decipher(arr,3);&lt;br /&gt;&amp;gt; result[0];&lt;br /&gt;'abcde'&lt;br /&gt;&amp;gt; result[1];&lt;br /&gt;'fghij'&lt;br /&gt;&amp;gt; result[2];&lt;br /&gt;'klmno'&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ちょっとしたことを組み込んでました。野ざらしにしてる僕のメアドですが、gmailのスパムを見てるとさほど多くないから、意外と取られてないんだなとは思いますよ。これをどう使ったかというのはここで書かないけど。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-7823877489963331710?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/7823877489963331710/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/7823877489963331710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/7823877489963331710'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/javascript.html' title='メアドの暗号化について / javascript'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-2198266593379693193</id><published>2011-06-20T20:30:00.006+09:00</published><updated>2011-06-20T20:59:01.640+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='incanter'/><title type='text'>階乗計算の比較(apply, reduce, cps, recur and iterate) / clojure</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-4E7O31VKTjA/Tf8EKfkh8jI/AAAAAAAAASA/sj_08pR_oXM/s1600/foo0.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://4.bp.blogspot.com/-4E7O31VKTjA/Tf8EKfkh8jI/AAAAAAAAASA/sj_08pR_oXM/s400/foo0.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5620215438301590066" /&gt;&lt;/a&gt;上記のグラフはIncanter/chartsの練習で作ったものなんです。同じ作るならば、ちょっとは参考になるものをと考えて見るのが良いだろうと思って、階乗計算のパフォーマンスをグラフ化してみた。赤色は継続渡し、青色は再帰、緑はiterate, 黄色とラベンダー色（重なってる）はapply,reduceを利用して、それぞれ要素が1000,2000,3000,4000,5000の時の階乗計算を１０回行いその平均をグラフ化したものです。その結果は、apply,reduceのパフォーマンスは圧倒的に悪いですね。特に型宣言を行うといったチューニングはしていないですが、この位の差が出てくるようです。視覚化するとよくわかりますね。継続渡し再帰を利用したものが一番パフォーマンスが良かったです。継続渡しっていいんですね。要素数が少ない時はさほど気にはならないけど、大規模なことをするときは注意する必要があるってことを示してるのでしょう。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;;;; time+ origins from 'time' of clojure.core under EPL by Rich Hickey.&lt;br /&gt;(defmacro time+&lt;br /&gt;"Evaluates expr and prints the time it took.  Returns the value of&lt;br /&gt;expr."&lt;br /&gt;{:added "1.0"}&lt;br /&gt;[expr]&lt;br /&gt;`(let [start# (. System (nanoTime))&lt;br /&gt;       ret# ~expr]&lt;br /&gt;   (/ (double (- (. System (nanoTime)) start#)) 1000000.0)))&lt;br /&gt;&lt;br /&gt;(defmacro time-repeat [t expr]&lt;br /&gt;  `(take ~t (repeatedly (fn[] (time+ ~expr)))))&lt;br /&gt;&lt;br /&gt;(defn fact-cps [n cont]&lt;br /&gt;  (if (zero? n)&lt;br /&gt;      (cont 1)&lt;br /&gt;      (recur (dec n) (fn[x] (cont (* n x))))))&lt;br /&gt;&lt;br /&gt;(defn fact-recur [n result]&lt;br /&gt;  (if (zero? n)&lt;br /&gt;      result&lt;br /&gt;      (recur (dec n) (* n result))))&lt;br /&gt;&lt;br /&gt;(performance/time-repeat&lt;br /&gt;10 (last (map #(second %)&lt;br /&gt;           (take 5000 ; 5000までの階乗計算&lt;br /&gt;                 (iterate (fn[[x y]][(inc x) (* x y)])&lt;br /&gt;                 [2 1])))))&lt;br /&gt;&lt;br /&gt;(reduce * 1 (range 2 5001))&lt;br /&gt;&lt;br /&gt;(apply * (range 1 5001))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-2198266593379693193?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/2198266593379693193/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/apply-reduce-cps-recur-and-iterate.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/2198266593379693193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/2198266593379693193'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/apply-reduce-cps-recur-and-iterate.html' title='階乗計算の比較(apply, reduce, cps, recur and iterate) / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-4E7O31VKTjA/Tf8EKfkh8jI/AAAAAAAAASA/sj_08pR_oXM/s72-c/foo0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-4072979965369368984</id><published>2011-06-10T00:10:00.005+09:00</published><updated>2011-06-10T00:28:34.718+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>macroでmacroを作る。 /clojure</title><content type='html'>Clojureでマクロをつくろうとする場合、common lispより制約が強いので作り方も若干変える必要があります。そこで一番大きいのは、マクロで悪名高かったバッククオート`を重ねられない点です。その点をよく考えて、障害を乗り越えなければいけません。制約があるために、バッククオート以前に処理をするのが勝負どころと言えるでしょうね。swingなどでproxyを設定することがあるけど、あれは糖衣するのに良い材料だと思ってます。残念ながら僕はJavaのライブラリを使うコツをまだつかんでないので、これは試作段階のものです。だからまだ、githubにはアップロードしないです。Practical clojureの共著者のSierraさんのブログをみてみる&lt;a href="http://stuartsierra.com/2010/01/03/doto-swing-with-clojure"&gt;[1]&lt;/a&gt;と、この手のマクロはon-actionマクロのようにadd〜のところからマクロにするほうがいいのだろうな。と今は思ってます。以下のdefproxyってのはマクロ名とinterface名とが同じになるようにしているけど、それが適切かどうかまだ判断つかないですね。^^;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;(defmacro defproxy [name]&lt;br /&gt;(let [body# 'body&lt;br /&gt;    name# name&lt;br /&gt;    amp# '&amp;amp;]&lt;br /&gt;`(defmacro ~name# [~amp# ~body#]&lt;br /&gt;   (conj ~body# [] ['~name#] 'proxy))))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;だからマクロでマクロをつくろうと思えば、作れないことはない。しかし、common lispのマクロとは違った工夫が必要だよ。ってことですね。もう少しわかりやすく作れないのか？まだ考えています。でも、ここまで出来れば、マクロで関数とマクロを同時に設定するという芸当も可能だってことはわかります。その時は、&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;(defmacro foo [bar ...]&lt;br /&gt;(let [...]&lt;br /&gt;`(do&lt;br /&gt;   (defmacro ....)&lt;br /&gt;   (defn ....)))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;というような作成方法になります。さて、どこで使うかやね。笑&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-4072979965369368984?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/4072979965369368984/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/macromacro-clojure.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/4072979965369368984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/4072979965369368984'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/macromacro-clojure.html' title='macroでmacroを作る。 /clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-6974724797692467956</id><published>2011-06-03T21:47:00.011+09:00</published><updated>2011-06-03T22:26:05.724+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>dopoll マクロ / clojure</title><content type='html'>dopollマクロですが、ちょいと分かりにくいので解説です。サンプルと出力結果はPriorityBlokingQueueの利用例ですが、Javaのライブラリで供給されているデーター構造とそれの操作する関数群があるんですが、その操作を繰り返し行うときに利用するように作ったマクロです。だから恐らく.pollと.sizeをメソッドに持ってるjavaのクラスならば活用できるでしょう。&lt;br /&gt;&lt;br /&gt;ご存知のように？この手の繰り返し操作をしようとすると、loopマクロを利用することになりますが、loopマクロは取り扱いがシンプルではないので、何かとエンバグしやすい印象があるんですね。loopで同じ事をさせようと思ったらwhen-not以下を普通に記述すればいいのですが、案外失敗して、無限ループに突入してしまうこともあるんですね。そのために常にqueueのサイズが0になってるかどうかチェックしています。これを常に知っておかないと、loopを使って記述しても悩んでしまうバグとして関数内に放置してしまう可能性がありますが、予めマクロを作っておくとその可能性はなくなります。使い方は極めてシンプルしていてdotimesやdoseqを知っていれば直感的に使えるようになっています。ただし、終了条件だけはいつも最後まで繰り返さないときのために第三項目として取り上げています。このマクロでは、マクロと解釈する前に、ベクターの３つめの項目があるかどうか調べて、なければ最後までループさせるようにして、あれば、それを終了条件になるようにしています。それはサンプルを見てください。&lt;br /&gt;&lt;br /&gt;マクロとしては複雑に見えるけど、macroexpand-1をして分かりやすく加工すると次のように解釈してくれることがわかります。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;user&amp;gt; (macroexpand-1 '(dopoll [i a]&lt;br /&gt;       (println i)))&lt;br /&gt;(when-not (zero? (.size a))&lt;br /&gt; (loop [i (.poll a)]&lt;br /&gt;   (println i) (if-not (zero? (.size a))&lt;br /&gt;    (recur (.poll a)))))&lt;br /&gt;&lt;br /&gt;user&amp;gt; (macroexpand-1 '(dopoll [i a (&amp;gt; (.peek a) 10)]&lt;br /&gt;       (println i)))&lt;br /&gt;(when-not (or (zero? (.size a)) (&amp;gt; (.peek a) 10))&lt;br /&gt; (loop [i (.poll a)]&lt;br /&gt;   (println i)&lt;br /&gt;   (if-not (or (zero? (.size a)) (&amp;gt; (.peek a) 10))&lt;br /&gt;     (recur (.poll a)))))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ソース：＆と不等号の箇所はブログの仕様上自動的に；が挿入されるので試すときは；を取ってくださいね。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;(defmacro dopoll [bindings &amp;amp; body]&lt;br /&gt; "A macro for loop manipulations of java collection queues"&lt;br /&gt; (let [var# (bindings 0)&lt;br /&gt; pq# (bindings 1)&lt;br /&gt; term# (if (= (count bindings) 2)&lt;br /&gt;  `(zero? (.size ~pq#))&lt;br /&gt;  `(or (zero? (.size ~pq#)) ~(bindings 2)))]&lt;br /&gt;   `(when-not ~term#&lt;br /&gt;      (loop [~var# (.poll ~pq#)]&lt;br /&gt;  ~@body&lt;br /&gt;  (if-not ~term#&lt;br /&gt;    (recur (.poll ~pq#)))))))&lt;br /&gt;&lt;br /&gt;(comment =example=&lt;br /&gt; (import [java.util.concurrent PriorityBlockingQueue])&lt;br /&gt; (defn print-pq []&lt;br /&gt;   (let [pq (new PriorityBlockingQueue)]&lt;br /&gt;     (dotimes [_ 10]&lt;br /&gt; (.add pq (rand 1000)))&lt;br /&gt;     (dopoll [i pq (&amp;gt; (.peek pq) 500)]&lt;br /&gt;      (println i))&lt;br /&gt;     (println "elements more than 500:")&lt;br /&gt;     (dopoll [i pq]&lt;br /&gt;       (println i))))&lt;br /&gt;;; user&amp;gt; (print-pq)&lt;br /&gt;;; 163.45692827827574&lt;br /&gt;;; 335.192525607674&lt;br /&gt;;; 440.69978223389404&lt;br /&gt;;; elements more than 500:&lt;br /&gt;;; 528.0780372058205&lt;br /&gt;;; 608.7673080309557&lt;br /&gt;;; 724.6340821453795&lt;br /&gt;;; 731.3274923835517&lt;br /&gt;;; 821.201362348645&lt;br /&gt;;; 899.2657774538147&lt;br /&gt;;; 968.5099196992995&lt;br /&gt;;; nil&lt;br /&gt;;; user&amp;gt;&lt;br /&gt; )&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;久しぶりにいっヶ月ばかりclojureと格闘したけど、プログラミンの感覚を少し取り戻したような気がします。:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-6974724797692467956?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/6974724797692467956/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/dopoll-clojure.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6974724797692467956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6974724797692467956'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/dopoll-clojure.html' title='dopoll マクロ / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-6924684294992340515</id><published>2011-06-03T20:18:00.010+09:00</published><updated>2011-06-04T19:03:07.494+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='incanter'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>incanter-processing を試す その４ + dopull macro / clojure</title><content type='html'>これもincanter/processingのデモですけど、今度は動画に落としてみました。ubuntu上でconvertコマンドを利用して変換させています。&lt;br /&gt;&lt;br /&gt;ここでは、Java標準に付いてるPriorityBlokingQueueを利用して、オブジェクトの優先順位をフレームごとに変えて描写させています。(ubuntu上のffmpegで再変換して動画を作り直しました。)そこで活躍してるのはdopollマクロなんですが、この説明はまたの機会にて。これはincanter/processingとPriorityBlokingQueueの練習とdopollの実戦投入テストですね。&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/l76Uu1PfVH8?hl=ja&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/l76Uu1PfVH8?hl=ja&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://gist.github.com/1006213"&gt;https://gist.github.com/1006213&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;pre  class="brush: clojure"&gt;&lt;br /&gt;;;; -*- Mode: Clojure; Coding: utf-8 -*-&lt;br /&gt;;;;&lt;br /&gt;;;; rotate2.clj - an incanter/processing example of 'rotate'&lt;br /&gt;;;;&lt;br /&gt;;;; Copyright (C) 2011 by Yasuto TAKENAKA  y.takenaka@gmail.com&lt;br /&gt;;;;&lt;br /&gt;;;;                       Time-stamp: &amp;lt;2011-06-03 20:17:30 yasuto&amp;gt;&lt;br /&gt;;;;                       License   :  http://en.wikipedia.org/wiki/MIT_License&lt;br /&gt;;;;&lt;br /&gt;(ns processing-samples.rotate2&lt;br /&gt;(:use (incanter core processing))&lt;br /&gt;(:import [java.util.concurrent PriorityBlockingQueue]))&lt;br /&gt;&lt;br /&gt;(defstruct obj :tr :color :time)&lt;br /&gt;&lt;br /&gt;(defmacro dopoll [bindings &amp;amp; body]&lt;br /&gt;"A macro for loop manipulations of java collection queues"&lt;br /&gt;(let [var# (bindings 0)&lt;br /&gt; pq# (bindings 1)&lt;br /&gt; term# (if (= (count bindings) 2)&lt;br /&gt;  `(zero? (.size ~pq#))&lt;br /&gt;  `(or (zero? (.size ~pq#)) ~(bindings 2)))]&lt;br /&gt;`(when-not ~term#&lt;br /&gt;   (loop [~var# (.poll ~pq#)]&lt;br /&gt;  ~@body&lt;br /&gt;  (if-not ~term#&lt;br /&gt;    (recur (.poll ~pq#)))))))&lt;br /&gt;&lt;br /&gt;(defn rloc []&lt;br /&gt;(let [dif 180]&lt;br /&gt;(- (int (rand (* 2 dif))) dif)))&lt;br /&gt;&lt;br /&gt;(defn rcol []&lt;br /&gt;(let [lim 256]&lt;br /&gt;(int (rand lim))))&lt;br /&gt;&lt;br /&gt;(defn init-objs [n]&lt;br /&gt;(for [x (range n)]&lt;br /&gt;(struct obj [(rloc)(rloc)] [(rcol)(rcol)(rcol)]&lt;br /&gt;     (ref (rand 1)))))&lt;br /&gt;&lt;br /&gt;(defn obj-comp [obj1 obj2]&lt;br /&gt;(if (&amp;lt; @(:time obj1) @(:time obj2)) true false))&lt;br /&gt;&lt;br /&gt;(defn four-circle [sktch [tr-x tr-y] [r g b] rad]&lt;br /&gt;(doto sktch&lt;br /&gt;push-matrix&lt;br /&gt;(fill r g b)&lt;br /&gt;(translate tr-x tr-y)&lt;br /&gt;(rotate (radians rad))&lt;br /&gt;(ellipse -15 -15 30 30)&lt;br /&gt;(ellipse  15 -15 30 30)&lt;br /&gt;(ellipse 15 15 30 30)&lt;br /&gt;(ellipse -15 15 30 30)&lt;br /&gt;pop-matrix))&lt;br /&gt;&lt;br /&gt;(defn fname [cunt]&lt;br /&gt;(cond&lt;br /&gt;(&amp;gt; 10 cunt) (str "000" cunt)&lt;br /&gt;(&amp;gt; 100 cunt) (str "00" cunt)&lt;br /&gt;(&amp;gt; 1000 cunt) (str "0" cunt)&lt;br /&gt;:else (str cunt)))&lt;br /&gt;&lt;br /&gt;(defn rotate-example2 []&lt;br /&gt;(let [objs (init-objs 30)&lt;br /&gt; pq (new PriorityBlockingQueue 10 obj-comp)&lt;br /&gt; rad (ref 0)&lt;br /&gt; cunt (ref 0)&lt;br /&gt; sktch (sketch&lt;br /&gt;        (setup []&lt;br /&gt;        (doto this&lt;br /&gt;   (size 400 400)&lt;br /&gt;   (background 255)&lt;br /&gt;   smooth&lt;br /&gt;   no-stroke&lt;br /&gt;   ))&lt;br /&gt;        (draw []&lt;br /&gt;       (doseq [el objs]&lt;br /&gt;         (.add pq el))&lt;br /&gt;       (doto this&lt;br /&gt;         (background 255)&lt;br /&gt;         (translate (/ (width this) 2) (/ (height this) 2))&lt;br /&gt;         (rotate (radians @rad)))&lt;br /&gt;       (dopoll [ite pq]&lt;br /&gt;        (four-circle this (:tr ite)&lt;br /&gt;       (:color ite) @rad)&lt;br /&gt;        (dosync (ref-set (:time ite) (rand 1))))&lt;br /&gt;;;       (save this (str "sample" (fname @cunt) ".png"))&lt;br /&gt;       (dosync (alter rad inc)&lt;br /&gt;        (alter cunt inc))))]&lt;br /&gt;(view sktch :size [400 400] :title "rotate example")))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-6924684294992340515?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/6924684294992340515/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/incanter-processing-dopull-macro.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6924684294992340515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6924684294992340515'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/incanter-processing-dopull-macro.html' title='incanter-processing を試す その４ + dopull macro / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-5411841112218508815</id><published>2011-06-01T21:33:00.007+09:00</published><updated>2011-06-01T21:48:06.129+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='incanter'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>incanter processingを試す その３ /clojure</title><content type='html'>incanter/processingを使ってサンプルをいくつか作ってます。感覚的にはだいたい分かってきたんですが、使いやすいですね。あわないと感じてたけど、しばらく触ってみます。&lt;br /&gt;&lt;br /&gt;ただ、processingを触るとどうしてもOOP（オブジェクト指向プログラミング)が関連してくるので、clojureのオブジェクト指向の関連のことを触ってるところですね。やはりというのかClojureでoopをするとCommon LispのCLOSやRのオブジェクト指向とに通った感じですね。決して、javaやC++に近いとは言えませんが、そのかわり柔軟性は高いと思う。したのはrotateなどのサンプルです。ただ、このようにprocessingの命令を呼ぶ程度の事ならば、clojureを使ってプログラミングする恩恵があまりありません。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-3LwoP1GGDqE/TeYzHmBG0YI/AAAAAAAAARY/SzpCg9_cSEY/s1600/proc_example1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 248px; height: 221px;" src="http://1.bp.blogspot.com/-3LwoP1GGDqE/TeYzHmBG0YI/AAAAAAAAARY/SzpCg9_cSEY/s320/proc_example1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5613230191121191298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://gist.github.com/1002218"&gt;https://gist.github.com/1002218&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;;;; -*- Mode: Clojure; Coding: utf-8 -*-&lt;br /&gt;;;;&lt;br /&gt;;;; rotate.clj - a incanter/processing example of 'rotate'&lt;br /&gt;;;;&lt;br /&gt;;;; Copyright (C) 2011 by Yasuto TAKENAKA y.takenaka@gmail.com&lt;br /&gt;;;; &lt;br /&gt;;;;                       Time-stamp: &lt;2011-06-01 21:32:42 yasuto&gt;&lt;br /&gt;;;;                       License   : http://en.wikipedia.org/wiki/MIT_License&lt;br /&gt;;;;&lt;br /&gt;(ns processing-samples.rotate&lt;br /&gt;  (:use [incanter core processing]))&lt;br /&gt;&lt;br /&gt;(defn rotate-box [sktch rad]&lt;br /&gt;  (doto sktch&lt;br /&gt;    push-matrix&lt;br /&gt;    (fill 196 196 (mod rad 256))&lt;br /&gt;    (rect-mode CENTER)&lt;br /&gt;    (translate 100 100)&lt;br /&gt;    (rotate (radians rad))&lt;br /&gt;    (rect 0 0 100 100)&lt;br /&gt;    (rect-mode CORNER)&lt;br /&gt;    pop-matrix))&lt;br /&gt;&lt;br /&gt;(defn draw-header [sktch rad]&lt;br /&gt;  (doto sktch&lt;br /&gt;    (background 255)&lt;br /&gt;    (fill 196 (mod rad 256) 0)&lt;br /&gt;    (create-font "Serif" 16)&lt;br /&gt;    (text-align LEFT)&lt;br /&gt;    (text "This is an example." 50 20)&lt;br /&gt;    (rect 0 50 50 50)))&lt;br /&gt;&lt;br /&gt;(defn draw-footer [sktch]&lt;br /&gt;  (doto sktch&lt;br /&gt;    (fill 255 196 0 200)&lt;br /&gt;    (ellipse 100 150 50 50)))&lt;br /&gt;&lt;br /&gt;(defn rotate-example []&lt;br /&gt;  (let [rad (ref 0)&lt;br /&gt; sktch (sketch&lt;br /&gt;        (setup []&lt;br /&gt;        (doto this&lt;br /&gt;   (size 200 200)&lt;br /&gt;   (background 255)&lt;br /&gt;   smooth&lt;br /&gt;   no-stroke))&lt;br /&gt;        (draw []&lt;br /&gt;       (doto this&lt;br /&gt;         (draw-header @rad)&lt;br /&gt;         (rotate-box @rad)&lt;br /&gt;         draw-footer&lt;br /&gt;         (save "proc_example1.png"))&lt;br /&gt;       (dosync (alter rad inc))))] &lt;br /&gt;    (view sktch :size [250 250] :title "rotate example")))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-5411841112218508815?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/5411841112218508815/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/incanter-processing-clojue.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/5411841112218508815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/5411841112218508815'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/06/incanter-processing-clojue.html' title='incanter processingを試す その３ /clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-3LwoP1GGDqE/TeYzHmBG0YI/AAAAAAAAARY/SzpCg9_cSEY/s72-c/proc_example1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-3559721574263011842</id><published>2011-05-27T18:57:00.009+09:00</published><updated>2011-05-29T15:47:47.478+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cellar automata'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='incanter'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>incanter processingを試す２ １次元セルオートマトン /clojure</title><content type='html'>incanter-processingも少しいじってるうちに扱いが分かるようになってきたけど、本来使おうとしてることに不適当かなと感じてるので、今後本格的に使うかどうかわからない。&lt;br /&gt;&lt;br /&gt;今回の例は１次元セルオートマトンを利用したものです。１次元セルオートマトンは多くの方も知ってるだろうし、プログラムもあちこち出回っています。もちろん、ライフゲームも含めてよく見かけますね。だから、ただのプログラムよりちょっとひねってしまうことをやってます。セルオートマトンでよく見かけるのは次のセルの状態を決めるルールはルール３０というものを主に使ってるのですが、他のルールでも可能にしたものです。このルール３０ってのは２進数で表せば00011110Bとかけるので、これが隣接するセルで生成する状態のルールを表してます。隣接するものと中央のセルの状態が010ならばこれを２進数と見れば１０進数に直すと4ですね。30を２進数で表したところの４ビット目が1であるが、それが次の状態を決めるということです。つまり、全てで２５５ルールあるってことですね。使い方は下のソースを見てもらえばいいですが、例によってここでソースを書くと一部チウ記述に自動的になってしまうのでgithubの方を参考にしてもらえればいいです。ちなみに、ルールごとに関数を作りやすいように、今回は関数で関数を作るようにしています。つまり、(print-1dca 30)というのはこれそのものが関数で、ルール３０の１次元セルオートマトンを表示する関数ということになってます。いくつかのルールはwikipedia上でも説明されていますし、そのURLもソース中に示していmす。&lt;br /&gt;&lt;br /&gt;次に、incanter processingを使ったものですが、普通によくあるセルを表示するものにしようかと思ったんですが。。。&lt;br /&gt;&lt;br /&gt;ここは、２４個の２進数のリストを使って、色として表すようにしています。それが下の図です。これはある時のスナップショットですが、このダーツのマトが色変化をします。ただし、注意書きですが、&lt;b&gt;&lt;span class="Apple-style-span"&gt;癲癇を持ってる方は使わないでください&lt;/span&gt;&lt;/b&gt;。なぜなら、利用する初期状態（セルのリスト）やルール次第で、色変化が大変激しくなるからです。そのためにフレームレートを下げています。ルールや初期状態しだいでは穏やかな変化を示すものもありますし、不規則か規則かわからないような変化も当然出てきたり、簡単なパターンや白や黒あるいは他の色に固定されることもあったりします。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-Z64Fpe6ssfw/Td94HQCsZVI/AAAAAAAAAQE/ihzmvIE4kGA/s1600/Screenshot-Processing%2BSketch.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 212px; height: 185px;" src="http://3.bp.blogspot.com/-Z64Fpe6ssfw/Td94HQCsZVI/AAAAAAAAAQE/ihzmvIE4kGA/s320/Screenshot-Processing%2BSketch.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5611335726687610194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://gist.github.com/994998"&gt;https://gist.github.com/994998&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;;;; -*- Mode: Clojure; Coding: utf-8 -*-&lt;br /&gt;;;;&lt;br /&gt;;;; one-d-cd.clj - a library for one dimention cellar automata&lt;br /&gt;;;;&lt;br /&gt;;;; Copyright (C) 2011 by Yasuto TAKENAKA  y.takenaka@gmail.com&lt;br /&gt;;;;&lt;br /&gt;;;;                       Time-stamp: &amp;lt;2011-05-27 18:55:54 yasuto&amp;gt;&lt;br /&gt;;;;                       License   : http://en.wikipedia.org/wiki/MIT_License&lt;br /&gt;;;;&lt;br /&gt;&lt;br /&gt;(ns one-d-ca.core&lt;br /&gt;(:use (incanter core processing)))&lt;br /&gt;&lt;br /&gt;(defn- create-transition-rule&lt;br /&gt;"create the transition rule list"&lt;br /&gt;[rule]&lt;br /&gt;(map #(bit-test rule %) (range 8)))&lt;br /&gt;&lt;br /&gt;(defn- create-indexed-transition-rule&lt;br /&gt;[rule]&lt;br /&gt;(let [transition-rule (create-transition-rule rule)]&lt;br /&gt; (map-indexed list transition-rule)))&lt;br /&gt;&lt;br /&gt;(defn- cell-transition&lt;br /&gt;"detarmine the next statement of the cell from its present statement"&lt;br /&gt;[rule]&lt;br /&gt;(fn [n]&lt;br /&gt; (second (first (filter #(if (= (first %) n)&lt;br /&gt;        (second %))&lt;br /&gt;     (create-indexed-transition-rule rule))))))&lt;br /&gt;&lt;br /&gt;(defn- present-state&lt;br /&gt;"check the current pattern from a center cell with its neighbors"&lt;br /&gt;[l c r]&lt;br /&gt;(+ (bit-shift-left l 2) (bit-shift-left c 1) r))&lt;br /&gt;&lt;br /&gt;(defn transition&lt;br /&gt;"calculate a cell transition. This is a function generating&lt;br /&gt;a function besed on a transition rule ,'rule'."&lt;br /&gt;[rule]&lt;br /&gt;(let [cell-trans-fn (cell-transition rule)]&lt;br /&gt; (fn [coll]&lt;br /&gt;   (let [len (count coll)&lt;br /&gt;    cycoll (drop (dec len) (cycle coll))]&lt;br /&gt;(for [i (range len)]&lt;br /&gt;  (let [cells (take 3 (drop i cycoll))]&lt;br /&gt;    (if (cell-trans-fn (apply present-state cells))&lt;br /&gt;      1 0)))))))&lt;br /&gt;&lt;br /&gt;(defn print-1dca&lt;br /&gt;"print one-dimention celler automata. e.g, ((print-1dca 30) coll)"&lt;br /&gt;[rule]&lt;br /&gt;(fn [n init-state]&lt;br /&gt;   (doseq [i (take n (iterate (transition rule) init-state))]&lt;br /&gt; (println (apply str&lt;br /&gt;   (map #(if (zero? %) " " "*") i))))))&lt;br /&gt;&lt;br /&gt;;; #Example http://en.wikipedia.org/wiki/Rule_30&lt;br /&gt;;; one-d-ca.core&amp;gt; ((print-1dca 30) 10 [0 0 0 0 0 1 0 0 0 0 0 ]) ; 30=00011110B&lt;br /&gt;;;      *  &lt;br /&gt;;;     *** &lt;br /&gt;;;    **  *&lt;br /&gt;;;   ** ****&lt;br /&gt;;;  **  *   *&lt;br /&gt;;; ** **** ***&lt;br /&gt;;;    *    *&lt;br /&gt;;;   ***  ***&lt;br /&gt;;;  **  ***  *&lt;br /&gt;;;  * ***  ***&lt;br /&gt;;; nil&lt;br /&gt;;;((print-1dca 90) 8 [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]) ; the Sierpinski gasket&lt;br /&gt;;;&lt;br /&gt;;; c.f. http://en.wikipedia.org/wiki/Category:Cellular_automaton_rules&lt;br /&gt;;;&lt;br /&gt;&lt;br /&gt;(defn list-&amp;gt;8bit [coll]&lt;br /&gt;(reduce (fn[x y]&lt;br /&gt;    (+ x (bit-shift-left (second y)&lt;br /&gt;    (first y))))&lt;br /&gt;  0 (map-indexed list coll)))&lt;br /&gt;&lt;br /&gt;(defn to-rgb [coll]&lt;br /&gt;(map #(list-&amp;gt;8bit %)&lt;br /&gt;    (partition 8 coll)))&lt;br /&gt;&lt;br /&gt;(defn onedca-color&lt;br /&gt;"CAUTION: DO NOT USE IF YOU HAVE EPILEPTIC.&lt;br /&gt;watch the color animation of one dimention cellar automata.&lt;br /&gt;this requires a list containing 24 elements of 0 or 1 because&lt;br /&gt;this generates 24-bit color. "&lt;br /&gt;[rule]&lt;br /&gt;(fn [init-list &amp;amp; {:keys [rate] :or {rate 1.5}}]&lt;br /&gt; (let [dynamics (ref (iterate (transition rule) init-list))&lt;br /&gt;  sktch (sketch&lt;br /&gt;  (setup []&lt;br /&gt;  (doto this&lt;br /&gt;    (size 200 200)&lt;br /&gt;    (background 255 255 255)&lt;br /&gt;    (framerate rate)&lt;br /&gt;    smooth&lt;br /&gt;    no-stroke))&lt;br /&gt;  (draw []&lt;br /&gt;        (let [current (first @dynamics)&lt;br /&gt;       [r g b] (to-rgb current)&lt;br /&gt;       x (/ (width this) 2)&lt;br /&gt;       y (/ (height this) 2)]&lt;br /&gt;   (doto this&lt;br /&gt;     (background 255 255 255)&lt;br /&gt;     (fill r g b)&lt;br /&gt;     (ellipse x y 135 135)&lt;br /&gt;     (fill b r g)&lt;br /&gt;     (ellipse x y 85 85)&lt;br /&gt;     (fill g b r)&lt;br /&gt;     (ellipse x y 40 40)&lt;br /&gt;     )&lt;br /&gt;   (dosync&lt;br /&gt;    (ref-set dynamics (drop 1 @dynamics))))))]&lt;br /&gt;   (view sktch :size [200 200]))))&lt;br /&gt;&lt;br /&gt;;;&lt;br /&gt;;; one-d-ca.core&amp;gt; ((onedca-color 30) [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ])&lt;br /&gt;;; one-d-ca.core&amp;gt; ((onedca-color 90) [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ])&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-3559721574263011842?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/3559721574263011842/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/incanter-processing-clojure_27.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/3559721574263011842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/3559721574263011842'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/incanter-processing-clojure_27.html' title='incanter processingを試す２ １次元セルオートマトン /clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Z64Fpe6ssfw/Td94HQCsZVI/AAAAAAAAAQE/ihzmvIE4kGA/s72-c/Screenshot-Processing%2BSketch.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-2579136379384678102</id><published>2011-05-25T19:37:00.026+09:00</published><updated>2011-06-15T04:37:01.066+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>forマクロ / clojure</title><content type='html'>forは内包表記として知られてるんですが、こちらはこちらでmapとはまた違った使い方にも対応していて便利な所がありますね。変数同士での条件付きループならこちらのほうが便利な場合もあります。例えば、x+y=5 を満たすx yの組み合わせを見つけろというならば、&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;user&amp;gt; (for [x (range 6) y (range 6) :when  (= 5 (+ x y))] [x y])&lt;br /&gt;([0 5] [1 4] [2 3] [3 2] [4 1] [5 0])&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;同等なものをmapなどでつくろうとしたらこれほど簡単に書けない所があるしね。&lt;br /&gt;&lt;br /&gt;他には偶数や奇数だけを取り出すというのならこのようなことも出来ます。(keepと同等)&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;user&amp;gt; (for [ x (range 10) :when (odd? x)] x)&lt;br /&gt;(1 3 5 7 9)&lt;br /&gt;user&amp;gt; (keep #(if(odd? %) %) (range 10))&lt;br /&gt;(1 3 5 7 9)&lt;br /&gt;user&amp;gt; (for [ x (range 10) :when (even? x)] x)&lt;br /&gt;(0 2 4 6 8)&lt;br /&gt;user&amp;gt; (keep #(if(even? %) %) (range 10))&lt;br /&gt;(0 2 4 6 8)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;次にトランプカードを例に更に複雑なものをforで扱ってみましょう。D,H,S,Cダイヤ、ハート、スペード、クラブとあらわしてx変数にリストとして格納して、A,J,Q,Kはエース、ジャック、クィーン、キングとそれぞれを表し、数字はy変数にリストとして格納します。ここから絵札だけを取り出すとしますね。そのために、trump-card-numberという関数を作って絵札を数字に表し直しています。そこでforないにキーワードletで新たに変数zをつくって、trump-card-numberで変換した数字を格納します。このzが キーワードwhen で zが10以上と書けばおしまいです。この手のことを使うならば、forの表記の強力さを感じられるようになっています。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://gist.github.com/990795"&gt;https://gist.github.com/990795&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;user&amp;gt; (defn trump-card-number [n]&lt;br /&gt;(cond (= n 'A) 1&lt;br /&gt;(= n 'J) 11&lt;br /&gt;(= n 'Q) 12&lt;br /&gt;(= n 'K) 13&lt;br /&gt;:else n))&lt;br /&gt;#'user/trump-card-number&lt;br /&gt;user&amp;gt; (for [x '(D H S C) y '(A 2 3 4 5 6 7 8 9 10 J Q K)&lt;br /&gt;:let [z (trump-card-number y)] :when (&amp;gt; z 10)] (str x y))&lt;br /&gt;("DJ" "DQ" "DK" "HJ" "HQ" "HK" "SJ" "SQ" "SK" "CJ" "CQ" "CK")&lt;br /&gt;user&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;このように、文字列と数字が混じったシーケンスで条件を与えて、結果を取り出すときには、forはすっきりした書き方ができるというところです。キーワード変数のlet,when,whileを知らなくても使えるけど、知ればもっと強力に使えるということでもありますよ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-2579136379384678102?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/2579136379384678102/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/for.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/2579136379384678102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/2579136379384678102'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/for.html' title='forマクロ / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-6592575730354579628</id><published>2011-05-19T20:28:00.008+09:00</published><updated>2011-05-19T21:01:04.493+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>多重ループをマクロでまとめる / clojure</title><content type='html'>多重ループって多次元配列を扱うときや重複を許す組み合わせを全て出すときによく記述しますが、見た目も汚いし、美的な観点からも簡潔に書くという観点からもあまり良いものではないが、必要悪になってますね。clojureは幸いlisp系でそこそこのところまでマクロで記述できるのは大変な強みです。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そこで 多重ループをマクロで簡潔にしてしまいましょう。本当はマクロでマクロを作るという形でdoseq/dotimesの両方を定義しようと思ったけど、マクロでマクロを定義するのが上手く行かないので、方針を変えて、一部は関数で書いて出力をマクロという形をとっています。この形で関数をコンパイルするときはコンパイラからは多重ループを記述した時と同じに見えるようになってます。&lt;/div&gt;&lt;div&gt;定義したマクロはnested-dotimesとnested-doseqですが、使用方法はソース内のサンプルを見れば一目瞭然でしょう。三重ループですら&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;(nested-dotimes [i 10 j 20 k 30] (print (+ i j k)))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;でかけるので１行ですみます。変数はシーケンスの最初から後ろの変数の順番は多重ループの内側から外側に対応しています。これで ２重だけじゃなくて ５重だろうが６重だろうが同じで済みます。（もっとも、３重までしかほとんどでは使わないでしょう。)nested-do-関数は魔術みたいに視えるかもしれないけど、複雑なマクロを書くときはこのように、基本的なシーケンスを扱う関数・マクロを遊んでるといいですね。この関数もマクロ化しようかと思ったけど、別にそこまでこだわる必要はないしもういいか。。。と思いました。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;;; * a utility for loop manipulation&lt;br /&gt;;; nested-do- is a utilit for nestedo-doseq/nested-dotimes&lt;br /&gt;&lt;br /&gt;(defn- nested-do- [doname bindings &amp;amp body]&lt;br /&gt; (let [binds (map #(vec %)&lt;br /&gt;    (partition 2 bindings))]&lt;br /&gt;   (reduce #(if (list? %1)&lt;br /&gt;            (list doname %2 %1)&lt;br /&gt;            (reverse (into (list %2 doname) %1)))&lt;br /&gt;    (concat body binds))))&lt;br /&gt;&lt;br /&gt;;; an example for how to use nested-dotimes is as following:&lt;br /&gt;;; user&amp;gt; (macroexpand-1 '(nested-dotimes [i 10 j 20 k 30] (print (+ i j k))))&lt;br /&gt;;;(dotimes [k 30]&lt;br /&gt;;;  (dotimes [j 20]&lt;br /&gt;;;    (dotimes [i 10]&lt;br /&gt;;;      (print (+ i j k)))))&lt;br /&gt;;;&lt;br /&gt;;; so, it is equal to nested dotimeses. nested-doseq also is a similar utility.&lt;br /&gt;;;&lt;br /&gt;;; Example 2:&lt;br /&gt;;; user&amp;gt; (def foo (make-array Integer 10 10 10))&lt;br /&gt;;; #'user/foo&lt;br /&gt;;; user&amp;gt; (nested-dotimes [i 10 j 10 k 10]&lt;br /&gt;;;  (aset foo i j k (+ i j k)))&lt;br /&gt;;; nil&lt;br /&gt;;; user&amp;gt; (aget foo 7 8 9)&lt;br /&gt;;; 24&lt;br /&gt;&lt;br /&gt;(defmacro nested-dotimes [bindings &amp;amp body]&lt;br /&gt;   (let [result# (nested-do- 'dotimes bindings body)]&lt;br /&gt;     `~result#))&lt;br /&gt;&lt;br /&gt;;; an example of nested-doseq:&lt;br /&gt;;; user&amp;gt; (macroexpand-1&lt;br /&gt;;;       '(nested-doseq [i (map char (range 70 75))&lt;br /&gt;;;         j (map char (range 80 85))]&lt;br /&gt;;;          (println  i j )))&lt;br /&gt;;; (doseq [j (map char (range 80 85))]&lt;br /&gt;;;   (doseq [i (map char (range 70 75))]&lt;br /&gt;;;     (println (str i j))))&lt;br /&gt;&lt;br /&gt;(defmacro nested-doseq [bindings &amp;amp body]&lt;br /&gt; (let [result# (nested-do- 'doseq bindings body)]&lt;br /&gt;   `~result#))&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;この記事で示したソースは不必要なものが自動的についてしまうようです。（＆が自動的に変換されるため。）ソースはgithubからどうぞ&lt;a href="https://gist.github.com/980582"&gt;https://gist.github.com/980582&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-6592575730354579628?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/6592575730354579628/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/clojure.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6592575730354579628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6592575730354579628'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/clojure.html' title='多重ループをマクロでまとめる / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-9221073009706317257</id><published>2011-05-15T22:10:00.008+09:00</published><updated>2011-05-29T15:48:01.498+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='incanter'/><category scheme='http://www.blogger.com/atom/ns#' term='processing'/><title type='text'>incanter processing を試す/ clojure</title><content type='html'>グラフィック関連のことを知りたかったので調べたらincanterというライブラリがありました。R的なことをclojureでするということができちゃうようですね。R以前にあったxlispstatという物があったけど、それの現代版という印象でしょうか。Rもschemeの影響をうけてるし、オブジェクト指向もCLOSと同じ考えだし、Rってlispとは相性はいいとは思う。このパッケージなら正規乱数も用意されてそうだなぁ。&lt;br /&gt;&lt;br /&gt;さて、このclojureではincanterは有名なようで、あの充実っぷりはかなりのものかな。と思った。processingやcolt,Jfreechartも巻き込んでるのでシミュレーションをするときには願ったりかなったりのライブラリですね。それだけ幅広いものを扱うだけに全容を追いかけるのは時間が必要ですが、incanterのprocessingモジュールはcl-processingからのフォークのようです。&lt;br /&gt;&lt;br /&gt;話はもどって、グラフィック関連のことを早速試してみた。ただサンプルを動かすんじゃなくて、なんか作ってみようと考えてました。最初はランダムウォークでもつくってみればいいかとは思ったんだけど、プログラミングをしてると目への負担が大きいので目のマッサージ目的のものを作ってみようと思った。そこで。。。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://gist.github.com/973156"&gt;https://gist.github.com/973156&lt;/a&gt; ここに一応置いてあります。&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;(use '(incanter core processing))&lt;br /&gt;(defn rand-range [edge radious]&lt;br /&gt;(+ (int (rand (- edge (* 2 radious)))) radious))&lt;br /&gt;&lt;br /&gt;(defn eye-massager [speed sx sy]&lt;br /&gt;(let [radious (ref 100.0)&lt;br /&gt; x (ref nil)&lt;br /&gt; y (ref nil)&lt;br /&gt; size-x sx&lt;br /&gt; size-y sy&lt;br /&gt; sktch (sketch&lt;br /&gt;        (setup []&lt;br /&gt;        (doto this&lt;br /&gt;   (size size-x size-y)&lt;br /&gt;   (background 196)&lt;br /&gt;   (framerate speed)&lt;br /&gt;   smooth))&lt;br /&gt;        (draw []&lt;br /&gt;       (dosync&lt;br /&gt;        (ref-set x (rand-range (width this) @radious))&lt;br /&gt;        (ref-set y (rand-range (height this) @radious))&lt;br /&gt;        )&lt;br /&gt;       (doto this&lt;br /&gt;         (background (color 196 255 196))&lt;br /&gt;         (fill 255 128 0)&lt;br /&gt;         (ellipse @x @y @radious @radious))))]&lt;br /&gt;(view sktch :size [size-x size-y])))&lt;br /&gt;&lt;br /&gt;;; user&amp;gt; (eye-massager 10 1680 1000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;incanterのパッケージはこれからゆっくり中身を見てみようと思います。必要そうなものから覚えて使おうって思ってる。(eye-massager 10 1680 1000)というのは最初の引数がフレーム数(10では早いかもしれない。疲れすぎの場合は1か2くらいでいい) オレンジの円を１−３分くらい追いかけてみるといいです。1680はフレームの横幅 1000は縦幅です。グラフィック絡みのプログラムはどうしても見た目が汚くなりがちですね。できればマクロで糖衣したいんですけどね。適度な糖衣は見極めてからでいいかと思ってます。また、コンタクトレンズをしている人は目を傷つける可能性があるからやめてね。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://gist.github.com/970660"&gt;https://gist.github.com/970660&lt;/a&gt; こちらはおまけ sort/sort-by/Priority(Blocking)Queueを構造体を利用したデータで使う場合の練習です。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-9221073009706317257?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/9221073009706317257/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/incanter-processing-clojure.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/9221073009706317257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/9221073009706317257'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/incanter-processing-clojure.html' title='incanter processing を試す/ clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-8434042391098315700</id><published>2011-05-11T19:41:00.009+09:00</published><updated>2011-05-11T20:28:33.152+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><title type='text'>lazy-shuffle / clojure</title><content type='html'>ランダムシャッフルは'shuffle'がclojureの標準関数としてあるんですけど、遅延ランダムシャッフルというのを作ってみた。これはfisher yeats法というランダムシャッフルで早い方法があるけど、あのアルゴリズムを見てると、遅延版は簡単に作れそうだと思ったので作ってみた。わかり易い説明は&lt;a href="http://www.maeyan.com/blognplus/index.php?e=66"&gt;ここ&lt;/a&gt;にあります。この説明では後ろから入れ替えてるけど、前から入れ替えるようにして、その前の要素をとりだしたあとに同じ動作をするような形で遅延操作をさせています。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;これは作成したlazy-shuffleとshuffleの比較。 0から999までの数列から１０個をランダムに取り出すというものです。&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;user&amp;gt; (time (lazy-shuffle (range 1000) 10))&lt;br /&gt;"Elapsed time: 0.199614 msecs"&lt;br /&gt;(41 838 249 657 708 559 897 167 865 659)&lt;br /&gt;user&amp;gt; (time (take 10 (shuffle (range 1000))))&lt;br /&gt;"Elapsed time: 1.707102 msecs"&lt;br /&gt;(440 827 150 198 109 72 30 102 328 414)&lt;br /&gt;user&amp;gt; (time (lazy-shuffle (range 1000) 10))&lt;br /&gt;"Elapsed time: 0.581405 msecs"&lt;br /&gt;(594 569 112 329 287 174 189 927 903 880)&lt;br /&gt;user&amp;gt; (time (take 10 (shuffle (range 1000))))&lt;br /&gt;"Elapsed time: 15.230183 msecs"&lt;br /&gt;(718 704 163 400 391 287 175 796 115 834)&lt;br /&gt;user&amp;gt; (time (lazy-shuffle (range 1000) 10))&lt;br /&gt;"Elapsed time: 0.206874 msecs"&lt;br /&gt;(356 142 80 403 3 121 160 224 443 663)&lt;br /&gt;user&amp;gt; (time (take 10 (shuffle (range 1000))))&lt;br /&gt;"Elapsed time: 6.538013 msecs"&lt;br /&gt;(420 498 196 922 311 44 741 708 647 377)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;これをみてもやはり、遅延させていたことはかなり効果が出ていることがわかります。標準関数のshuffleを使ったもので1.7-15.2秒ほど 遅延版で 0.19-0.58秒なんですからね。1000個の要素で3-80倍の違いですかね。このように要素が比較的多くシャッフルしたものを全部必要としないような条件でランダムシャッフルが必要ならば、遅延版はいいと言えるかもしれません。&lt;br /&gt;&lt;br /&gt;ソースは下にあります。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;(defn create-shuffle-object [lst]&lt;br /&gt;  (map #(ref %) lst))&lt;br /&gt;&lt;br /&gt;(defn swap-elements [el1 el2]&lt;br /&gt;  (let [tmp @el1]&lt;br /&gt;    (dosync (ref-set el1 @el2)&lt;br /&gt;     (ref-set el2 tmp))))&lt;br /&gt;&lt;br /&gt;(defn lazy-shuffle-core [s-lst len]&lt;br /&gt;  (lazy-seq&lt;br /&gt;   (if (= 1 len)&lt;br /&gt;     s-lst&lt;br /&gt;     (let [fst-el (first s-lst)&lt;br /&gt;    rst (rest s-lst)&lt;br /&gt;    nlen (dec len)&lt;br /&gt;    swap-el (nth rst (int (rand nlen)))]&lt;br /&gt;       (swap-elements fst-el swap-el)&lt;br /&gt;       (cons fst-el (lazy-shuffle-core rst nlen))))))&lt;br /&gt;&lt;br /&gt;(defn fetch-elements [s-lst]&lt;br /&gt;  (map (fn [el] @el) s-lst))&lt;br /&gt;&lt;br /&gt;(defn lazy-shuffle [lst fetch-len]&lt;br /&gt;  (let [len (count lst)&lt;br /&gt; s-lst (create-shuffle-object lst)]&lt;br /&gt;    (if (&gt; fetch-len len)&lt;br /&gt;      (fetch-elements (take len (lazy-shuffle-core s-lst len)))&lt;br /&gt;      (fetch-elements (take fetch-len (lazy-shuffle-core s-lst len))))))&lt;br /&gt;&lt;br /&gt;;; example&lt;br /&gt;;; user&gt; (lazy-shuffle (range 100) 10)&lt;br /&gt;;; (29 85 4 52 47 42 95 37 71 90)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-8434042391098315700?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/8434042391098315700/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/lazy-shuffle-clojure.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/8434042391098315700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/8434042391098315700'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/lazy-shuffle-clojure.html' title='lazy-shuffle / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-7502331888644909876</id><published>2011-05-10T17:47:00.011+09:00</published><updated>2011-05-10T21:55:35.300+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><title type='text'>box muller / clojure</title><content type='html'>久々にclojureを少しいじってみた。案外忘れてないもんだな。というのが率直な感想です。&lt;br /&gt;&lt;br /&gt;これはbox-mullerという正規乱数を発生させるアルゴリズムでいくつかの細工をしています。box-mullerでは一度に２つの正規乱数を作ってしまうので、片方を捨ててつくり直すのは大変もったいないということで、残りは*rnorm-temp*変数に置いておくようにしています。(&lt;tt&gt;lazy-unit-nrand&lt;/tt&gt;)もうひとつの工夫というのは、このプログラムでは、x ∈ [-1,1]の乱数の遅延シーケンスを作成して、そこから２つ取り出します。これを(x,y)点として、それが原点から半径１以内になるものを返すようにする。もし、範囲から外れたときは、一つだけ乱数を捨てて、その後に新たに乱数をひとつ作成させています。(&lt;tt&gt;two-randoms-within-clrcle&lt;/tt&gt;)まだ、作りたてということもあってプレリミナリ版です。乱数は付属のものを使ってるけど、base-rand関数を改変すれば、他の乱数ジェネレータを代用することは簡単です。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-dO-20Yk2TYk/TckV-NoMeuI/AAAAAAAAAP8/MuzedUosq78/s1600/nrand.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 242px;" src="http://4.bp.blogspot.com/-dO-20Yk2TYk/TckV-NoMeuI/AAAAAAAAAP8/MuzedUosq78/s320/nrand.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5605035369793616610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;このグラフは下のプログラムから２０００個の正規乱数(μ=0.0,σ=1.0)を可視化したものです。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre class="brush: clojure"&gt;&lt;br /&gt;;;; -*- Mode: Clojure; Coding: utf-8 -*-&lt;br /&gt;;;;&lt;br /&gt;;;; box-muller/src/core.clj - utilities for the box muller method&lt;br /&gt;;;;&lt;br /&gt;;;; Copyright (C) 2011 by Yasuto TAKENAKA &lt;br /&gt;;;; &lt;br /&gt;;;;                       Time-stamp: &lt;2011-05-10 19:37:08 yasuto&gt;&lt;br /&gt;;;;                       License   : http://en.wikipedia.org/wiki/MIT_License&lt;br /&gt;;;;&lt;br /&gt;;;; This is a clojure script of the box-muller method, a manner of generating&lt;br /&gt;;;; normal random numbers.&lt;br /&gt;;;;&lt;br /&gt;;;; CAUTION: This is a preliminary version and has not been tested sufficiently.&lt;br /&gt;;;;&lt;br /&gt;&lt;br /&gt;(ns box-muller.core&lt;br /&gt;  (:use clojure.contrib.generic.math-functions))&lt;br /&gt;&lt;br /&gt;(def *rnorm-temp* (ref '()))&lt;br /&gt;&lt;br /&gt;;; base-rand requires the rand function of clojure. If you hope to use another &lt;br /&gt;;; random number generator instead of this standard one, you would rewrite&lt;br /&gt;;; this 'base-rand' function.&lt;br /&gt;&lt;br /&gt;(defn- base-rand []&lt;br /&gt;  "generate a floting random number between -1.0 and 1.0."&lt;br /&gt;  (- (rand 2.0) 1.0))&lt;br /&gt;&lt;br /&gt;(defn- lazy-randoms []&lt;br /&gt;  "generate a lazy random sequence."&lt;br /&gt;  (lazy-seq&lt;br /&gt;   (cons (base-rand) (lazy-randoms))))&lt;br /&gt;&lt;br /&gt;(defn- sum-of-squares [^List points]&lt;br /&gt;  (let [^Float x (first points)&lt;br /&gt; ^Float y (second points)]&lt;br /&gt;    (+ (* x x) (* y y))))&lt;br /&gt;&lt;br /&gt;;; The below function requires 'clojure.contrib.generic.math-functions' due to&lt;br /&gt;;; using 'sqrt' and 'log'. It might be no problem to use 'Math/Sqrt' and &lt;br /&gt;;; 'Math/log' instead of these.&lt;br /&gt;&lt;br /&gt;(defn- two-randoms-within-clrcle [rnd-list]&lt;br /&gt;  (let [two-rands (take 2 rnd-list)&lt;br /&gt; sos (sum-of-squares rnd-list)]&lt;br /&gt;      (if (&lt;= sos 1.0)&lt;br /&gt; (map (fn [n] (* (sqrt (/ (* -2.0 (log sos)) sos)) n))&lt;br /&gt;      two-rands)&lt;br /&gt; (recur (drop 1 rnd-list)))))&lt;br /&gt;&lt;br /&gt;(defn lazy-unit-nrand []&lt;br /&gt;  "generate a sequence of unit normal randoms with the mean of 0 and the&lt;br /&gt;   standard deviation of 1."&lt;br /&gt;  (lazy-seq&lt;br /&gt;   (if (= @*rnorm-temp* '())&lt;br /&gt;     (let [rands (two-randoms-within-clrcle (lazy-randoms))]&lt;br /&gt;       (dosync (ref-set *rnorm-temp* (rest rands)))&lt;br /&gt;       (cons (first rands) (lazy-unit-nrand)))&lt;br /&gt;     (let [rdn (first @*rnorm-temp*)]&lt;br /&gt;       (dosync (ref-set *rnorm-temp* '()))&lt;br /&gt;       (cons rdn (lazy-unit-nrand))))))&lt;br /&gt;&lt;br /&gt;(defn lazy-nrand [^Float mu ^Float sigma]&lt;br /&gt;  "generate a lazy sequence of random normal numbers."&lt;br /&gt;  (map (fn [^Float unr] (+ (* unr sigma) mu)) (lazy-unit-nrand)))&lt;br /&gt;&lt;br /&gt;(defn unit-nrand []&lt;br /&gt;  "return a unit random normal number."&lt;br /&gt;  (first (lazy-unit-nrand)))&lt;br /&gt;&lt;br /&gt;(defn nrand [^Float mu ^Float sigma]&lt;br /&gt;  "generate a random normal number."&lt;br /&gt;  (+ (* (first (lazy-unit-nrand)) sigma) mu))&lt;br /&gt;&lt;br /&gt;;; examples&lt;br /&gt;;;  &gt; (unit-nrand)                   ; get a unit normal random number&lt;br /&gt;;;  &gt; (take 10 (lazy-nrand 0.0 1.0)) ; take ten of unit normal random numbers&lt;br /&gt;;;  &gt; (nrand 0.0 1.0)                ; get a unit normal random number&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-7502331888644909876?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/7502331888644909876/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/box-muller-clojure.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/7502331888644909876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/7502331888644909876'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/box-muller-clojure.html' title='box muller / clojure'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-dO-20Yk2TYk/TckV-NoMeuI/AAAAAAAAAP8/MuzedUosq78/s72-c/nrand.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5490593135688721447.post-6345155890160028725</id><published>2011-05-09T21:59:00.005+09:00</published><updated>2011-05-10T01:47:19.214+09:00</updated><title type='text'>はじめに</title><content type='html'>こちらは雑談系より技術的なログになる予定。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;久々にclojureを触ったけど、新しい言語だけに環境の変化が非常に激しいですね。leiningenやcakeというプロジェクト作成支援のものも最近は確立されてきてるようでずいぶん使いやすさがよくなったようですね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ウチの環境ではなぜかleiningenとemacs+slime環境で上手く動作をしてくれないらしい。たぶん、利用しているバージョンに関連する何かが影響しているようだし、そのうち解決策が出てくると思う。一方でcakeは上手く動いてくれている。こちらはバックグラウンドでプロジェクトを動かせるようにしていたり、プロセスの管理もできるようでいろんなプロジェクトを並行して作ってる人なら使いやすい環境なのではなかろうかと思いましたね。emacs+slime+cakeは上手く動いてくれるようで何かをするとなればこちらかなと思ってる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;当初は様々なことをCommon lispで行うことを前提で考えてきたけど、Common lispは便利なんですが、環境依存になりやすい所がOSによって使い辛いことがあったりしてこの点がちょっと残念なんですよね。そこでlisp系のclojureを意識をし始めたけど、こちらは変化がはやくってまだ枯れてない所が強みであり弱みかな。と感じてる。いざ活用をしようと考えたところで浦島になってしまう点がいいのか悪いのか？というところです。haskellも面白いな。とは思ってるんですが、こちらはさほど調べてるところまで行かない。作るなら美しく速くというコードが一番の理想なんだけど、さてどうなるやらね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;blogger.comもupdated editor (recommended) では上手く動かなかったのでold editorで記事を書いてます。ウチの環境はUbuntu 10.04LTS(64bit)で運用してるから、updatedはまだ未対応なのか？という影響があるんでしょうね。 Linux環境も大昔に比べればすごく良くなったな。と思う。CUIとGUIの使い分けが一番触りやすい環境です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これは計算機関連の話かな。他はどうするかな。いずれにしても本館とは色合いを変えてみる予定です。自分を枠にはめずに書ければいいかな。狭いところに押し込めたところで自分らしさはなくなっちゃうし、それは避けたいと思う。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5490593135688721447-6345155890160028725?l=ytakenaka.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ytakenaka.blogspot.com/feeds/6345155890160028725/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6345155890160028725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5490593135688721447/posts/default/6345155890160028725'/><link rel='alternate' type='text/html' href='http://ytakenaka.blogspot.com/2011/05/blog-post.html' title='はじめに'/><author><name>Yasuto TAKENAKA</name><uri>http://www.blogger.com/profile/05349591936656628196</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Ax6SUjK9OdM/TMx4vHYM02I/AAAAAAAAAOY/pJtropDgZO0/S220/746392fcdb9deb7d5c1720940b87eb78'/></author><thr:total>0</thr:total></entry></feed>
