<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>八発白中</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/" />
    <link rel="self" type="application/atom+xml" href="http://e-arrows.sakura.ne.jp/atom.xml" />
    <id>tag:e-arrows.sakura.ne.jp,2008-12-17://3</id>
    <updated>2010-02-04T01:22:46Z</updated>
    <subtitle>9月に脱Perl宣言。Lispハッカーを目指して修行中です。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.23-ja</generator>

<entry>
    <title>社内LTで「手嶋屋を愛する人たちへ」を発表しました</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/02/tejimayanize-lt.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.142</id>

    <published>2010-02-03T07:52:43Z</published>
    <updated>2010-02-04T01:22:46Z</updated>

    <summary>　最近、手嶋屋内で「AB型こわい」という声が聞こえるたびに反応してしまいます。怖...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Clojure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　最近、手嶋屋内で「AB型こわい」という声が聞こえるたびに反応してしまいます。怖くないよ！ 僕怖くないよ！</p>

<p>　AB型というとよく「あぁ、変人の」って言われますが、こわいって言われるのは初めてですね。もともと変な人の多い手嶋屋だから、ちょっとやそっと変でも目立たないのかもしれません。</p>

<p>僕「手嶋屋に変じゃない人っているんですか？」</p>

<p>　いないですよそんなの。僕以外。</p>

