<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
  <title>bojovs::blog</title>
  <link href="http://bojovs.github.com" />
  
  <updated>2011-12-25T04:48:24-08:00</updated>
  <id>http://bojovs.github.com</id>
  <author>
    <name>Koji Shinba</name>
    <email>bojovs@gmail.com</email>
  </author>

  
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/bojovs" /><feedburner:info uri="bojovs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
      <id>http://bojovs.github.com/2011/12/25/anoside/</id>
      <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/bojovs/~3/6WYBG8Slcb4/" />
      <title>匿名でつぶやきが投稿できるWebサービス「Anoside」をリリースしたよ</title>
      <updated>2011-12-25T00:00:00-08:00</updated>
      <author>
        <name>Koji Shinba</name>
        <uri>http://bojovs.github.com</uri>
      </author>
      <content type="html">&lt;p&gt;昨日と今日、以前からちょこちょこと作り続けてきたWebアプリを公開するための作業をしていました。
本当は昨日公開したかったんですが、色々と問題が発生して今ようやく公開できる形となりました。疲れた…。&lt;/p&gt;

&lt;p&gt;Anoside: &lt;a href="http://anoside.com/"&gt;http://anoside.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="section"&gt;どんなサービス?&lt;/h2&gt;

&lt;p&gt;この記事のタイトル通りで、Twitterに投稿するような短いテキストから
ブログに投稿するような長い文章までを匿名で投稿することができるWebサービスです。&lt;/p&gt;

&lt;p&gt;投稿されたポストにはコメントを付けることができます。このコメントももちろん匿名で行うことができますが、
ユーザを判別するためのIDがついています。このIDはポストごとに変わります。
ポストの内容に対して議論などをするときは、完全な匿名よりも、
IDか何かで誰がどのコメントをしたかがわかると良いかなと思い、この機能を付けました。&lt;/p&gt;

&lt;p&gt;投稿したポストは「タグ」を付けてカテゴライズすることができます。
タグは他人のポストにも付けることができます。ニコニコ動画のタグ機能みたいな感じです。&lt;/p&gt;

&lt;p&gt;ポストやコメント、そしてタグは、誰かがそれらを追加したとき、リアルタイムでこちらの画面にも反映されます。
何も投稿せずただ眺めてるだけでも面白いと思います。&lt;/p&gt;

&lt;h2 id="section-1"&gt;なぜ作ったの?&lt;/h2&gt;

&lt;p&gt;自分の、何の脈絡もなくどうでも良いつぶやきを、匿名で公開できる場所があっても良いと思ったからです。&lt;/p&gt;

&lt;p&gt;匿名で何かを投稿するサービスとして、「2ちゃんねる」や「はてな匿名ダイアリー」などがすでにあります。
でも、2ちゃんねるでは板とスレッドという枠のなかで発言しなければならないし、
はてな匿名ダイアリーはある程度自分の考えを文章にしないといけません(そんな気がします)。&lt;/p&gt;

&lt;p&gt;Anosideであれば、話題に縛られることなく、そのとき思いついたことをそのまますぐに投稿することができます。&lt;/p&gt;

&lt;h2 id="section-2"&gt;開発について&lt;/h2&gt;

&lt;p&gt;AnosideはNode.js上で動いています。主に以下の技術を利用しています。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Express&lt;/li&gt;
  &lt;li&gt;Socket.IO&lt;/li&gt;
  &lt;li&gt;node-http-proxy&lt;/li&gt;
  &lt;li&gt;MongoDB&lt;/li&gt;
  &lt;li&gt;Redis&lt;/li&gt;
  &lt;li&gt;Backbone.js&lt;/li&gt;
  &lt;li&gt;RequireJS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これらのものを使用して開発するのは初めてで、しかも、
作ったものを外部に公開すること自体が初めてだったりするので、デプロイの作業がとても大変でした…。
今はまだ、とりあえず使える形で公開している状態なので、先がかなり怖いです。
とりあえず公開して、興味を持ってくれた数人の方に使ってもらえたら嬉しいなという気持ちでいます。&lt;/p&gt;

&lt;p&gt;運用方法などのノウハウはこれから勉強していきたいと思います。
どなたか運用の方法を教えてくださると非常に助かります＞＜&lt;/p&gt;

&lt;p&gt;あと、AnosideのソースコードはGitHubに公開しています。興味のある方は是非御覧ください。
そして変なところを教えてもらえると嬉しいです。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://github.com/bojovs/anoside"&gt;https://github.com/bojovs/anoside&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/bojovs/anoside-sio"&gt;https://github.com/bojovs/anoside-sio&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/bojovs/anoside-proxy"&gt;https://github.com/bojovs/anoside-proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://anoside.com/t/anoside-dev"&gt;anoside-dev&lt;/a&gt;というタグをチェックします。
なのでそのタグを付けてポストしてもらうか、
Twitterのアカウント (&lt;a href="https://twitter.com/anoside"&gt;@anoside&lt;/a&gt;, &lt;a href="https://twitter.com/bojovs"&gt;@bojovs&lt;/a&gt;) 
にmentionなどを飛ばしてもらえれば反応できます。&lt;/p&gt;

