<?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>Tue, 19 Nov 2013 19:19:57 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Goのtemplateパッケージ簡易チートシート</title>
      <link>http://mojavy.com/blog/2013/11/19/go-template/</link>
      <pubDate>Tue, 19 Nov 2013 19:19:57 JST</pubDate>
      <category><![CDATA[golang]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/11/19/go-template/</guid>
      <description>Goのtemplateパッケージ簡易チートシート</description>
      <content:encoded><![CDATA[<p>goに標準でついてるtemplateパッケージは便利なのだけど、<a href="http://golang.org/pkg/text/template/">マニュアル</a>が長すぎるのでよく使う機能だけまとめておく。</p>
<p>そろそろだれかテンプレートエンジンを標準化してほしい。</p>
<div class="toc">
<ul>
<li><a href="#_1">基本</a></li>
<li><a href="#_2">変数展開</a></li>
<li><a href="#_3">関数呼び出し</a></li>
<li><a href="#_4">ループ</a></li>
<li><a href="#_5">組み込み関数</a></li>
</ul>
</div>
<h2 id="_1">基本</h2>
<div class="pygments_borland"><pre><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
    <span class="s">&quot;os&quot;</span>
    <span class="s">&quot;text/template&quot;</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">tmpl</span> <span class="p">:=</span> <span class="s">&quot;Hello, {{.template}}!&quot;</span>
    <span class="n">t</span> <span class="p">:=</span> <span class="n">template</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;t&quot;</span><span class="p">)</span>
    <span class="n">template</span><span class="p">.</span><span class="n">Must</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">tmpl</span><span class="p">))</span>
    <span class="n">t</span><span class="p">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="k">map</span><span class="p">[</span><span class="nb">string</span><span class="p">]</span><span class="nb">string</span><span class="p">{</span><span class="s">&quot;template&quot;</span><span class="p">:</span> <span class="s">&quot;World&quot;</span><span class="p">})</span>
<span class="p">}</span>
</pre></div>

<p>ちなみに、<code>template.Must(t.Parse(tmpl))</code>は以下のショートカット</p>
<div class="pygments_borland"><pre><span class="n">_</span><span class="p">,</span> <span class="n">err</span> <span class="p">:=</span> <span class="n">t</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">tmpl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="p">!=</span> <span class="n">nil</span> <span class="p">{</span>
    <span class="n">panic</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>

<h2 id="_2">変数展開</h2>
<p>通常はmapのキーかstructのメンバを<code>.Key</code>のようにドット付きで指定するとでその値が展開される。
ただし、該当するキーが見つからなかった場合、mapでは<code>&lt;no value&gt;</code>という文字列が出力されるが、structではエラーになる。</p>
<div class="pygments_borland"><pre><span class="k">type</span> <span class="n">T</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">Name</span> <span class="nb">string</span>
<span class="p">}</span>

<span class="n">tmpl</span> <span class="p">:=</span> <span class="s">&quot;Hello, {{.Name}}!\n&quot;</span>
<span class="n">t</span> <span class="p">:=</span> <span class="n">template</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;t&quot;</span><span class="p">)</span>
<span class="n">template</span><span class="p">.</span><span class="n">Must</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">tmpl</span><span class="p">))</span>

<span class="n">t</span><span class="p">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="k">map</span><span class="p">[</span><span class="nb">string</span><span class="p">]</span><span class="nb">string</span><span class="p">{</span><span class="s">&quot;Name&quot;</span><span class="p">:</span> <span class="s">&quot;map&quot;</span><span class="p">})</span>
<span class="n">t</span><span class="p">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="n">T</span><span class="p">{</span><span class="n">Name</span><span class="p">:</span> <span class="s">&quot;struct&quot;</span><span class="p">})</span>
<span class="n">t</span><span class="p">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="p">&amp;</span><span class="n">T</span><span class="p">{</span><span class="n">Name</span><span class="p">:</span> <span class="s">&quot;struct reference&quot;</span><span class="p">})</span>
</pre></div>

<p><code>.</code>のようにドットだけを渡すと変数それ自体が展開される。</p>
<div class="pygments_borland"><pre><span class="n">tmpl</span> <span class="p">:=</span> <span class="s">&quot;Hello, {{.}}!\n&quot;</span>
<span class="n">t</span> <span class="p">:=</span> <span class="n">template</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;t&quot;</span><span class="p">)</span>
<span class="n">template</span><span class="p">.</span><span class="n">Must</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">tmpl</span><span class="p">))</span>
<span class="n">t</span><span class="p">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="s">&quot;World&quot;</span><span class="p">)</span>
</pre></div>