<p>　そんな手嶋屋で、今日も社内LTをやりました。</p>
]]>
        <![CDATA[<h1>Google化する世界</h1>

<p>　Web業界ではGoogleはもはやMicrosoftを超える巨人ですね。日本ではそれを表すかのように「Google化」とかよく言われます。</p>

<p>　また、外部の人たちだけでなく、Googleは社員も自分たちのことを「Googler」と言ったりして、常にGoogleらしさを考えていることを思わせます。</p>

<p>　それに対して日本の企業は？ 手嶋屋は？</p>

<h1>手嶋屋化する世界</h1>

<p>　手嶋屋化する世界とは何でしょう？ やっぱりOpenPNE？ SNS？ FKSS？</p>

<p>　いやいや、手嶋屋と言えばもっと重要なものがあるでしょう。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/tejimaya-84.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/tejimaya-84.html','popup','width=627,height=417,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/tejimaya-thumb-400x266-84.png" width="400" height="266" alt="社長の手嶋守" class="mt-image-none" style="" /></a></span></p>

<p>　一度見たら忘れられない。のれんをくぐる手嶋さん。</p>

<p>　そうだ！ ここは社長を見習って会社が一つにまとまるべきだ！</p>

<h1>Clojureでtejimayanize</h1>

<p>　という流れでみんなで手嶋屋化されてみました。</p>

<p><br /></p>

<p>　まずは言い出しっぺの僕から手嶋屋化。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/redhat-91.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/redhat-91.html','popup','width=400,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/redhat-thumb-160x160-91.png" width="160" height="160" alt="redhat.png" class="mt-image-none" style="" /></a></span></p>

<p>　ﾁﾗｯ。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/redhat-t-94.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/redhat-t-94.html','popup','width=400,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/redhat-t-thumb-160x160-94.png" width="160" height="160" alt="redhat-t.png" class="mt-image-none" style="" /></a></span></p>

<p><br /></p>

<p>　次は開発部長の小川さん。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/ogawa-97.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/ogawa-97.html','popup','width=400,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/ogawa-thumb-160x160-97.png" width="160" height="160" alt="ogawa.png" class="mt-image-none" style="" /></a></span></p>

<p>　バリバリ。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/ogawa-t-100.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/ogawa-t-100.html','popup','width=400,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/ogawa-t-thumb-160x160-100.png" width="160" height="160" alt="ogawa-t.png" class="mt-image-none" style="" /></a></span></p>

<p><br /></p>

<p>　次はテスタの今村さん。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/imamura-103.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/imamura-103.html','popup','width=298,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/imamura-thumb-160x214-103.jpg" width="160" height="214" alt="imamura.jpg" class="mt-image-none" style="" /></a></span></p>

<p>　現役ミュージシャンも手嶋屋化！</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/imamura-t-106.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/imamura-t-106.html','popup','width=298,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/imamura-t-thumb-160x214-106.png" width="160" height="214" alt="imamura-t.png" class="mt-image-none" style="" /></a></span></p>

<p>　ミュージシャンはのれんの前でもかっこよかった。</p>

<p><br /></p>

<p>　そういえばこの前、弾さんの家にお邪魔したんですよ。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/dankogai-109.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/dankogai-109.html','popup','width=498,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/dankogai-thumb-200x160-109.jpg" width="200" height="160" alt="dankogai.jpg" class="mt-image-none" style="" /></a></span></p>

<p>　とばっちりで手嶋屋化。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/dankogai-t-112.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/dankogai-t-112.html','popup','width=498,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/dankogai-t-thumb-200x160-112.png" width="200" height="160" alt="dankogai-t.png" class="mt-image-none" style="" /></a></span></p>

<p>　意外に似合ってる！</p>

<p><br /></p>

<p>　最後はやっぱり&#8230;</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/mccarthy-116.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/mccarthy-116.html','popup','width=394,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/mccarthy-thumb-200x203-116.jpg" width="200" height="203" alt="mccarthy.jpg" class="mt-image-none" style="" /></a></span></p>

<p>　マッカーシー先生！</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://e-arrows.sakura.ne.jp/assets_c/2010/02/mccarthy-t-119.html" onclick="window.open('http://e-arrows.sakura.ne.jp/assets_c/2010/02/mccarthy-t-119.html','popup','width=394,height=400,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://e-arrows.sakura.ne.jp/assets_c/2010/02/mccarthy-t-thumb-200x203-119.png" width="200" height="203" alt="mccarthy-t.png" class="mt-image-none" style="" /></a></span></p>

<p>　マッカーシー先生が手嶋屋ののれんをくぐる日がくるなんて！</p>

<h1>コード</h1>

<p>　突発LTで1時間くらいしか時間がなかったのでかなりやっつけですが、手嶋屋化コードはこんな感じ。もちろんClojureです。</p>

<pre class="prettyprint lang-lisp">
(import 'javax.imageio.ImageIO)
(import 'java.io.File)
(import '[java.awt Color Graphics2D AlphaComposite])

(def tejimaya-image (ImageIO/read (new File "tejimaya-noren.png")))
(def *alpha* 0.8)

(defn tejimayanize [image-path & alpha]
  (let [read-image (ImageIO/read (File. image-path))]
    (doto (.createGraphics read-image)
      (.setComposite (AlphaComposite/getInstance AlphaComposite/SRC_OVER (or alpha *alpha*)))
      (.drawImage tejimaya-image 0 0 nil))
    (ImageIO/write read-image "png" (File. "tejimayanized.png"))))
</pre>

<h1>参考</h1>

<p><a href="http://yusukebe.com/archives/09/09/13/184216.html">&#8220;miyagawanize&#8221; ( talk in YAPC::Asia 2009 ) - ゆーすけべー日記</a></p>

<p>　最近僕はパクリしかやってない気がするよね！</p>

<p><hr /><br /></p>

<p>　<a href="http://www.find-job.net/list/j76532.html">手嶋屋では変じゃない開発者も募集しています！</a></p>
]]>
    </content>
</entry>

<entry>
    <title>UbuntuでClojureからOpenCVを使えるようにする</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/clojure-opencv.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.141</id>

    <published>2010-01-29T18:32:46Z</published>
    <updated>2010-01-29T19:04:16Z</updated>

    <summary>　本来、正月は一月の別称だったそうです。つまり今日は正月です。わーい！ 誰かお年...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Clojure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　本来、正月は一月の別称だったそうです。つまり今日は正月です。わーい！ 誰かお年玉ください！</p>

<p>　顔認識で有名なOpenCVをClojureから使えないものかと思ってインストールを試みましたが、思うようにいかず。さすがインストールで挫折すると定評のあるOpenCV。</p>

<p>　Macでは失敗しましたがUbuntu9.04で無事使えるようになったのでメモしておきます。</p>
]]>
        <![CDATA[<h1>OpenCVのインストール</h1>

<p>　まずはOpenCVをインストールします。あとで使うJava bindingライブラリの関係でバージョンは1.0.0を使います。1.1や2だと動かないので気をつけてください。</p>

<p>　まずは<a href="http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/">Sorceforge</a>からダウンロードしておきます。</p>

<pre>
$ tar xvfz opencv-1.0.0.tar.gz
$ cd opencv-1.0.0
$ ./configure --prefix=/usr
$ make
$ sudo make install
</pre>

<h1>Javaから使えるようにする</h1>

<p>　OpenCVはC++で書かれているので、そのままではJavaで使うことができません。このJava bindingには「OpenCV \ Library」というライブラリを使います。変な名前ですが僕のせいではありません。</p>

<pre>
$ wget http://ubaa.net/shared/processing/opencv/download/opencv_01.zip
$ unzip opencv_01.zip
$ cd OpenCV/library
$ ls
OpenCV.dll*        OpenCV.jar         libOpenCV.jnilib*  libOpenCV.so*
</pre>

<p>　このうち、使うファイルは OpenCV.jar と libOpenCV.so です。</p>

<pre>
$ sudo cp libOpenCV.so /usr/lib
$ sudo cp OpenCV.jar ~/.clojure (Clojureのパスが通った場所)
</pre>

<p>　さらに、この OpenCV.jar だけだと動かないので<a href="http://processing.org/">Processing</a>という別のツールのライブラリも持ってきます。これは自分でビルドしてもいいんですが、 <a href="http://incanter.org/">incanter</a> というツールにバンドルされているのでそれを使います。</p>

<pre>
$ wget http://cloud.github.com/downloads/liebke/incanter/deps-1.0.zip
$ unzip deps-1.0.zip
$ cp lib/processing/core.jar ~/.clojure (Clojureのパスが通った場所)
</pre>

<p>　これで完了です。</p>

<h1>確認</h1>

<p>　Clojureを起動してimportして確かめてみましょう。</p>

<pre>
$ clj
Clojure 1.1.0
user=> (import 'hypermedia.video.OpenCV)
nil
</pre>

<p>　これでエラーとか出なければたぶん成功だと思います。エラーが出た人は..、一応以下の確認を。</p>

<h2>java.library.path</h2>

<p>　java.library.pathに/usr/libが入ってるかを確認してください。</p>

<pre class="prettyprint lang-lisp">
user=> (System/getProperty "java.library.path")
</pre>

<h2>classpath</h2>

<p>　classpathに OpenCV.jar と core.jar が入ってるか確認してください。</p>

<pre class="prettyprint lang-lisp">
(use 'clojure.contrib.classpath)
(classpath)
</pre>

<h1>参考</h1>

<p><a href="http://nakkaya.com/2010/01/12/fun-with-clojure-opencv-and-face-detection/" title="Fun with Clojure, OpenCV and Face Detection">Fun with Clojure, OpenCV and Face Detection</a></p>
]]>
    </content>
</entry>

<entry>
    <title>Macで最新のClojure(+contrib)を最速でインストール</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/clojure-install-on-mac.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.139</id>

    <published>2010-01-26T11:02:27Z</published>
    <updated>2010-01-29T11:40:06Z</updated>

    <summary>　以前、MacPortsでClojure(+contrib)を最速でインストール...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Clojure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　以前、<a href="http://e-arrows.sakura.ne.jp/2009/12/macportsclojurecontribrepl.html" title="MacPortsでClojure(+contrib)を最速でインストールしてREPLを起動 - 八発白中">MacPortsでClojure(+contrib)を最速でインストールしてREPLを起動</a>という記事を書きました。ただ、バージョンが古いので、結局Clojureのソースをgithubから落としてビルドする有様。</p>

<p>　MacPortsの開発状況ってどうなってんのかなぁ対応まだからなと思っていたら、今月にリリースされた最新のMacPortsにはClojure 1.1.0が入っているようです。</p>
]]>
        <![CDATA[<p>　まずはMacPortsのバージョン確認。1.8.2が入っている人はこのパートは飛ばしてください。また、MacPortsをまだインストールしていない人は<a href="http://www.macports.org/install.php">公式サイト</a>からダウンロードして入れて、同様に次のパートへ。</p>

<pre>
$ port version
Version: 1.8.1
</pre>

<p>　MacPortsのアップグレード。</p>

<pre>
$ port selfupdate
</pre>

<pre>
$ port search clojure
clojure @1.1.0 (lang, java)
    The Clojure programming language

clojure-contrib @git-20091102 (lang, java)
    The Clojure programming language (1.0) - Contrib

clojure-contrib-devel @git-20091128 (lang, java)
    The Clojure programming language (development) - Contrib
clojure-devel @1.1.0-alpha-SNAPSHOT (lang, java)
    The Clojure programming language (development version)

leiningen @0.5.0 (devel, java)
    A build tool for Clojure designed to not set your hair on fire.

Found 5 ports.
</pre>

<p>　Clojureの本体だけでなく、contribや、ビルドツールのLeiningenもあります。使い方わかんないけど。</p>

<pre>
$ sudo port install clojure +rlwrap
$ sudo port install clojure-contrib
</pre>

<p>　以上。最速。</p>

<hr />

<p><br /></p>

<p>　<b>※追記 (2010/01/29)</b>: MacPortsで入る起動スクリプトだと、contribを読み込んでくれないようです。cljを書き換える方法もありますが、もっと<a href="http://github.com/richhickey/clojure-contrib/blob/master/launchers/bash/clj-env-dir">拡張性のある起動スクリプト</a>がcontribにバンドルされているのでこちらを流用したほうがいいです。</p>

<p>　また、MacPortsで入るcontribだと、clojure.contrib.pprint のuseに失敗します。</p>

<pre>
user=> (use 'clojure.contrib.pprint)
java.lang.ClassNotFoundException: clojure.contrib.pprint.PrettyWriter (pprint.clj:14)
</pre>

<p>　どうやらpprintを使うには自分でビルドしないといけないようです。</p>

<p>　結局、Clojure本体はMacPortsで入れて、contribは自分でビルドするのが正解のようですね :p</p>
]]>
    </content>
</entry>

<entry>
    <title>社内勉強会で「Google App Engine for Java 〜バレンタインまでに最速で彼女をつくる方法〜」を発表しました</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/google-app-engine-for-java.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.138</id>

    <published>2010-01-26T09:30:00Z</published>
    <updated>2010-01-26T09:46:17Z</updated>

    <summary>　今日、久しぶりに手嶋屋の勉強会で発表しました。内容は最近やっているGAE/J方...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Google App Engine" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　今日、久しぶりに手嶋屋の勉強会で発表しました。内容は最近やっているGAE/J方面です。</p>
]]>
        <![CDATA[<h1>プレゼンについて</h1>

<p>　Twitter botを作りながらGAE/JのAPIを紹介します。</p>

<div style="width:425px;text-align:left" id="__ss_2993058"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/fukamachi/google-app-engine-for-java-2993058" title="Google App Engine for Java (手嶋屋勉強会)">Google App Engine for Java (手嶋屋勉強会)</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=tejimaya-gae-j-100126004928-phpapp01&stripped_title=google-app-engine-for-java-2993058" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=tejimaya-gae-j-100126004928-phpapp01&stripped_title=google-app-engine-for-java-2993058" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>

<p><br /></p>

<p>　さすがにClojureでやると非難されそうなのでJRubyを使いました :p</p>

<p>　ここで作ったJRuby on GAE/Jのボットは <a href="http://twitter.com/kunitada_bot">@kunitada_bot</a> として稼働中です。現在は手嶋屋の人しかkunitadizeされませんが、近いうちに対象をフォロワーに変更しようと思います。ソースコードはこちら =&gt; <a href="http://github.com/fukamachi/kunitada-bot">http://github.com/fukamachi/kunitada-bot</a></p>

<p>　以上、ボットは <a href="http://twitter.com/sugyan">@sugyan</a> さんのパクリ、プレゼン名は <a href="http://twitter.com/hokaccha">@hokaccha</a> さんのパクリというひどいプレゼン紹介でした。</p>

<p>　また、発表はしませんでしたが、Clojureでも <a href="http://twitter.com/clojurism">@clojurism</a> というボットを作りました。Clojureに興味がある方はフォローしてみてください。手動フォロー返しが飛びます。</p>
]]>
    </content>
</entry>

<entry>
    <title>CLコードバトンに参加しました</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/cl-code-baton.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.137</id>

    <published>2010-01-24T14:31:48Z</published>
    <updated>2010-01-25T02:55:26Z</updated>

    <summary>　ハハハハ！ 月曜日だぜ！ 　ひげぽんさん方面から「コードバトン」という企画が始...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Common Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　ハハハハ！ 月曜日だぜ！</p>

<p>　ひげぽんさん方面から「コードバトン」という企画が始まった話は聞いていたのですが、何か遠くのLispハッカーの間で盛り上がってるなー楽しそうだなーという認識くらいしかなかったので、まさかここまで流れてこようとは思いませんでした。というか僕はCLerという認識をしてもらえているのか。</p>