&lt;h2 id="section-3"&gt;以上&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://anoside.com/"&gt;Anoside&lt;/a&gt;をよろしくお願いしますm(__)m&lt;/p&gt;
</content>
    <feedburner:origLink>http://bojovs.github.com/2011/12/25/anoside/</feedburner:origLink></entry>
  
    <entry>
      <id>http://bojovs.github.com/2011/09/30/vows-zombie/</id>
      <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/bojovs/~3/gVHKmbJNAgo/" />
      <title>VowsとZombie.jsでExpress, MongooseなNode.jsアプリのテストを書いたよ</title>
      <updated>2011-09-30T00:00:00-07:00</updated>
      <author>
        <name>Koji Shinba</name>
        <uri>http://bojovs.github.com</uri>
      </author>
      <content type="html">&lt;h2 id="section"&gt;環境&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Node.js 0.4.9&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://expressjs.com/"&gt;Express&lt;/a&gt; 2.4.6&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://mongoosejs.com/"&gt;Mongoose&lt;/a&gt; 2.2.2&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://vowsjs.org/"&gt;Vows&lt;/a&gt; 0.5.11&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://zombie.labnotes.org/"&gt;Zombie.js&lt;/a&gt; 0.10.1&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/mikeal/request"&gt;request&lt;/a&gt; 2.1.1&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="section-1"&gt;流れ&lt;/h2&gt;

&lt;p&gt;最初に、モデル内のドキュメントを削除するコードと、サーバを起動するコードを記述します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;test/helper.js&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="lineno"&gt; 1&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mongoose&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="lineno"&gt; 2&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../app&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="lineno"&gt; 3&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../models/post&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;
&lt;span class="lineno"&gt; 4&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../models/user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="lineno"&gt; 5&lt;/span&gt; 
&lt;span class="lineno"&gt; 6&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;serverActivity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="lineno"&gt; 7&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="lineno"&gt; 8&lt;/span&gt; 
&lt;span class="lineno"&gt; 9&lt;/span&gt; 
&lt;span class="lineno"&gt;10&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;11&lt;/span&gt;   &lt;span class="c1"&gt;// サーバが起動していたら終了する&lt;/span&gt;
&lt;span class="lineno"&gt;12&lt;/span&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverActivity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;13&lt;/span&gt;     &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="lineno"&gt;14&lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;15&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="lineno"&gt;16&lt;/span&gt; 
&lt;span class="lineno"&gt;17&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;18&lt;/span&gt; 
&lt;span class="lineno"&gt;19&lt;/span&gt;   &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="lineno"&gt;20&lt;/span&gt; &lt;span class="cm"&gt;   * 配列modelsに入っているドキュメントを全て削除する&lt;/span&gt;
&lt;span class="lineno"&gt;21&lt;/span&gt; &lt;span class="cm"&gt;   */&lt;/span&gt;
&lt;span class="lineno"&gt;22&lt;/span&gt; 
&lt;span class="lineno"&gt;23&lt;/span&gt;   &lt;span class="nx"&gt;initDB&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;initDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;24&lt;/span&gt;     &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="lineno"&gt;25&lt;/span&gt;     &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;26&lt;/span&gt;       &lt;span class="nx"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="lineno"&gt;27&lt;/span&gt;       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;28&lt;/span&gt;         &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="lineno"&gt;29&lt;/span&gt;       &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;30&lt;/span&gt;         &lt;span class="nx"&gt;initDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;31&lt;/span&gt;       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;32&lt;/span&gt;     &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="lineno"&gt;33&lt;/span&gt;   &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;34&lt;/span&gt; 
&lt;span class="lineno"&gt;35&lt;/span&gt;   &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="lineno"&gt;36&lt;/span&gt; &lt;span class="cm"&gt;   * サーバが起動していなかったら起動する&lt;/span&gt;
&lt;span class="lineno"&gt;37&lt;/span&gt; &lt;span class="cm"&gt;   */&lt;/span&gt;
&lt;span class="lineno"&gt;38&lt;/span&gt; 
&lt;span class="lineno"&gt;39&lt;/span&gt;   &lt;span class="nx"&gt;readyServer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;40&lt;/span&gt;     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverActivity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;41&lt;/span&gt;       &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextTick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;42&lt;/span&gt;     &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;43&lt;/span&gt;       &lt;span class="nx"&gt;serverActivity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="lineno"&gt;44&lt;/span&gt;       &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3030&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;45&lt;/span&gt;         &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextTick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;46&lt;/span&gt;       &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="lineno"&gt;47&lt;/span&gt;     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;48&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="lineno"&gt;49&lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;50&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;次に、実際にテストを書いていきます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;test/controllers/posts.test.js&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="javascript"&gt;&lt;span class="lineno"&gt; 1&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;assert&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="lineno"&gt; 2&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;request&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="lineno"&gt; 3&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;vows&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vows&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="lineno"&gt; 4&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;zombie&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;zombie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="lineno"&gt; 5&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;helper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../helper&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="lineno"&gt; 6&lt;/span&gt;   &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../../models/post&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="lineno"&gt; 7&lt;/span&gt; 
&lt;span class="lineno"&gt; 8&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://localhost:3030&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="lineno"&gt; 9&lt;/span&gt; 
&lt;span class="lineno"&gt;10&lt;/span&gt; 
&lt;span class="lineno"&gt;11&lt;/span&gt; &lt;span class="nx"&gt;vows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;posts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addBatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="lineno"&gt;12&lt;/span&gt;   &lt;span class="s1"&gt;&amp;#39;GET /&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;13&lt;/span&gt;     &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;14&lt;/span&gt;       &lt;span class="nx"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;15&lt;/span&gt;     &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;16&lt;/span&gt;     &lt;span class="s1"&gt;&amp;#39;after readyServer&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;17&lt;/span&gt;       &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;18&lt;/span&gt;         &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;19&lt;/span&gt;       &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;20&lt;/span&gt;       &lt;span class="s1"&gt;&amp;#39;should response 200&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;21&lt;/span&gt;         &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;22&lt;/span&gt;       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;23&lt;/span&gt;     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;24&lt;/span&gt;   &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;25&lt;/span&gt; 
&lt;span class="lineno"&gt;26&lt;/span&gt;   &lt;span class="s1"&gt;&amp;#39;GET /posts&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;27&lt;/span&gt;     &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;28&lt;/span&gt;       &lt;span class="nx"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;29&lt;/span&gt;     &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;30&lt;/span&gt;     &lt;span class="s1"&gt;&amp;#39;after initDB&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;31&lt;/span&gt;       &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;32&lt;/span&gt;         &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello world&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="lineno"&gt;33&lt;/span&gt;         &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;34&lt;/span&gt;       &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;35&lt;/span&gt;       &lt;span class="s1"&gt;&amp;#39;after saving post&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;36&lt;/span&gt;         &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;37&lt;/span&gt;           &lt;span class="nx"&gt;helper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;38&lt;/span&gt;         &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;39&lt;/span&gt;         &lt;span class="s1"&gt;&amp;#39;after readyServer&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;40&lt;/span&gt;           &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;41&lt;/span&gt;             &lt;span class="nx"&gt;zombie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/posts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;42&lt;/span&gt;           &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="lineno"&gt;43&lt;/span&gt;           &lt;span class="s1"&gt;&amp;#39;should display the post&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="lineno"&gt;44&lt;/span&gt;             &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ul#posts li&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello world&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="lineno"&gt;45&lt;/span&gt;           &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;46&lt;/span&gt;         &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;47&lt;/span&gt;       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;48&lt;/span&gt;     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;49&lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="lineno"&gt;50&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="kr"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;12行目から24行目までは、&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;サーバを起動して&lt;/li&gt;
  &lt;li&gt;http://localhost:3030/ にアクセスしたら&lt;/li&gt;
  &lt;li&gt;200 が返ってくるべき&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;という処理になっています。26行目から49行目までは、&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;データベースを初期化して&lt;/li&gt;
  &lt;li&gt;タイトルが「hello world」なポストを保存して&lt;/li&gt;
  &lt;li&gt;サーバを起動したあとに&lt;/li&gt;
  &lt;li&gt;http://localhost:3030/postsにアクセスしたら&lt;/li&gt;
  &lt;li&gt;リスト内に「hello world」が表示されているべき&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;という処理になっています。&lt;/p&gt;