<h2 id="_3">関数呼び出し</h2>
<p>関数はシェルのパイプのように連結させて呼びだせる。テンプレート内で呼ぶ関数は<code>template.FuncMap</code>で渡す。</p>
<div class="pygments_borland"><pre><span class="n">tmpl</span> <span class="p">:=</span> <span class="s">`Now {{now}}, {{&quot;hello&quot; | toupper}}`</span>
<span class="n">t</span> <span class="p">:=</span> <span class="n">template</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;t&quot;</span><span class="p">)</span>
<span class="n">t</span><span class="p">.</span><span class="n">Funcs</span><span class="p">(</span><span class="n">template</span><span class="p">.</span><span class="n">FuncMap</span><span class="p">{</span>
    <span class="s">&quot;now&quot;</span><span class="p">:</span>     <span class="k">func</span><span class="p">()</span> <span class="nb">string</span> <span class="p">{</span> <span class="k">return</span> <span class="n">time</span><span class="p">.</span><span class="n">Now</span><span class="p">().</span><span class="n">String</span><span class="p">()</span> <span class="p">},</span>
    <span class="s">&quot;toupper&quot;</span><span class="p">:</span> <span class="n">strings</span><span class="p">.</span><span class="n">ToUpper</span><span class="p">,</span>
<span class="p">})</span>
<span class="n">template</span><span class="p">.</span><span class="n">Must</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">tmpl</span><span class="p">))</span>
<span class="n">t</span><span class="p">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="n">nil</span><span class="p">)</span> <span class="c1">// =&gt; Now 2013-11-19 19:17:51.378063751 +0900 JST, HELLO</span>
</pre></div>

<h2 id="_4">ループ</h2>
<p>組み込みの<code>range</code> Actionをつかえばよい。</p>
<div class="pygments_borland"><pre><span class="k">type</span> <span class="n">T</span> <span class="k">struct</span><span class="p">{</span> <span class="n">Name</span> <span class="nb">string</span> <span class="p">}</span>
<span class="n">tmpl</span> <span class="p">:=</span> <span class="s">`</span>
<span class="s">{{range .}}- {{.Name}}</span>
<span class="s">{{end}}</span>
<span class="s">`</span>
<span class="n">t</span> <span class="p">:=</span> <span class="n">template</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;t&quot;</span><span class="p">)</span>
<span class="n">template</span><span class="p">.</span><span class="n">Must</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="n">tmpl</span><span class="p">))</span>
<span class="n">t</span><span class="p">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="p">[]</span><span class="n">T</span><span class="p">{</span>
    <span class="p">{</span><span class="n">Name</span><span class="p">:</span> <span class="s">&quot;Alice&quot;</span><span class="p">},</span>
    <span class="p">{</span><span class="n">Name</span><span class="p">:</span> <span class="s">&quot;Bob&quot;</span><span class="p">},</span>
    <span class="p">{</span><span class="n">Name</span><span class="p">:</span> <span class="s">&quot;Charlie&quot;</span><span class="p">},</span>
    <span class="p">{</span><span class="n">Name</span><span class="p">:</span> <span class="s">&quot;Dave&quot;</span><span class="p">},</span>
<span class="p">})</span>
</pre></div>

