<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>mojavy.com</title>
    <link>http://mojavy.com/blog</link>
    <description></description>
    <pubDate>Wed, 17 Oct 2012 00:00:00 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Common LispでZeroMQを試す</title>
      <link>http://mojavy.com/blog/2012/10/17/common-lisp-zeromq/</link>
      <pubDate>Wed, 17 Oct 2012 00:00:00 JST</pubDate>
      <category><![CDATA[zeromq]]></category>
      <category><![CDATA[sbcl]]></category>
      <category><![CDATA[common lisp]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2012/10/17/common-lisp-zeromq/</guid>
      <description>Common LispでZeroMQを試す</description>
      <content:encoded><![CDATA[<p><img alt="zeromq" src="/images/zeromq-logo.png" /></p>
<p>Common LispでZeroMQを試してみた。</p>
<p>使用環境は以下のとおり</p>
<ul>
<li>OS: Ubuntu 12.04 LTS</li>
<li>Common Lisp 処理系：<a href="http://www.sbcl.org/">sbcl (1.0.55.0.debian)</a></li>
<li><a href="http://download.zeromq.org/zeromq-2.2.0.tar.gz">ZeroMQ 2.2.0</a></li>
</ul>
<h1 id="1-quicklisp">1. quicklispのインストール</h1>
<p>以下を参考にquicklispをインストールする。</p>
<ul>
<li><a href="http://www.quicklisp.org/beta/">Quicklisp</a></li>
<li><a href="http://modern-cl.blogspot.jp/2011/03/quicklisp.html">第2回 Quicklispによるライブラリ環境</a></li>
</ul>
<div class="pygments_borland"><pre><span class="nv">$ </span>curl -O http://beta.quicklisp.org/quicklisp.lisp
<span class="nv">$ </span>sbcl
<span class="o">(</span>load <span class="s2">&quot;quicklisp.lisp&quot;</span><span class="o">)</span>
<span class="o">(</span>quicklisp-quickstart:install :path <span class="s2">&quot;.quicklisp/&quot;</span><span class="o">)</span>
<span class="o">(</span>ql:add-to-init-file<span class="o">)</span>
</pre></div>

<p>※ (quicklisp-quickstart:install :path ".quicklisp/") のパスで最後のスラッシュは省略不可</p>
<h1 id="2-cl-zmq">2. cl-zmqのインストール</h1>
<div class="pygments_borland"><pre>(ql:quickload :zeromq)
</pre></div>

<p>ここで以下のようなエラーがでる場合はzeromqのインストールができていないか、ld.so.confに問題がある。ld.so.confにzeromqをインストールしたディレクトリがはいってることを確認して、sudo ldconfig すればちゃんとロードされるはず。</p>
<div class="pygments_borland"><pre>debugger invoked on a LOAD-FOREIGN-LIBRARY-ERROR in thread
<span class="c">#&lt;THREAD &quot;initial thread&quot; RUNNING {10029990A3}&gt;:</span>
  Unable to load any of the alternatives:
   <span class="o">(</span><span class="s2">&quot;libzmq.so.0.0.0&quot;</span> <span class="s2">&quot;libzmq.so&quot;</span><span class="o">)</span>

Type HELP <span class="k">for </span>debugger <span class="nb">help</span>, or <span class="o">(</span>SB-EXT:QUIT<span class="o">)</span> to <span class="nb">exit </span>from SBCL.

restarts <span class="o">(</span>invokable by number or by possibly-abbreviated name<span class="o">)</span>:
  0: <span class="o">[</span>RETRY          <span class="o">]</span> Try loading the foreign library again.
  1: <span class="o">[</span>USE-VALUE      <span class="o">]</span> Use another library instead.
  2: <span class="o">[</span>TRY-RECOMPILING<span class="o">]</span> Recompile package and try loading it again
  3: <span class="o">[</span>RETRY          <span class="o">]</span> Retry
                       loading FASL <span class="k">for</span> <span class="c">#&lt;CL-SOURCE-FILE &quot;zeromq&quot; &quot;package&quot;&gt;.</span>
  4: <span class="o">[</span>ACCEPT         <span class="o">]</span> Continue, treating
                       loading FASL <span class="k">for</span> <span class="c">#&lt;CL-SOURCE-FILE &quot;zeromq&quot; &quot;package&quot;&gt; as</span>
                       having been successful.
  5: <span class="o">[</span>ABORT          <span class="o">]</span> Give up on <span class="s2">&quot;zeromq&quot;</span>
  6:                   Exit debugger, returning to top level.

<span class="o">(</span>CFFI::FL-ERROR
 <span class="s2">&quot;Unable to load any of the alternatives:~%   ~S&quot;</span>
 <span class="o">(</span><span class="s2">&quot;libzmq.so.0.0.0&quot;</span> <span class="s2">&quot;libzmq.so&quot;</span><span class="o">))</span>
0<span class="o">]</span> 2
</pre></div>

<p>以下のようにしてライブラリのパスを設定してやっても回避はできるがおすすめしない。</p>
<div class="pygments_borland"><pre>(pushnew &quot;/path/to/lib/&quot; *foreign-library-directories*)
</pre></div>

<p><a href="http://common-lisp.net/project/cffi/manual/html_node/_002aforeign_002dlibrary_002ddirectories_002a.html">http://common-lisp.net/project/cffi/manual/html_node/_002aforeign_002dlibrary_002ddirectories_002a.html</a></p>
<h1 id="3">3. サーバ側起動</h1>
<p><a href="http://www.cliki.net/cl-zmq">cl-zmq</a> のサンプルコード参考に以下のようなエコーサーバを書いた。これをserver.lispに保存して、 sbcl --script server.lisp で実行。ちなみに、127.0.0.1:5555 の部分をlocalhost:5555のように書くとNo such deviceといわれる。 (参考 <a href="http://stackoverflow.com/questions/6024003/why-doesnt-zeromq-work-on-localhost">Why doesn't zeromq work on localhost?</a> )</p>
<div class="pygments_borland"><pre>(load &quot;~/.sbclrc&quot;)
(ql:quickload :zeromq)

(defun server ()
  (zmq:with-context (ctx 1)
    (zmq:with-socket (socket ctx zmq:rep)
      (zmq:bind socket &quot;tcp://127.0.0.1:5555&quot;)
      (loop
         (let ((query (make-instance &#39;zmq:msg)))
           (zmq:recv socket query)
           (let ((req-string (zmq:msg-data-as-string query)))
             (format t &quot;Recieved message: &#39;~A&#39;~%&quot; req-string)
             (zmq:send socket (make-instance &#39;zmq:msg :data req-string)) ))))))

(server)
</pre></div>

<h1 id="4">4. クライアント側起動</h1>
<p>こちらも同様に以下をclient.lispに保存して、sbcl --script client.lispで実行。うまくいけばサーバ側からレスポンスが返ってくる。</p>
<div class="pygments_borland"><pre>(load &quot;~/.sbclrc&quot;)
(ql:quickload :zeromq)

(defun client ()
  (zmq:with-context (ctx 1)
    (zmq:with-socket (socket ctx zmq:req)
      (zmq:connect socket &quot;tcp://127.0.0.1:5555&quot;)
      (loop
      (zmq:send socket (make-instance &#39;zmq:msg
                                      :data (read-line)))
      (let ((result (make-instance &#39;zmq:msg)))
        (zmq:recv socket result)
        (format t &quot;Recieved message: &#39;~A&#39;~%&quot;
                (zmq:msg-data-as-string result) ))))))

(client)
</pre></div>

<h1 id="_1">まとめ</h1>
<p>Common Lisp(sbcl)でZeroMQを利用して、簡単なエコーサーバ/クライアントを実装した。</p>
<h1 id="_2">参考</h1>
<ul>
<li><a href="http://www.cliki.net/cl-zmq">cl-zmq</a></li>
<li><a href="http://stackoverflow.com/questions/6024003/why-doesnt-zeromq-work-on-localhost">Why doesn't zeromq work on localhost?</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>sbclでクラスのスロット一覧を取得する方法</title>
      <link>http://mojavy.com/blog/2012/07/06/common-lisp-list-of-slots/</link>
      <pubDate>Fri, 06 Jul 2012 18:30:00 JST</pubDate>
      <category><![CDATA[memo]]></category>
      <category><![CDATA[sbcl]]></category>
      <category><![CDATA[common lisp]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2012/07/06/common-lisp-list-of-slots/</guid>
      <description>sbclでクラスのスロット一覧を取得する方法</description>
      <content:encoded><![CDATA[<p><img alt="lisp" src="/images/lisp-logo.jpg" /></p>
<p>メモメモ</p>
<div class="pygments_borland"><pre>CL-USER&gt; (sb-mop:class-slots (find-class &#39;sb-posix:stat))
(#&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::MODE&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::INO&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::DEV&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::NLINK&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::UID&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::GID&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::SIZE&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::ATIME&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::MTIME&gt;
 #&lt;SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION SB-POSIX::CTIME&gt;)
</pre></div>]]></content:encoded>
    </item>
  </channel>
</rss>