&lt;p&gt;Vowsでは、&lt;code&gt;topic&lt;/code&gt;という関数の中で&lt;code&gt;this.callback&lt;/code&gt;という関数を使うことができます。
この関数を、&lt;code&gt;helper.initDB&lt;/code&gt;や&lt;code&gt;helper.readyServer&lt;/code&gt;などのコールバック関数を引数に持つ関数に渡し、
その下にさらに&lt;code&gt;topic&lt;/code&gt;関数をネストして記述することで、非同期的な命令を順番に処理させることができるようです。&lt;/p&gt;

&lt;p&gt;ただ、結構冗長なコードになっているので、もう少し簡潔に書けないかなあと思っています。
みんなはどうしているんだろう…。&lt;/p&gt;
</content>
    <feedburner:origLink>http://bojovs.github.com/2011/09/30/vows-zombie/</feedburner:origLink></entry>
  
    <entry>
      <id>http://bojovs.github.com/2011/09/09/hello-world/</id>
      <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/bojovs/~3/amdDtnomr-s/" />
      <title>Hello World</title>
      <updated>2011-09-09T00:00:00-07:00</updated>
      <author>
        <name>Koji Shinba</name>
        <uri>http://bojovs.github.com</uri>
      </author>
      <content type="html">&lt;p&gt;&lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; でブログを書くことにしました。よろしくお願いします。&lt;/p&gt;
</content>
    <feedburner:origLink>http://bojovs.github.com/2011/09/09/hello-world/</feedburner:origLink></entry>
  
 
</feed>