<p>　makingさんから「次やりますか？」と声をかけてもらい、CLコードバトンに参加しました。</p>
]]>
        <![CDATA[<h1>コードバトンの仕組み</h1>

<ul>
<li>前の人からgistのURLをもらう</li>
<li>forkする</li>
<li>書き換える</li>
<li>次の人にURLを渡す</li>
</ul>

<h1>とりあえず動かしてみる</h1>

<h2>ありのまま今起こったことを話すぜ&#8230;</h2>

<p>　コードバトンは全然追っていなかったので、何のプログラムかもわからず。「まあ、とりあえず走らせてみたらわかるか」ってことで手をつける。</p>

<pre>
$ sbcl
zsh: command not found: sbcl
</pre>

<p>　Σ(ﾟдﾟlll) えっ</p>

<pre>
　　　　　　　　 ,. -‐'''''""¨¨¨ヽ
　　　　 　 　 (.＿＿_,,,... -ｧァﾌ|　
　 　 　 　 　 |i i|　 　 }!　}} /／|
　　　　 　 　 |l､{　 　j}　/,,ｨ//｜
　　　　　　　 i|:!ヾ､_ﾉ／ u {:}//ﾍ　
　　　　　　　 |ﾘ u' }　 ,ﾉ　_,!V,ﾊ |
　　 　 　 ／´fト､_{ﾙ{,ィ'ｅﾗ　, ﾀ人　
　　　　 /' 　 ヾ|宀| {´,)⌒`/ |<ヽﾄiゝ
　　　　,ﾞ　 ／ )ヽ iLﾚ 　u' |　| ヾｌﾄﾊ〉
　　 　 |／_／　 ﾊ !ニ⊇　'／:} 　V:::::ヽ　
　　　 /／ 二二二7'T'' ／u'　__ /:::::::/｀ヽ
　　　/'´r　---一ｧ‐ﾞＴ´　'"´ ／::::／-‐ 　＼
　　 / // 　 广¨´ 　/'　　 ／:::::／´￣｀ヽ ⌒ヽ
　　ﾉ ' /　 ノ:::::`ー-､___／:::::／/ 　 　 　 ヽ　　}
_／｀丶　/::::::::::::::::::::::::::￣`ー-{:::...　　　 　　　ｲ
</pre>

<p>　最速でapt-get！！</p>

<pre>
$ sudo apt-get install sbcl
</pre>

<h2>何のプログラム？</h2>

<p>　REPLで動作する英単語帳のようです。前回のShibuya.lispのLTでひげぽんさんが言ってたやつかな？</p>

<pre>
;; ■英単語暗記補助ツールです
;; 起動すると辞書ファイルから単語が表示されるので意味を頭で考えます。改行を入力すると答えが表示されます。 (y/n) を聞かれるので正解なら y を押してください。
;; 間違った単語は辞書ファイルに記録され次回出題されます。
</pre>

<h2>依存モジュールのインストール</h2>

<p>　SBCLすら入ってなかったので当然モジュールも入ってない。ただ幸いなことに依存モジュールは1個しかなかったです。ただ僕が1個増やしちゃったので、今の依存モジュールは2個です。</p>

<pre>
* (require 'asdf)
* (require 'asdf-install)
* (asdf-install:install 'drakma) ; HTTP通信
* (asdf-install:install 'cl-ppcre) ; 正規表現
</pre>

<p>　結構時間かかりますが、特にはまりどころもなさそうです。</p>

<h2>起動してみる</h2>

<p>　前の人が頑張ってくれてるおかげで起動もらくらくできました。</p>

<pre>
* (asdf:oos 'asdf:load-op :scheme_baton)
</pre>

<p>　さて、どこに手を加えようか...。</p>

<h1>単語登録を簡単にしました</h1>

<p>　僕はめんどくさがりです。英語でいうとLazyです。僕は明日の試験勉強をしていませんが、Lazyなので仕方がありません。</p>

<p>　そんなめんどくさがりの僕は英単語を2個登録したらめんどうになってしまいました。</p>

<p>「これはダメだ。早くなんとかしないと...」</p>

<p>　なんとかされるべきなのは僕のほうかもしれませんが、ここでは全責任を単語帳におしつけることにしました。</p>

<h2>単語の意味を自動取得</h2>

<p>　単語帳に登録する単語っていうのは、知らない単語です。知らない単語は、当然意味を調べます。意味を調べてから、単語帳に登録します。わかりやすいようにLispで言うとこんな感じです。</p>

<pre class="prettyprint lang-cl">
(let ((meaning (get-meaning "idiot")))
  (add-entry "idiot" meaning))
</pre>

<p>　毎回こんなコード書きたくないですね。追加するときに意味を取得してそのまま登録するようにしたらどうでしょう？</p>

<pre>
Word: idiot
Meaning: &lt;Enter&gt;

愚か者? [yn]: (y or n)
</pre>

<p>　こうすると自分が愚か者であることを自認できます。いや違います。意味の入力時に、ただEnterを押した際にGoogle翻訳APIにリクエストを投げて意味を取得し、プロンプトを出します。「y」を押すとそのまま登録され、「n」を押すと空文字列が登録されます。</p>

<p>　以下は、今回追加した、単語の意味をGoogle翻訳して返す関数です。</p>

<pre class="prettyprint lang-cl">
(defun google-translate (word)
  "Translate with Google Translate"
  (let ((uri "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=en%7Cja&q="))
    (cl-ppcre:register-groups-bind (meaning)
        ("\"translatedText\":\"([^\"]+)\"" (drakma:http-request (concatenate 'string uri word)))
        (if (not (equal word meaning)) meaning))))
</pre>

<p>　問題は「英語 => 日本語」の翻訳しか考えてないこと。wordがどの言語かを判定してlangpairの値を変えるようにすればどの言語の組み合わせでも対応できるけどめんどうだったのでとりあえずベタ打ちで。きっと誰か直してくれる。</p>

<h1>そしてバトンは回ってゆく&#8230;</h1>

<p>　バトンを回す人は特に但し書きがないようなので、Twitterのフォロワーから <a href="http://twitter.com/sirohuku">@sirohuku</a> さんを選びました。卒論で忙しいようですが、やってくれるようです。がんばれ。超がんばれ。</p>

<p>　久しぶりにCommon Lisp書いたけど、やっぱ楽しかったです。暇ができたらClojureのバトンももらいにいこうかな。</p>

<p>　今までの参加者を見ると、みんな有名なLisperの方々なので近づきづらく思いましたが、そこで僕みたいなのでも参加できたので、他の人もどんどん参加してほしいところです。自分が手を加えたプログラムが今後どうなっていくのか見るのも楽しみなものですよ :)</p>

<p><a href="http://gist.github.com/285104">http://gist.github.com/285104</a></p>

<p><hr /><br /></p>

<p>※追記 : Clojureバトンも勝手にforkしてみました。</p>

<p><a href="http://gist.github.com/285607">http://gist.github.com/285607</a></p>
]]>
    </content>
</entry>

<entry>
    <title>[書評] Programming Clojure</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/programming-clojure.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.136</id>

    <published>2010-01-18T08:57:55Z</published>
    <updated>2010-01-18T09:00:03Z</updated>

    <summary>Programming ClojureStuart Halloway 　mixi...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Clojure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="書評" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<div class="book"><a href="http://www.amazon.co.jp/o/ASIN/1934356336/happatsu-22/"><img src="http://rcm-images.amazon.com/images/P/1934356336.09.MZZZZZZZ.jpg" border="0" /><br />Programming Clojure<br />Stuart Halloway</a></div>

<p>　mixiにレビュー書いたのにブログに載せ忘れてるっていう。</p>

<p>　もうすぐ川合史朗さん訳の「プログラミングClojure」が出ますが、待ちきれずに原著を買いました。</p>
]]>
        <![CDATA[<p>　本書は現状唯一のClojure本なのでそれだけでも手にとる価値があるでしょう。</p>

<p>　プログラム言語の初期の技術書にはよくあることですが、本書もClojureのチュートリアル的な内容になっています。あまり詳しく仕様を網羅したものではないですが、一通りの機能を舐めることができます。</p>

<p>　ただ、Clojureの進化はとても早く後方互換性を保証しないので、本書のサンプルコードのいくつかは動かなかったり非推奨になっていたりするようです。訳書では修正か但し書きがあるのかな？</p>

<p>　まあこれから原著を買う日本人はほとんどいないでしょうが、英語のほうが好きな人や、出版社のWebサイトでPDFも売っているのでPDFが欲しい人は購入を考えるのもいいかもしれません。</p>
]]>
    </content>
</entry>

<entry>
    <title>僕がリナカフェに行く9つの理由</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/linux-cafe.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.134</id>

    <published>2010-01-17T12:56:31Z</published>
    <updated>2010-01-17T14:34:51Z</updated>

    <summary>　最近よくリナカフェに行きます。家でおとなしく作業してればいいのにリナカフェに行...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　最近よくリナカフェに行きます。家でおとなしく作業してればいいのにリナカフェに行きます。別に秋葉原に用事はありません。電車を降りたら真っ先にリナカフェに行きます。</p>

<p>　家と会社以外では、大学とかファミレスとかルノアールとかで作業をしますが、それでもよくリナカフェに行きます。無料WiFiが使えるわけでもないですし、別にオフ会に興味があるわけでもないですがリナカフェに行きます。</p>

<p>　なんでだろう。そう思ったのでリナカフェのいいところをまとめてみました。</p>
]]>
        <![CDATA[<h1>リナカフェに行く9つの理由</h1>

<h2>1. 電源がある</h2>

<p>　全席ではないですが、ところどころにコンセントがあります。</p>

<h2>2. 安い</h2>

<p>　他の喫茶店よりは安いです。コーヒーとか。あと一応PRONTO系列なのでスパゲティも食べられます。夕飯ついでに充電ついでに作業とかできます。</p>

<h2>3. 別にLinuxerじゃなくてもいい</h2>

<p>　リナックスカフェという店名ですが、この店とは無関係です。ただの名残りです。</p>

<h2>4. 別にiPhone持ってなくてもいい</h2>

<p>　所持者は多いですが、この店とは無関係です。客の好みです。</p>

<h2>5. 別にTwitterやってなくてもいい</h2>

<p>　頻繁にTwitterオフ会が開かれているようですが、この店とは無関係です。ただの慣習です。</p>

<h2>6. 別に人間嫌いでもいい</h2>

<p>　入店時にカウンターで注文をする必要はありますが、そのあとはフリーダムです。人口密度は高いですが、ひたすら画面を見つめてイヤホンで耳を塞ぐことで回避できます。</p>

<h2>7. EMOBILEが繋がりにくい</h2>

<p>　店の奥行の1/3以上奥に行くと、EMOBILEが極端に繋がりにくくなります。Google開くのに20秒とかかかります。動画？　そんなもの見られません。なんとニコ厨で作業が全然捗らない人にも安心して利用できるシステムなのです。</p>

<h2>8. 禁煙席が少ない</h2>

<p>　禁煙席は一番奥の数席だけです。分煙もされていません。タバコの煙が大好きな人には絶好の場所です。</p>

<h2>9. 座り心地が悪い椅子がある</h2>

<p>　ソファとかは普通ですが、カウンターの椅子なんかはやや硬めです。背もたれも短いです。座り心地の悪い椅子が好きな人には絶好の場所です。</p>
]]>
    </content>
</entry>

<entry>
    <title>僕が新しい言語を作る理由</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/why-create-new-lang.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.133</id>

    <published>2010-01-05T15:07:23Z</published>
    <updated>2010-01-05T16:34:03Z</updated>

    <summary>　ほとんどの会社が1月4、5日から業務開始だったようですね。みんなは新年初日で遅...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="プログラム全般" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　ほとんどの会社が1月4、5日から業務開始だったようですね。みんなは新年初日で遅刻なんてしなかったでしょうか。僕はとても心配です。僕は40分だけ遅れました。</p>

<p>　いや、そんな挨拶をしている暇はないです。もう2011年まで31135890秒しかありません。やばいです。未来怖いです。</p>

<p>　手嶋屋の何人かに、新しく言語を作ってるんだーみたいな話をしたら、ちょいちょいその動向を聞かれるようになりました。本当に興味があるのか、それ以外に僕との話題を思いつかなかったのかわかりませんが、夢を語るというのは楽しいものです。</p>

<p>　ただ、ちょっと僕と感覚がずれてるなーと思う部分があります。まだ出来てもいない言語についてあれこれ言うのも何ですが、2011年の自分が読み返すことも考えて記事にします。</p>
]]>
        <![CDATA[<h1>言語を作る != 言語を広める</h1>

<p>　周りの人と話してる感じだと、「言語を作る = 言語を広める」ことだと考えている人がほとんどのように思います。</p>

<p>　この点に関する人々の意見で興味深いのは、多くの言語実装者とは意見が逆だということです。</p>

<p>　正直、僕は自分の言語を広く使ってもらおうとは思っていません。もちろん皆に使ってもらえればそれほどうれしいことはないでしょうが、それは優先事項ではありません。最悪ユーザが自分ひとりでも全然構わないと思っています。</p>

<p>　これは実装者の視点から考えるとわかります。なんで既にこれだけの言語があるのに、新しく自分で作るのか？ それは、既存の言語に満足できないからです。</p>

<p>　言語を作る目的は既存の言語が自分の手に馴染まない。これは主観です。その主観に合う言語を作る。つまりまとめると、<strong>自分が使うための言語を作ることが目的</strong>なのです。</p>

<p>　もちろん、Linusの名言「Just for fun.」も目的の一つになりえますが、それは第一の目的というよりも、自分の楽しみを続ける理由といったほうが正しい気がします。LinusがLinuxやGitを作ろうと思い立った理由は別であるはずです。</p>

<h1>プログラミングとは何か</h1>

<p>　趣味がプログラミング、というプログラマはそれなりに多くいるでしょうが、そのすべてがプログラミングの同じ部分に魅力を感じているということはないでしょう。「コンピュータは人間と違って自分の言うとおりに扱える！」という人から、モノづくりという観点で面白いと思うプログラマもいます。</p>

<p>　なので、ここからは意見が分かれるところでしょうし、単純に僕の考えとして書きます。</p>

<p>　僕にとってプログラミングとは何か。それは、「物事をよりよく改善するための手段」です。</p>

<p>　たとえば、小さなことで言えば、エディタの設定なんかがそうです。「PHPのエラーチェックを保存時にできないかな&#8230;」　そしてそれを改善するためのスクリプトを書いてみる。ほら、便利になった、ってね。</p>

<p>　大きなことで言えばGoogleとか。Googleは既存の検索システムを改善するために生まれたものですし。</p>

<p>　プログラムの多くはこういった、現状を改善するという側面があります。僕が好きなのはまさにこの側面なんです。</p>

<p>　現状の問題を解決するもの。こういうと、なんだか魔法のようじゃないですか。</p>

<p>　そう、<strong>プログラミングとは「魔法」なのです</strong>。そしてプログラマとは魔法使いなのです。僕は魔法使いになりたいのです、というとネット隠語的に語弊がありますが、僕が目指しているのはまさに魔法使いなのです。</p>

<p>「ほら、これに困ってたんでしょう？ これを使えば解決するよ」</p>

<p>　そう言えるようになりたいのです。そして結果として世の中をよりよくしたいです。嫌なものを見なくていい理想郷を作りたい。ちょっと理想主義すぎるでしょうか。</p>

<h1>なぜ新しい言語を作るのか</h1>

<p>　そう考えたとき、今の自分は魔法を自由自在に操れるようになっているんでしょうか。</p>

<p>「こういうサービスがあれば面白いよね」</p>

<p>　さあ、作れますか？ いやいや、そんなご冗談を&#8230;魔法じゃないんだから&#8230;。</p>

<p>　もし作ろうと思ったら、どの言語で作るだろうとか、どのフレームワークで作るだろうとか、サーバはどうするだろう、とかいろいろと問題が出てきます。細かいところを見るなら、ログインにはIDを使おうかE-mailアドレスを使おうか、とか。何かと本質から離れて面倒なことが多いものです。</p>

<p>　で、結局作らない。</p>

<p>「なんだやっぱり作れないんじゃないか」</p>

<p>　こんなの魔法じゃない。僕が望んだ姿じゃない。</p>

<p>　じゃあどうすればいいだろう。Lispなら魔法みたいに扱えるかもしれない。Gaucheを学んでみた。それでもやはり不満が多い。Common Lispならどうだろう。Webで使うにはいろいろ付け足すべきところが多い。Clojureっていうのが出たらしい。なかなかよさそうだけどハックしがいのあるものではなさそうだ。</p>

<p>　こんなことを言っていると、まるで言語が悪いせいだー、とでも言い訳しているようにも見えますね。けれど、納得がいかない言語で我慢して書く、というのは自分の能力を最大限に発揮できないと思うのです。</p>

<p>　そういうときに、Twitterでcametanさんから「新しい言語を作ってみたら」と勧められたのです。うん、なるほど。それはいいかもしれない。</p>

<p>　プログラミングが本当に魔法のようになる言語、<strong>僕の能力を最大限生かせる言語を作ること</strong>。それが僕の目的であり、新しい言語を作る理由です。</p>

<p>　だから自分の言語を流行らせるというよりも、むしろみんなオレオレ言語を作ればいいのにとすら思っています。10年後には1人1言語の時代がきているかもしれないとも妄想します。WAF乱立の現状を見るなら、十分ありえる未来とも思います。</p>

<p>　未来を語るのは楽しいですね。おっと。時計を見るともう午前1：20みたいです。いや、1：21になりました。明日こそは朝10時に出社できるんでしょうか。20分遅れくらいで着くんでしょうか。僕はとても心配です。未来とは怖いものです。</p>
]]>
    </content>
</entry>

<entry>
    <title>謹賀新年</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2010/01/post-11.html" />
    <id>tag:e-arrows.sakura.ne.jp,2010://3.132</id>

    <published>2010-01-01T00:20:07Z</published>
    <updated>2010-01-01T01:28:24Z</updated>

    <summary>　プログラマの皆さんもそうでない皆さんも、明けましておめでとうございます。 　2...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Scheme" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　プログラマの皆さんもそうでない皆さんも、明けましておめでとうございます。</p>

<p>　2009年はあっという間でした。つまり、あっと言っている間に2010年になっていました。あれ？ 2010年？ それなんて未来ですか？</p>

<p>　年明けはミネコと過ごす予定だったのですが、退社が遅れたので帰宅が間に合わず、0:00は電車に乗ってました。つまり、電車乗ってたら未来になってました。</p>

<p>　もうなんかいろいろダメなので、2010年は時間を大切にしたいと思います。</p>

<p>　時間を大切にしようと思ったら2011年まであと何秒か気になったのでGaucheで調べてみました。</p>

<pre>
$ gosh -usrfi-19 -e "(print (time-second (time-difference (date->time-utc (make-date 0 0 0 0 1 1 2011 0)) (current-time))))" -Eexit
31531147
$
</pre>

<p>　なるほど！ あと31531147秒か！</p>

<p>　今日は会社休んで珍しく洋服屋の福袋でも買いに行こうと思います。服の福袋なので服袋と言っても過言ではないですね。</p>

<p>　では、みなさん良い正月を。</p>
]]>
        

    </content>
</entry>

<entry>
    <title>letを理解して年内に勝ち組Lisperになる</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2009/12/letlisper.html" />
    <id>tag:e-arrows.sakura.ne.jp,2009://3.131</id>

    <published>2009-12-27T16:57:14Z</published>
    <updated>2009-12-27T17:25:18Z</updated>

    <summary>　もうすぐ2010年ですね。僕は今日、「今年やり残したこと」を聞かれて「逆ナンパ...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Common Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　もうすぐ2010年ですね。僕は今日、「今年やり残したこと」を聞かれて「逆ナンパされること」と答えました。そういえばまだ逆ナンパされていません。誰か誘ってください。</p>

<p>　みなさんは何かやり残したことはありますか？ そうですか。Lispですか。</p>

<p>　僕は最近になってようやくLispの本質的な部分まで踏み込んで考えられるようになり、Lispの良いところ・悪いところが見えるようになってきました。</p>

<p>　その中でも一番Lispの悪いところ。「なんかLispやってみたけどいまいちプログラムが書けない」って人がいたら、それひょっとしてletのせいじゃないですか？</p>
]]>
        <![CDATA[<h1>let基本編</h1>

<h2>letとは</h2>

<p>　letは、よく本で「<strong>ローカル変数を定義する</strong>」と説明されます。他の言語ではがんがん使うローカル変数。ですが、Lispだとよくわからない。</p>

<pre class="prettyprint lang-cl">
(let (ここでローカル変数を定義)
  ここで処理を書く)

(let ((age 15))
  (if (> 18 age) ; 18歳未満？
    "違法です"
    "合法です"))
</pre>

<p>　変数定義に見えねー、とかなんでわざわざ変数を使うのにネストが一段深くなるんだー、とかカッコ多すぎだー、何いちいちカッコつけてんだー、とか慣れないうちは思うものです。</p>

<h2>letの役割を理解しよう</h2>

<p>　letが分からない理由は、letの役割が正確に伝わっていないからじゃないかなぁと思います。実はletはローカル変数を定義するだけじゃないんです。letには以下の<strong>2つの役割</strong>があります。</p>

<ul>
<li>レキシカルスコープを作る</li>
<li>そのスコープだけで使える変数を定義する</li>
</ul>

<p>　まずは役割がこの2つある！ということを認識することが重要です。多くの言語ではいちいちスコープの前で変数定義なんてしませんが、Lispでは必ずスコープの最初で定義します。<strong>スコープと変数の宣言を同時に行う</strong>、これがletなのです。</p>

<p>　試しに上のコードをPerlで書いてみるとこんな感じになります。</p>

<pre class="prettyprint lang-perl">
{
    my $age = 16
    if ($age < 18) {
        "違法です"
    } else {
        "合法です"
    }
}
</pre>

<p>　わかりやすいようにあえてブロックで囲いました。そしてブロックの中で変数$ageをmyで定義しています。letはこの2つを同時にやってくれるだけなのです。こう考えるとちょっとletのことも理解が進むんじゃないでしょうか？</p>

<h2>まとめ</h2>

<p>　変数を定義することは関数型の思想に反するとかで、Schemeではあまりletを使わない傾向にありますが、初心者のうちはどんどん変数定義するといいと思います。まずは書くことですよ。let！ let！ let！</p>

<h1>let応用編</h1>

<p>　ここからはちょっとチラシの裏っぽいです。だんだんだるくなってきたのでわかる人だけにわかればと思ってさらさらっと書きます！</p>

<h2>Perlとの比較</h2>

<p>「確かにLispのletのことはわかった。でもPerlよりも使いづらいんじゃね？」</p>

<p>　LispとPerlのコードを比較してみてください。まず、Perlでは大抵ブロックをつける必要がないため、インデントが1つ浅くてすみます。また、変数定義も冒頭である必要がありません。好きなところで定義して利用できます。</p>

<p>letのダメなところまとめ。</p>

<ul>
<li>インデントが一段深くなる</li>
<li>定義を冒頭一箇所にまとめないといけない</li>
<li>複数の変数があると変数定義だけで数行使ったりする</li>
<li>カッコ多すぎ</li>
</ul>

<p>　正直、僕はletがLispの一番悪いところだと思っています。わかりづらいし使いづらい。Lisperの方々も昔letに苦しめられた思い出がある人もいるんじゃないでしょうか。</p>

<p>　こういうサインは見逃してはいけません。マクロですよ、マクロ。僕は今日マグロ丼を食べました。</p>

<h2>letの改良版「let-block」</h2>

<p>任意の場所でローカル変数を使える、let-blockを書きました。</p>

<pre class="prettyprint lang-cl">
(let-block
  (setf $hair 'short)
  (if (eql $hair 'short)
    "I love you."))
</pre>

<p>　上のコード例を見てわかることはなんですか？ そうですね。僕がショートカット好きということです。</p>

<p>　let-block内では、"$"で始まるシンボルは<strong>自動的にローカル変数</strong>と見なされ、宣言の必要はありません。上では変数　$hair　を宣言なしで setf しています。ソースは以下。</p>

<pre class="prettyprint lang-cl">
(defun flatten (x)
  (labels ((rec (x acc)
             (cond ((null x) acc)
                   ((atom x) (cons x acc))
                   (t (rec
                        (car x)
                        (rec (cdr x) acc))))))
    (rec x nil)))

(defun $-symbol-p (s)
  (and (symbolp s)
       (> (length (symbol-name s)) 1)
       (string= (symbol-name s)
                &#8220;$&#8221;
                :start1 0
                :end1 1)))

(defmacro let-block (&rest body)
  (let ((syms ((remove-duplicates
                (remove-if-not #&#8217;$-symbol-p
                               (flatten body)))))
    `(let ,(mapcar (lambda (s) `(,s)) syms)
       ,@body)))
</pre>

<p>　まあLet Over Lambdaのdefmacro/g!のパクりなんですけどね。</p>

<h2>さらにdefunの改良版「defun!」</h2>

<p>　上でletの代替はできましたが、それでもレキシカルスコープを定義することに違いはなく、インデントが一段深くなることの解決にはなっていません。そこで、defun内での変数の自由定義を行う「defun!」も作りました。</p>

<pre class="prettyprint lang-cl">
(defun! lolita-lover-p (limit-age)
  (setf $age 18)
  (if (> $age limit-age)
    "通報しました"))
</pre>

<p>　ここでは変数 $age を使っていますが、let-blockと同じく宣言の必要がありません。</p>

<p>　定義した関数 lolita-lover-p を使ってみます。</p>

<pre class="prettyprint lang-cl">
* (lolita-lover-p 5)
"通報しました"
</pre>

<p>　さすがに5歳はまずいでしょう。</p>

<p>　定義は以下。上のlet-blockをそのまま使います。</p>

<pre class="prettyprint lang-cl">
(defmacro defun! (name args &rest body)
  `(defun ,name ,args
     (let-block ,@body)))
</pre>

<h2>まとめ</h2>

<p>　上の2つのマクロは使ってみると結構便利です。ただ、マクロ定義を見てわかるようにネストして同時に使うことは想定していません。そのうち必要になったときに改良しようかなと思います。</p>
]]>
    </content>
</entry>

<entry>
    <title>社内LTで「ひょっとしてPHPってダメなんじゃね？」を発表しました</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2009/12/i-hate-php-lt.html" />
    <id>tag:e-arrows.sakura.ne.jp,2009://3.130</id>

    <published>2009-12-24T12:10:05Z</published>
    <updated>2009-12-24T14:21:04Z</updated>

    <summary>　今日の日付を見てはいけません。ただの平日です。ただの平日。 　ランチで行った店...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="プログラム全般" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="雑記" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　今日の日付を見てはいけません。ただの平日です。ただの平日。</p>

<p>　ランチで行った店ががらがら？ 電車がいつもより空いてる？</p>

<p>　ただの平日です。ただの平日ですとも。</p>

<p>　ええ、そんな通常営業日の手嶋屋では今日も勉強会が行われました。</p>
]]>
        <![CDATA[<h1>勉強会中止のお知らせ</h1>

<p>　今日の朝、社内SNSのスケジュールを見ると勉強会が中止に。</p>

<blockquote>
モイ！<br />
クリスマス・イブなので負荷試験ツール「Pylot」で遊んでみたいと思います。<br />
無理そうだったらクリスマスもろとも中止になります。
</blockquote>

<p>　ということでクリスマスもろとも中止してくれちゃったきわさん。しかし、クリスマスはどうでもいいにしても勉強会中止はちょっともったいない。せっかく出社したのに！ 勉強したい！</p>

<p>　あ。じゃあ代わりに誰かやればいいんじゃね？</p>

<p><br /></p>

<p>僕「中止になったからあらかじめ用意したネタで勉強会をやるアルバイトがいてもいい」</p>

<p>部長「いいね」
<br /></p>

<p>　だけどもちろん誰も準備してません。僕もしてません。じゃあ&#8230;</p>

<h1>Lightning Talkでどう？</h1>

<p>　どうしても勉強したい僕はさらに提案を重ねました。</p>

<p><br /></p>

<p>僕「じゃあ1人5分のLightning Talk形式だったらどう？　ネタないですか？」</p>

<p>「5分だったら&#8230;」</p>

<p><br /></p>

<p>　よし！　ってことで発表者を募って突発勉強会をすることに。</p>

<p>　はてさて、そうは決まったものの、そういう僕は何を発表しようか&#8230;</p>

<p>　最近やったことと言えば&#8230;</p>

<h1>最近やったこと</h1>

<ul>
<li>Lisp</li>
<li>BlogでPHPをdisる</li>
<li>Perl</li>
<li>TwitterでPHPをdisる</li>
<li>負荷試験</li>
<li>TumblrでPHPをdisる</li>
</ul>

<p><br /></p>

<p>　あと上には書いてないですけどPHPのdisりとかもよくしますかね :)</p>

<p>　&#8230;&#8230;<strong>しまった！　社内で話せるネタがない！　ハメられた！</strong></p>

<p><br /></p>

<p>　くそ、こうなったら一番得意なPHPのdisりを話すしかないじゃないか&#8230;</p>

<h1>「ひょっとしてPHPってダメなんじゃね？」</h1>

<p>　そういう経緯から即興でプレゼン資料を作りました。時間があればKeynoteできれいに作りたかったのですが、あんまり時間がとれなかったので高橋メソッド.xulです。PDFに変換とかできないのでFirefoxで見てください。</p>

<p><br /></p>

<p><a href="/files/i-hate-php.xul">勉強会資料「ひょっとしてPHPってダメなんじゃね？」.xul (全44ページ)</a></p>

<p><br /></p>

<p>　そんなの見るのめんどくさいだって？　じゃあ簡単なあらすじを。</p>

<ul>
<li>PHPをdisりまくってた</li>
<li>そしたら「PHPは簡単に書ける」って反論された</li>
<li>は？　冗談だろ？</li>
<li>「じゃあ他にどの言語使えばいいんだよ」</li>
<li>他？　ねーよwww</li>
</ul>

<p><br /><br /><br /></p>

<p>　ない？</p>

<p><br /></p>

<p>　じゃあどうすれば&#8230;。やっぱりこのままPHPを&#8230;&#8230;。</p>

<p><br /><br /><br /></p>

<p>　違うよ！　全然違う！</p>

<p><br /><br /><br /></p>

<p><a href="/files/haruhi.jpg">
<img alt="ないんだったら自分で作ればいいのよ！" src="/files/haruhi.jpg" width="80%" height="80%" />
</a></p>

<h1>言語を作り始めました</h1>

<p>　ってことで嘘のようなほんとの話なんですが、新しく自分のためのWeb系言語を作り始めました。Twitterでcametan_001さんに<del>そそのかされた</del>&#8230;勧められたのが発端なのですが、作り始めてみると意外と面白い。ということでこそこそと日常の合間に作っています。</p>

<p>　テーマは最速でWebアプリを作るにはどういった言語が最適か？です。もちろんWeb周辺の技術は移り変わりが激しいため、言語自身に十分な柔軟性が必要です。じゃなきゃPHPの二の舞ですからね。</p>

<p><br /></p>

<p><strong>「PHPの言語仕様はひどい。でも他の言語はいろいろと不便だ」</strong></p>

<p><br /></p>

<p>　PHPが好きなら結構。でもこんな言い訳は聞きたくない。プログラマなら妥協せずに改良を目指すべき。そうでしょう？　そっちのほうが、きっと楽しいと思うよ :)</p>
]]>
    </content>
</entry>

<entry>
    <title>symfonyでテンプレートの部分キャッシュ</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2009/12/symfony-cache-template-parts.html" />
    <id>tag:e-arrows.sakura.ne.jp,2009://3.128</id>

    <published>2009-12-15T04:37:49Z</published>
    <updated>2009-12-15T06:45:03Z</updated>

    <summary>　言い忘れましたが僕はPHPプログラマです。そうです。そうでした。 　最近はOp...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="symfony" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　言い忘れましたが僕はPHPプログラマです。そうです。そうでした。</p>

<p>　最近はOpenPNE3の高速化に向けてプロファイリングを仰せつかっているので、symfonyのキャッシュ周りなどを調べてみました。</p>

<p>　symfonyはキャッシュ周りもさまざまな大きさで切り分けることができるようで、ページ全体やパーシャル単位、あるコード部分単位でもキャッシュできるようです。</p>

<p>　今回はその、「コード部分単位」でのキャッシュを使ってみました。</p>
]]>
        <![CDATA[<h1>テンプレートの部分キャッシュ</h1>

<p>　symfonyではテンプレートの一部分だけをキャッシュすることができます。テンプレートを部分的にキャッシュするには以下のようにします。</p>

<pre class="prettyprint lang-php">
    &lt;?php if (!cache('name')): ?&gt;

     ここにキャッシュしたいコード

    &lt;?php cache_save(); ?&gt;
    &lt;?php endif; ?&gt;
</pre>

<p>　いちいち入力するのは面倒なのでVimでキーマップしておきました。キャッシュ狂な人はftplugin/php.vimとかに書いておくといいかもしれません。</p>

<pre>
    vnoremap &lt;Leader&gt;c &lt;Esc&gt;`&gt;o&lt;?php cache_save(); ?&gt;&lt;Return&gt;&lt;?php endif; ?&gt;&lt;Esc&gt;`&lt;i&lt;?php if (!cache('')): ?&gt;&lt;Return&gt;&lt;Esc&gt;&lt;Up&gt;17&lt;Right&gt;a
</pre>

<h1>参考</h1>

<p><a href="http://develop.ddo.jp/symfony/book/jp/1.0/cache.html" title="symfony book 日本語ドキュメント キャッシュシステムでサイトをスピードアップする方法について">symfony book 日本語ドキュメント キャッシュシステムでサイトをスピードアップする方法について</a></p>
]]>
    </content>
</entry>

<entry>
    <title>MacPortsでClojure(+contrib)を最速でインストールしてREPLを起動</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2009/12/macportsclojurecontribrepl.html" />
    <id>tag:e-arrows.sakura.ne.jp,2009://3.127</id>

    <published>2009-12-10T16:27:57Z</published>
    <updated>2009-12-10T17:09:38Z</updated>

    <summary>　Clojureのチュートリアルを見てたらProgramming Clojure...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Clojure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　Clojureのチュートリアルを見てたら<a href="http://www.amazon.co.jp/o/ASIN/1934356336/happatsu-22/">Programming Clojure</a>がどうしても欲しくなったので買っちゃいました＞＜ なんかもうSchemeで書くのがバカらしくなっちゃいます。</p>

<p>　そういうわけでまずはClojureのインストールをしようと思ったんですが、検索してもやり方がまちまちでよく分かりませんでした。</p>
]]>
        <![CDATA[<h1>参考サイト</h1>

<p>　英語ですが、以下のサイトがよくまとめられています。</p>

<p><a href="http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Installation" title="Clojure Programming/Getting Started - Wikibooks, collection of open-content textbooks">Clojure Programming/Getting Started - Wikibooks, collection of open-content textbooks</a></p>

<p>　読んでいると、「Installation using MacPorts」という項があってびっくりしました。そうか、MacPortsでインストールできるのか。これは利用しない手はない。</p>

<p>　僕はMacを使っているので今回はMacPortsでインストールしちゃいますが、他にもWindowsやLinuxでのインストール方法も書いてあるので上のページは参考になると思います。</p>

<h1>インストールしてみる</h1>

<p>　ClojureのインストールはMacPortsで一発です。</p>

<pre>
$ sudo port install clojure +rlwrap
</pre>

<p>　インストールが終わったら&#8221;clj&#8221;を叩いてREPLが起動することを確認してください。</p>

<p>　次にclojure-contribをインストールします。これはたぶん汎用ライブラリか何かです。おそらく大抵の場面で必要なのでビルドします。</p>

<pre>
$ git clone git://github.com/richhickey/clojure-contrib.git
$ cd clojure-contrib
$ git checkout -b clojure-1.0-compatible
$ ant -Dclojure.jar=/opt/local/share/java/clojure/lib/clojure.jar
</pre>

<p>　するとclojure-contrib.jarというファイルが出来ます。必要なのはこのファイルだけなので好きな場所にコピーしておきます。僕はclojure.jarと同じで/opt/local/share/java/clojure/libにコピーしました。</p>

<pre>
$ sudo cp clojure-contrib.jar /opt/local/share/java/clojure/lib
</pre>

<p>ただコピーするだけだとcontribが使えないので、ホームディレクトリに.clojureというファイルを作り、これにclojure-contrib.jarのファイルパスを記述します。</p>

<pre>
$ vi ~/.clojure
=> /opt/local/share/java/clojure/lib/clojure-contrib.jarと記述
</pre>

<p>　再びcljを叩いてREPLを起動してください。contribが読み込まれたREPLになります。試しに以下のコードを打ってみましょう。</p>

<pre>
user=> (use 'clojure.contrib.str-utils)
nil
user=> (str-join "-" ["Open" "PNE" 3])
"Open-PNE-3"
</pre>

<p>　さて、準備完了！</p>
]]>
    </content>
</entry>

<entry>
    <title>モダンなLisp「Clojure」はPaul Grahamへのリスペクトを超える</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2009/12/clojure-modern-lisp.html" />
    <id>tag:e-arrows.sakura.ne.jp,2009://3.126</id>

    <published>2009-12-08T23:49:35Z</published>
    <updated>2009-12-24T14:53:47Z</updated>

    <summary>　僕がLispを始めようって気になった最大要因はPaul Grahamの「ハッカ...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="Clojure" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Lisp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　僕がLispを始めようって気になった最大要因はPaul Grahamの「ハッカーと画家」を読んでしまったことです。当時はPerlでも大したプログラムが書けませんでしたが、そのとき植え付けられた漠然なLispへのリスペクトは今僕をLisperたらしめたのです。あーなんて影響を受けやすいんでしょう。</p>

<p>　そんなPaul Grahamファンの僕がLisperとなった今、もうこれはArcを使ってみるしかないんじゃないの的なノリでいじってみました。</p>

<p>　Arcはぱっと見た感じPerlみたいな書き捨てプログラミングに向くとても楽しい言語に見えるんですが、どうもあまり開発も活発ではないようです。Twitterで聞くとまだまだ実験段階で実用には向かないようです。</p>

<p>　そこにcametanさんが「Clojureやってみたら？」とおっしゃったので、これも機会と思って調べてみました。</p>
]]>
        <![CDATA[<h1>Clojureって何よ</h1>

<p>　恥を忍んで申し上げるなら、僕はClojureをCommon LispのJava実装だと思っていました。</p>

<p>　実際は互換性のない方言なんですね。SchemeでもCommon Lispでもない、新しいLispです。</p>

<p>　Clojureと他のLisp方言との違いは以下のリンクで一覧されています(英語)。</p>

<p><a href="http://clojure.org/lisps" title="Clojure - lisps">Clojure - lisps</a></p>

<p>　LISP-1って書いてあるのでScheme寄りなのかなーと思ったんですが、割とCommon Lisp寄りな気もします。</p>

<p>　あと、ClojureはScalaとも比較されることが多いみたいですよ。わかんないけど。</p>

<h1>チュートリアルとかドキュメントとか</h1>

<p>　ClojureをWebで検索しても日本語のドキュメントなんて皆無ですが、軽く流す程度なら以下のページだけで十分です。</p>

<p><a href="http://java.ociweb.com/mark/clojure/article.html" title="Object Computing, Inc. - Java News Brief - March 2009">Object Computing, Inc. - Java News Brief - March 2009</a></p>

<p>　英語ですが、コード例も多く大変わかりやすいです。</p>

<p>　あとは<a href="http://clojure.org/">本家Wiki</a>でリファレンスが公開されています。</p>

<p>　もし本格的にやるならば<a href="http://www.amazon.co.jp/o/ASIN/1934356336/happatsu-22/">Programming Clojure</a>という書籍が出版されています。噂ではShiroさんが翻訳しているみたいですが、<del>翻訳本はたぶん早くても来年夏以降じゃないと出ないと思うので今なら洋書買うのもありだと思います。</del> <a href="http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06789-1">1/25に発売予定</a>みたいです。思ったより翻訳早かったです :p</p>

<p>　他には<a href="http://www.amazon.co.jp/o/ASIN/1430272317/happatsu-22/">Practical Clojure</a>という本も出るようです。これだけでもArc以上にコミュニティが活発なのがわかりますね。</p>

<h1>ライブラリ</h1>

<p>　新しい言語にしてはかなりの数が揃っているといってもいいかもしれませんが、正直言ってライブラリはまだ出揃っていません。OpenIDのライブラリもないみたいです。ただTwitterのライブラリは作ってる人がいるみたいですが。</p>

<h1>Web Application Framework</h1>

<p>　いくらClojureが素晴らしくてもWeb Application Frameworkがないと使う気にならないという僕みたいな人もいると思います。幸いClojureにはWAFのCompojureというものがあるようです。Rubyの軽量フレームワークSinatraに似てるらしいです。</p>

<p>　ただ困ったことに英語でも情報が少なくて、チュートリアルは&#8221;Draft&#8221;とか書いてあるし、まとまったドキュメントらしきものは見当たりませんでした。まだバージョンも新しいですし、絶賛開発中ってところでしょうか。</p>

<p>　チュートリアルとかはHello, World程度しかやってないのでちょいちょい調べると以下のページが参考になりそうです。</p>

<p><a href="http://ericlavigne.wordpress.com/2009/01/04/compojure-security-authentication-and-authorization/" title="Compojure security: authentication and authorization « Eric Lavigne">Compojure security: authentication and authorization « Eric Lavigne</a></p>

<p>　Compojureでログイン機構を作っています。</p>

<h1>雑感まとめ</h1>

<p>　正直なところこのClojureにはかなり期待しています。Arc？ えっと、それなんだっけ？ Perl？</p>

<p>　言語単体ではGaucheよりも実用的だと思います。Schemeは良くも悪くもシンプルなので少し実用性を犠牲にしています。</p>

<p>　ただ、フレームワークを考えるとKahuaに軍配があがります。Clojureにも継続ベースのWAFが出ればいいのになぁ。継続ベースとマクロの組み合わせは最高の抽象度だと思うのに。</p>

<p>　それでもClojureでWebアプリを書く理由があるとすれば、それがGoogle App Engineでも動くってことですね。お金のない僕にはこれはかなり心揺さぶられるメリットです。もし今後Common LispでWebアプリを作るような機会があればClojureで書くというのも十分考慮に値します。というか積極的に考慮します :)</p>

<p>　まあ今後もClojure周りには目を光らせておきたいです。</p>
]]>
    </content>
</entry>

<entry>
    <title>JMeterで始める負荷テスト(Stress Test)入門</title>
    <link rel="alternate" type="text/html" href="http://e-arrows.sakura.ne.jp/2009/12/jmeterstress-test.html" />
    <id>tag:e-arrows.sakura.ne.jp,2009://3.125</id>

    <published>2009-12-02T10:07:22Z</published>
    <updated>2009-12-03T07:15:05Z</updated>

    <summary>　仕事でOpenPNE3の負荷試験をすることになったので、負荷試験について調べる...</summary>
    <author>
        <name>深町英太郎</name>
        
    </author>
    
        <category term="JMeter" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Stress Test" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://e-arrows.sakura.ne.jp/">
        <![CDATA[<p>　仕事でOpenPNE3の負荷試験をすることになったので、負荷試験について調べるとともに、負荷試験のテストツールApache JMeterの使い方を学びました。</p>

<p>　もうなんか、最初はスクリーンショットとか画面遷移をとってたんですが、面倒になったのでメモだけ。だけど、これを読んだあとなら他のJMeterのページを見るときに理解が深まると思います。あくまで導入ですよ。</p>
]]>
        <![CDATA[<h1>負荷試験の基礎</h1>

<p>　負荷試験でどの程度の負荷をかけるかはテストによって違うものです。この負荷を表す指標を簡単に述べるなら、<strong>どれだけのユーザが、どれだけの期間に、どれだけ連続してアクセスしてくるか</strong>でしょう。</p>

<p>　これを表す指標として以下の3つのパラメータがあります。</p>

<ul>
<li>スレッド数　&#8230; どれだけのユーザが</li>
<li>Ramp-Up時間 &#8230; どれだけの期間に</li>
<li>テストの実行回数 &#8230; どれだけ連続してアクセスしてくるか</li>
</ul>

<p>　たとえば、50万PVの負荷を考えるなら、1分間に347PV、1秒間に約6PVですから、</p>

<ul>
<li>スレッド数 : 6</li>
<li>Ramp-Up時間 : 1</li>
<li>テストの実行回数 : 好きなだけ(とりあえず1を指定しとけば早く終わる)</li>
</ul>

<p>　となります。ただ、これは一時的な負荷を表したものなので、スレッド数とRamp-Up時間の比率は実運用に似せて改善していかないといけません。この辺は僕もあまりわかっていないので、以下のサイトを参考にしてください。</p>

<p><a href="http://www.itarchitect.jp/methodology_and_design/-/39302.html" title="テスト・スクリプト改善のヒント - ITアーキテクト [IT Architect]">テスト・スクリプト改善のヒント - ITアーキテクト [IT Architect]</a></p>

<h1>JMeterの基礎</h1>

<p>　負荷テストツール、Apache JMeterではシナリオ1単位を「<strong>スレッドグループ</strong>」として作成します。上で出てきた1つのスレッドはスレッドグループに書かれたアクセスを1回実行することになります。</p>

<p>　じゃあスレッドグループの中でどういうアクセスを行うか。それを登録するのが「<strong>サンプラ</strong>」です。どのページにどういったリクエストを飛ばすかを指定できます。スレッドグループの中にサンプラを順に登録することで、1ユーザのアクセス経路を再現することができます。</p>

<p>　最後に試験の結果を見ないと意味がありません。これをどういう風に表示するかを指定するのが「<strong>リスナ</strong>」です。テスト結果を表で表示したりグラフで表示したりできます。</p>

<p>　　JMeterで負荷試験を作るときは、基本的にこの「<strong>スレッドグループ作成　→ サンプラをいっぱい作成 → リスナの作成</strong>」という流れになります。</p>

<h1>複雑な試験を作るときに必要な機能 「コントローラ」</h1>

<p>　簡単なテストならサンプラをいっぱい作って実行するだけでいいんですが、そのサンプラの流れが複雑になるときがあります。</p>

<p>　たとえば、「日記一覧 → 新規投稿フォーム → 投稿 → 一覧 → 今作った日記詳細」みたいな一連のフローを<strong>5回</strong>繰り返したいときとか。いちいちこのサンプラ群を5回コピペするのはいけてないですね。</p>

<p>　そういったフローを制御する機能が「<strong>コントローラ</strong>」です。このコントローラには種類があって、ループしたり条件指定(IF)があったりします。これがあれば完全にユーザのアクセスフローチャートを再現できそうです。</p>

<h1>サンプラを作るときに便利なもの</h1>

<h2>レスポンスを確かめるための「アサーション」</h2>

<p>　ただサンプラでGETリクエストを発するだけでも負荷を与えることはできますが、その場合帰ってくるページがなんであってもエラーは出ません。たとえHTTPリクエストが404であってもエラーはでないようです。</p>

<p>　これをチェックするために、アサーションという機構があります。アサーションは、レスポンスに対して正規表現でチェックをかけたり、レスポンスタイムを指定したり、HTTPコードを制限したりできます。</p>

<p>　また、アサーションはサンプラに直接追加することもできますが、スレッドグループ直下に追加することもでき、この場合はグローバルなアサーションになります。これはとても便利なので覚えておいたほうが身のためです。</p>

<h2>前のレスポンスから値を取得する 「正規表現抽出」</h2>

<p>　セッションIDを引き回すような画面遷移の場合、前のサンプラのレスポンスからinput type=&#8221;hidden&#8221;などの値を取得する必要があります。これは「後処理」→「正規表現抽出」を使うことで変数に値をバインドすることができます。</p>

<h2>HTML内の外部参照ファイルもダウンロードするオプション</h2>

<p>　サンプラでHTTPリクエストをするとき、デフォルトだとそのページのHTMLしかダウンロードしてくれません。これだとHTML内の画像やCSS、JavaScriptファイルがダウンロードされず、<strong>十分な負荷をかけていると言えなくなります</strong>。</p>

<p>　これをエミュレートするには、サンプラの下のほうの「<strong>すべてのイメージとアプレットを繰り返しダウンロードする (HTMLファイルのみ)</strong>」という謎のオプションにチェックを入れます。</p>

<p>　この説明だけだとまるで画像とアプレットしかダウンロードしてくれないように思いますよね。調べてみると、これは日本語訳が悪いようで、英語を見ると「Retrieve All Embedded Resources from HTML File」と書いてありました。単純にHTMLファイルをパースして添付されてるファイルをダウンロードするようです。</p>

<p>　ただ、このオプションには現実に沿っていない計測仕様があるようです。詳しくは以下のリンクを。</p>

<p><a href="http://d.hatena.ne.jp/EC-One/20090918/1253236421" title="024 Apache JMeterの計測仕様を変更したら1.6倍くらいスループットが上がった - EC-One ナレッジセンター レスキューサービス ブログ">024 Apache JMeterの計測仕様を変更したら1.6倍くらいスループットが上がった - EC-One ナレッジセンター レスキューサービス ブログ</a></p>

<h2>JMeterをコマンドラインで動かす</h2>

<p>　JMeterを普通に起動するとGUIが起動するのでGUIしか動かないのかなと思っていたのですが、ターミナルで&#8221;-n&#8221;オプションをつけて起動することでNon-GUIモードで動かすこともできるみたいです。負荷テストを作ったあとに、サーバにSSHで入って負荷テストを走らせる、なんてことができるわけですね。ただし、もちろんながらJavaが入っていないと動きません。</p>

<pre>
$ jmeter -n -t op3-test.jmx -l log.jtl
</pre>

<p>　上のコマンドはjmeterでop3-test.jmxという負荷テストを走らせ、log.jtlにログをとるものです。ログファイルを指定しないと負荷テストの結果を教えてくれないので必ず指定してください。</p>

<p>　取ったログファイルはGUIモードで起動したあとに好きなリスナを作り、「参照」からファイルを指定することでロードして閲覧できます。</p>

<p>　できればコマンドラインからスレッド数やRamp-Up時間を指定できるようにもしたかったのですが、何か方法があるんでしょうか。</p>
]]>
    </content>
</entry>

</feed>