<p>その他、条件分岐等のActionは <a href="http://golang.org/pkg/text/template/#hdr-Actions">マニュアルのActionsの</a> 参照</p>
<h2 id="_5">組み込み関数</h2>
<p>こちらも <a href="http://golang.org/pkg/text/template/#hdr-Functions">マニュアルのFunctionsの項</a> を参照</p>]]></content:encoded>
    </item>
    <item>
      <title>GoConveyでGoプロジェクトをブラウザからテストする</title>
      <link>http://mojavy.com/blog/2013/11/17/goconvey/</link>
      <pubDate>Sun, 17 Nov 2013 00:30:57 JST</pubDate>
      <category><![CDATA[golang]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/11/17/goconvey/</guid>
      <description>GoConveyでGoプロジェクトをブラウザからテストする</description>
      <content:encoded><![CDATA[<p><a href="http://smartystreets.github.io/goconvey/">GoConvey</a> を試してみたらなかなかよかったので紹介します。</p>
<h2 id="_1">目次</h2>
<div class="toc">
<ul>
<li><a href="#_1">目次</a></li>
<li><a href="#goconvey">goconveyとは</a></li>
<li><a href="#_2">クイックスタート</a></li>
<li><a href="#_3">テストを書く</a></li>
<li><a href="#_4">ターミナルから自動テスト</a></li>
<li><a href="#tips">tips</a></li>
<li><a href="#_5">まとめ</a></li>
<li><a href="#_6">その他参考</a></li>
</ul>
</div>
<h2 id="goconvey">goconveyとは</h2>
<p>gopherのためのかっこいいテストツールです。以下のような特徴があります。</p>
<ul>
<li><code>go test</code>をそのまま実行できる</li>
<li>リグレッションテストのための一式</li>
<li>見やすく色付けされた出力</li>
<li>完全に自動化されたWeb UI</li>
<li>テストコードジェネレータ</li>
<li>デスクトップ通知</li>
<li>ターミナル上で動く自動テストスクリプト</li>
<li>Sublime Textとの連携</li>
</ul>
<h2 id="_2">クイックスタート</h2>
<div class="pygments_borland"><pre>$ go get github.com/smartystreets/goconvey # install
$ $GOPATH/bin/goconvey
</pre></div>

<p>上記コマンドを実行して <code>http://localhost:8080</code> にブラウザからWeb UIアクセスすると、goconveyを起動したディレクトリ以下のファイルの更新を自動的に検知してテストを起動してくれます。</p>
<p>Web UIの右上にあるベルのアイコンをクリックすると、デスクトップ通知も有効にできます。</p>
<p>また、テストが失敗した場合はその部分をクリックすることで、Sublime Textで直接そこにジャンプできます。<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>
<p>特定のディレクトリ以下のテストを実行しないようにすることもできます。テストに時間がかかるような大きなプロジェクトでも適当に必要なところだけ有効にできるので、ストレスがたまりにくいと思います。</p>
<h2 id="_3">テストを書く</h2>
<p>goconveyのWeb UIは<code>go test</code>で起動できるテストならなんにでも使えますが<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> 、goconveyのテスティングフレームワークをつかうとさらにわかりやすい結果を出力できます。</p>
<div class="pygments_borland"><pre><span class="k">package</span> <span class="n">goconveytest</span>

<span class="k">import</span> <span class="p">(</span>
    <span class="p">.</span> <span class="s">&quot;github.com/smartystreets/goconvey/convey&quot;</span>
    <span class="s">&quot;testing&quot;</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">TestSpec</span><span class="p">(</span><span class="n">t</span> <span class="p">*</span><span class="n">testing</span><span class="p">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">var</span> <span class="n">x</span> <span class="nb">int</span>

    <span class="c1">// Only pass t into top-level Convey calls</span>
    <span class="n">Convey</span><span class="p">(</span><span class="s">&quot;Given some integer with a starting value&quot;</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">x</span> <span class="p">=</span> <span class="mi">1</span>

        <span class="n">Convey</span><span class="p">(</span><span class="s">&quot;When the integer is incremented&quot;</span><span class="p">,</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">x</span><span class="p">++</span>

            <span class="n">Convey</span><span class="p">(</span><span class="s">&quot;The value should be greater by one&quot;</span><span class="p">,</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
                <span class="n">So</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">ShouldEqual</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
            <span class="p">})</span>
        <span class="p">})</span>
    <span class="p">})</span>
<span class="p">}</span>
</pre></div>

<p>Web UIから文章を入力することでテストコードをある程度自動生成することもできます。</p>
<p>BDDスタイルはあんまり得意ではないので詳細は省略します。</p>
<h2 id="_4">ターミナルから自動テスト</h2>
<p>ブラウザなんて立ちあげたくない硬派な人向けにターミナルでファイル監視してテストを起動できるスクリプトも提供されています。
emacsのロックファイルがあると落ちてしまう問題があったのですが、さっきpull requestだしたらすぐマージしてくれました。 <a href="https://github.com/smartystreets/goconvey/pull/88">https://github.com/smartystreets/goconvey/pull/88</a> </p>
<div class="pygments_borland"><pre>$GOPATH/src/github.com/smartystreets/goconvey/scripts/idle.py -v
</pre></div>

<h2 id="tips">tips</h2>
<ul>
<li><code>localhost:8080/latest</code>にアクセスするとjsonでテスト結果がとれます</li>
<li>goconveyのWeb UIは<code>GOPATH</code>以下のパッケージのディレクトリで起動する必要があります (例えば、<code>$GOPATH/src/github.com/yourname/packagename</code>)</li>
</ul>
<h2 id="_5">まとめ</h2>
<p>goconveyを簡単に紹介しました。Web UIだけでも試す価値はあると思います。</p>
<p>ビデオでの解説もあります。ぶっちゃけこの記事を読むより動画を見たほうが早いです。</p>
<iframe width="420" height="315" src="//www.youtube.com/embed/vL_UD1oAF0E" frameborder="0" allowfullscreen></iframe>

<h2 id="_6">その他参考</h2>
<ul>
<li><a href="http://qiita.com/takuan_osho/items/51c8856a3d28145d87bc">http://qiita.com/takuan_osho/items/51c8856a3d28145d87bc</a> </li>
<li><a href="http://blog.satotaichi.info/testingframeworks-for-golang">http://blog.satotaichi.info/testingframeworks-for-golang</a> </li>
</ul>
<div class="footnote">
<hr />
<ol>
<li id="fn:1">
<p>残念なことにemacsやvimには対応していない&#160;<a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text">&#8617;</a></p>
</li>
<li id="fn:2">
<p>ginkgoやtestifyのテストも実行できます。ただし、ginkgoのテスト結果はデフォルトだとエスケープシーケンスがそのまま表示されてしまいます&#160;<a href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text">&#8617;</a></p>
</li>
</ol>
</div>]]></content:encoded>
    </item>
  </channel>
</rss>
