<?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, 21 Apr 2015 01:10:40 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>組み込み用プログラミング言語のパフォーマンス比較</title>
      <link>http://mojavy.com/blog/2015/04/21/embedded-languages-benchmarks/</link>
      <pubDate>Tue, 21 Apr 2015 01:10:40 JST</pubDate>
      <category><![CDATA[v8]]></category>
      <category><![CDATA[lua]]></category>
      <category><![CDATA[lisp]]></category>
      <category><![CDATA[programming]]></category>
      <category><![CDATA[ruby]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2015/04/21/embedded-languages-benchmarks/</guid>
      <description>組み込み用プログラミング言語のパフォーマンス比較</description>
      <content:encoded><![CDATA[<p>組み込み用のプログラミング言語といえばLuaがよく使われるけど、最近はmrubyやsquirrelもあって選択肢が広がってきた感があるのでどういう特徴があるのかを知るためにベンチマークをやってみた。</p>
<p>今回対象にしたのは以下。</p>
<ul>
<li>Lua - v5.1</li>
<li>LuaJIT - v2.0.2</li>
<li>squirrel - v3.0.7</li>
<li>V8 - v3.30</li>
<li>mruby - v1.1.0</li>
<li>ecl (Embeddable Common-Lisp) - v15.3.7</li>
</ul>
<p>ここでのベンチマークは言語自体のスピードの比較ではなく、どちらかというと組み込む際に必要なオーバーヘッドやホスト言語側での処理にかかる部分に重点を置いた。</p>
<p>ベンチマークの処理では、関数呼出し比較用の<code>echo</code>関数と、テーブル操作比較用の<code>invert</code>関数を組み込み言語側に実装して、それを繰り返し呼び出すようにした。</p>
<p>また、なるべく公平になるように、組み込み言語側の関数は初期化時にグローバルスコープ(組み込み言語側のグローバルスコープ)に登録しておき、すべて同じインターフェースから呼ぶようにした。</p>
<p>使用したコードは以下。そのうち別の言語とか追加するかもしれない。</p>
<p><a href="https://github.com/taksatou/embench">https://github.com/taksatou/embench</a> </p>
<h2 id="_1">結果</h2>
<h4 id="echo-100000">echo 100000 回実行</h4>
<p><img alt="echo" src="/images/embench-echo-100000.png" /> </p>
<h4 id="invert-100000">invert 100000 回実行</h4>
<p><img alt="invert" src="/images/embench-invert-100000.png" /> </p>
<p><a href="https://gist.github.com/taksatou/8de85bbfe79548864cf5#file-result-md">https://gist.github.com/taksatou/8de85bbfe79548864cf5#file-result-md</a> </p>
<h4 id="_2">備考</h4>
<ul>
<li>control は同等の処理をホスト言語側で実装したもの</li>
<li>LuaJITは<code>LD_PRELOAD</code>で切り替えた</li>
<li>eclはechoが遅くてやるきを失ったのでinvertのほうは省略</li>
</ul>
<h2 id="_3">所感</h2>
<ul>
<li>Luaがパフォーマンスと組み込みやすさの点でやはり一番使いやすい。LuaJITをつかうとさらに数割速くなる。</li>
<li>squirrelは言語機能的にはluaのスーパーセットという感じで、パフォーマンスもluaと同じ程度。ただしドキュメントはあまりない。</li>
<li>V8はマルチスレッド環境や大規模なものには向いてるかもしれない。組み込みはちょっとめんどくさい。</li>
<li>mrubyはechoだと意外と健闘しているがテーブル操作は速くない。組み込みはLuaと同じくらい簡単。</li>
<li>eclにはもうちょっとがんばってほしい。組み込み方法に問題があるのかもしれない。</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>mustache基礎文法最速マスター</title>
      <link>http://mojavy.com/blog/2013/10/01/mustache-quick-master/</link>
      <pubDate>Tue, 01 Oct 2013 00:08:09 JST</pubDate>
      <category><![CDATA[ruby]]></category>
      <category><![CDATA[mustache]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/10/01/mustache-quick-master/</guid>
      <description>mustache基礎文法最速マスター</description>
      <content:encoded><![CDATA[<p><img alt="mustache" src="/images/mustache-logo-250.png" /> </p>
<p>mustacheはシンプルなテンプレートエンジンなので本家の英語マニュアル <a href="http://mustache.github.io/mustache.5.html">mustache(5)</a> を見ても大したことはないですが、日本語情報の需要もそれなりにあると思うのでまとめておきます。</p>
<p>以下の内容はrubygemの<code>mustache-0.99.4</code>で確認しています。
他の言語の場合は適宜置きかえてください。</p>
<h2 id="_1">目次</h2>
<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>
<li><a href="#lambda">無名関数 (Lambda)</a></li>
<li><a href="#_6">コメント</a></li>
<li><a href="#_7">まとめ</a></li>
</ul>
</div>
<h2 id="_2">変数の展開</h2>
<p><code>{{name}}</code>のように2つのブレースで囲ったタグは、<code>name</code>という名前のキーの値でおきかえられます。</p>
<p>対応するキーが見つからなかった場合はデフォルトでは空文字になります。</p>
<div class="pygments_borland"><pre><span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;Hello, {{world}}!&quot;</span><span class="p">,</span> <span class="n">world</span><span class="p">:</span> <span class="s2">&quot;mustache&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;Hello, mustache!&quot;</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;{{no_such_key}}&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;&quot;</span>
</pre></div>

<h2 id="_3">変数のエスケープ</h2>
<p>デフォルトではHTMLエスケープが有効になります。アンエスケープされたHTMLが使いたい場合は<code>{{{name}}}</code>のように3つのブレースで囲います。</p>
<div class="pygments_borland"><pre><span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;{{html}}&quot;</span><span class="p">,</span>  <span class="n">html</span><span class="p">:</span> <span class="s2">&quot;&lt;b&gt;GitHub&lt;/b&gt;&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;&amp;lt;b&amp;gt;GitHub&amp;lt;/b&amp;gt;&quot;</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;{{{html}}}&quot;</span><span class="p">,</span> <span class="n">html</span><span class="p">:</span> <span class="s2">&quot;&lt;b&gt;GitHub&lt;/b&gt;&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;&lt;b&gt;GitHub&lt;/b&gt;&quot;</span>
</pre></div>

<h2 id="_4">条件分岐</h2>
<p><code>{{#name}} ... {{/name}}</code>のように、2つのタグに<code>#</code>と<code>/</code>をそれぞれつけたタグで囲われたブロックはセクションといいます。</p>
<p>セクションのキーに対応する値にbool値を渡せばif文のような使い方ができます。
<code>#</code>のかわりに<code>^</code>をつかうと真偽を反転できます。</p>
<div class="pygments_borland"><pre><span class="n">template</span> <span class="o">=</span> <span class="o">&lt;&lt;</span><span class="no">DOC</span>
<span class="sh">{{#condition}}</span>
<span class="sh">It is true.</span>
<span class="sh">{{/condition}}</span>
<span class="sh">{{^condition}}</span>
<span class="sh">No not true.</span>
<span class="sh">{{/condition}}</span>
<span class="no">DOC</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">condition</span><span class="p">:</span> <span class="kp">true</span><span class="p">)</span> <span class="c1"># =&gt; &quot;It is true.\n&quot;</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">condition</span><span class="p">:</span> <span class="kp">false</span><span class="p">)</span> <span class="c1"># =&gt; &quot;No not true.\n&quot;</span>
</pre></div>

<h2 id="_5">ループ</h2>
<p>セクションのキーに対応する値に配列を渡した場合は、それぞれの要素を引数として中のブロックが繰り返し評価されます。</p>
<div class="pygments_borland"><pre><span class="n">template</span> <span class="o">=</span> <span class="o">&lt;&lt;</span><span class="no">DOC</span>
<span class="sh">{{#animals}}</span>
<span class="sh">{{name}}</span>
<span class="sh">{{/animals}}</span>
<span class="no">DOC</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="n">animals</span><span class="p">:</span> <span class="o">[</span><span class="p">{</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;cat&quot;</span><span class="p">},</span> <span class="p">{</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;dog&quot;</span><span class="p">},</span> <span class="p">{</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;pig&quot;</span><span class="p">}</span><span class="o">]</span><span class="p">}</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="c1"># =&gt; &quot;cat\ndog\npig\n&quot;</span>
</pre></div>

<h2 id="lambda">無名関数 (Lambda)</h2>
<p>セクションのキーに対応する値に呼び出し可能なオブジェクトを渡した場合は、そのブロック内のテキストを引数として実行され、その返り値が結果として出力されます。</p>
<div class="pygments_borland"><pre><span class="n">template</span> <span class="o">=</span> <span class="o">&lt;&lt;</span><span class="no">DOC</span>
<span class="sh">{{#proc}}</span>
<span class="sh">mojavy is bad</span>
<span class="sh">{{/proc}}</span>
<span class="no">DOC</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="nb">proc</span><span class="p">:</span> <span class="o">-&gt;</span><span class="n">text</span><span class="p">{</span><span class="n">text</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/bad/</span><span class="p">,</span> <span class="s1">&#39;nice&#39;</span><span class="p">)})</span> <span class="c1"># =&gt; &quot;mojavy is nice\n&quot;</span>
</pre></div>

<h2 id="_6">コメント</h2>
<p><code>!</code>をつけるとコメントになります</p>
<div class="pygments_borland"><pre><span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;Comment here: {{! ignore me }}&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;Comment here: &quot;</span>
</pre></div>

<h2 id="_7">まとめ</h2>
<p>mustacheの基本的な機能について簡単なサンプルコードとともに解説しました。
ここではrubyのmustacheを使用しましたが、他の言語でも同様の機能が使えます。
一部の機能については省略しているので、より詳細な情報については本家ドキュメントを参照してください。</p>]]></content:encoded>
    </item>
    <item>
      <title>debianパッケージをchefで削除する場合はpurgeを使う方がよい</title>
      <link>http://mojavy.com/blog/2013/09/10/chef-purge-package/</link>
      <pubDate>Tue, 10 Sep 2013 19:39:49 JST</pubDate>
      <category><![CDATA[chef]]></category>
      <category><![CDATA[ruby]]></category>
      <category><![CDATA[debian]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/09/10/chef-purge-package/</guid>
      <description>debianパッケージをchefで削除する場合はpurgeを使う方がよい</description>
      <content:encoded><![CDATA[<p>apt-getコマンドにはパッケージを削除するためのコマンドが2種類ある</p>
<ul>
<li>remove: パッケージを削除するが設定ファイルはそのまま残す</li>
<li>purge: パッケージを削除するとき設定ファイルも削除する</li>
</ul>
<p>chefをつかっているということは設定ファイルもchefで管理しているはずなので、設定ファイルを残す必要はない。
さらに、依存で入ったパッケージも一緒に削除されるように、<code>options "--auto-remove"</code>などとしてやるとよい。</p>
<p>ゴミは混乱の元なので早めに消すべし。</p>]]></content:encoded>
    </item>
    <item>
      <title>chef soloでAuthenticationFailedといわれたときの対応</title>
      <link>http://mojavy.com/blog/2013/09/09/chef-solo-ssh-config/</link>
      <pubDate>Mon, 09 Sep 2013 20:43:04 JST</pubDate>
      <category><![CDATA[chef]]></category>
      <category><![CDATA[ruby]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/09/09/chef-solo-ssh-config/</guid>
      <description>chef soloでAuthenticationFailedといわれたときの対応</description>
      <content:encoded><![CDATA[<p>公開鍵認証なホストに対してパスフレーズ入力無しでsshログインができるにもかかわらず、</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>knife solo cook myhost
Running Chef on myhost...
Checking Chef version...
Enter the password <span class="k">for </span>username@myhost:
ERROR: Net::SSH::AuthenticationFailed: username
</pre></div>

<p>のようにいわれてchef soloの実行に失敗してしまうときがある。</p>
<p>パスフレーズ入力無しでsshできたということは、普通は以下のうちの少くとも1つは満たされている。</p>
<ol>
<li>ssh-agentに対象の秘密鍵が登録されている</li>
<li>デフォルトパス($HOME/.ssh/id_rsa とか)に対象のパスフレーズ無し秘密鍵が保存されている</li>
<li>ssh_configでパスフレーズ無し秘密鍵を指定している</li>
</ol>
<p>それなのに<code>AuthenticationFailed</code>失敗してしまうのは、Net:SSHがデフォルトでは公開鍵認証を試行しない場合があるため。 <sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> 
これを回避するには、ssh_configで<code>PubkeyAuthentication yes</code>を明示すればよい。</p>
<p>なお、<code>Net::SSH</code>がどのような動きをしているかは以下のスニペットを試すとよい。</p>
<div class="pygments_borland"><pre><span class="nb">require</span> <span class="s1">&#39;net/ssh&#39;</span>
<span class="no">Net</span><span class="o">::</span><span class="no">SSH</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="s2">&quot;myhost&quot;</span><span class="p">,</span> <span class="s2">&quot;username&quot;</span><span class="p">,</span> <span class="ss">:verbose</span> <span class="o">=&gt;</span> <span class="ss">:debug</span><span class="p">)</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="nb">p</span> <span class="n">x</span> <span class="p">}</span>
</pre></div>

<h3 id="_1">備考</h3>
<p>使ったのは以下のバージョン</p>
<ul>
<li>chef: 11.6.0</li>
<li>knife-solo: 0.3.0</li>
</ul>
<div class="footnote">
<hr />
<ol>
<li id="fn:1">
<p>この挙動は<code>knife solo</code>コマンドに<code>-i</code>オプションを渡しても変わらなかった。&#160;<a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text">&#8617;</a></p>
</li>
</ol>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Rubotoを使ってRubyでAndroidアプリをかく</title>
      <link>http://mojavy.com/blog/2013/03/29/ruboto/</link>
      <pubDate>Fri, 29 Mar 2013 21:53:15 JST</pubDate>
      <category><![CDATA[android]]></category>
      <category><![CDATA[ruby]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/03/29/ruboto/</guid>
      <description>Rubotoを使ってRubyでAndroidアプリをかく</description>
      <content:encoded><![CDATA[<p><img alt="ruboto" src="/images/ruboto-200.png" /></p>
<p>最近iOSアプリ界隈では<a href="http://www.rubymotion.com/">RubyMotion</a>や<a href="http://mobiruby.org/">MobiRuby</a>が盛り上がってきてますが、Androidでも<a href="http://ruboto.org/">Ruboto</a>をつかえば簡単にrubyで開発することができるようになります。</p>
<p>そもそもjavaで実装された処理系であれば大抵javaクラスの呼びだしは簡単にできるようになっているので、jrubyやjythonでandroidアプリを開発することは以前から可能でした。
しかし、以下のような問題があって実際にやるとなるとそれなりに面倒なものでした。</p>
<ol>
<li>jrubyやjythonをdalvikvm用バイナリ(dex)にコンパイルするのに時間がかかる<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></li>
<li>androidのjavaでは使えない機能を使って処理系を実装してある場合があるので、何らかの方法で回避する必要がある</li>
<li>スクリプトのソースファイルの配置やパスの設定を自分でやる必要があり、パッケージングが面倒 </li>
<li>アプリのフットプリントが大きくなる<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup></li>
</ol>
<p>Rubotoをつかえばこのあたりの面倒をみてくれるので、ほとんどjavaを書く必要がなくなります。Ruboto自体は結構前からありますが、ここ1年くらいでもろもろの機能が充実してきて大分実用的になってきた感があります。</p>
<p>以下Rubotoの使用方法について簡単に紹介します。</p>
<h2 id="_1">インストール</h2>
<div class="pygments_borland"><pre>gem install ruboto
gem install jruby-jars
</pre></div>

<p>また、<code>ANDROID_HOME</code>環境変数の設定と、android sdkの <code>tools/</code> と <code>platform-tools/</code>にはあらかじめパスをとおしておきます</p>
<h2 id="_2">雛形の生成</h2>
<div class="pygments_borland"><pre>ruboto gen app --package org.rubyandroid.new_demo

# 以下のようにしてより詳細に設定することもできます
# ruboto gen app --package org.rubyandroid.new_demo --path ./myapp --name MyApp --target android-17 --min-sdk android-10 --activity MainActivityName
</pre></div>

<h2 id="_3">ビルドとインストール</h2>
<p>rakeからビルドできるようになっています。また、rubyスクリプトの更新はコンパイル不要で反映できます。
あとは普通にrubyを書くだけです。</p>
<div class="pygments_borland"><pre>cd new_demo
rake
rake install

#
# edit ruby scripts..
#

rake update_scripts
</pre></div>

<h2 id="rubygems">rubygemsを使う</h2>
<p>通常の<code>Gemfile</code>と同じ内容を、<code>Gemfile.apk</code>という名前のファイルに書いてプロジェクトのルートディレクトリに置いておけば、<code>rake</code>した際に<code>libs/bundle.jar</code>を生成してapkにいれてくれます。</p>
<p>詳細は以下の例を参考にしてください。
<a href="https://github.com/ruboto/ruboto/wiki/Tutorial%3A-Using-an-SQLite-database-with-ActiveRecord">https://github.com/ruboto/ruboto/wiki/Tutorial%3A-Using-an-SQLite-database-with-ActiveRecord</a></p>
<h2 id="_4">補足</h2>
<p>rubotoではjrubyの実行環境は別途Ruboto Core platformというapkで提供されています。そのためアプリ本体にruby処理系を同梱する必要がなく、省サイズでコンパイルも速くなるというメリットがあります。しかし、このやり方だとRuboto Core platformを別途インストールしてもらう必要がでてきてしまい、実際にGoogle Playで配布するようなアプリでは受け入れ難いと思います。</p>
<p>これを回避する方法も提供されていて、プロジェクトを生成する際に<code>--with-jruby</code>というオプションをつければjrubyを同梱したapkをビルドできるようになりますが、この場合は前述のメリットはうけられなくなります。ただ、コンパイル時間に関しては、rubyスクリプトだけを触っている限りは、dexの再コンパイルは必要ないのでそれほど気にならないと思います。</p>
<h2 id="_5">まとめ</h2>
<ul>
<li>androidで素のjrubyを使うのは茨の道ですが、rubotoを使えば非常に簡単にrubyを使えるようになります</li>
<li>jrubyなので普通のrubygemsやjavaでかかれたライブラリもそのまま使えます</li>
<li>javaで開発した場合はコンパイル〜再インストールが毎回必要になりますが、<code>.rb</code>の更新反映は高速にできるので開発効率があがります</li>
<li>まだそれほど使い込んでないので思わぬはまりどころがあるかもしれません</li>
</ul>
<div class="footnote">
<hr />
<ol>
<li id="fn:1">
<p>dxが分割コンパイルに対応してないので回避しづらい&#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>ファイルサイズも実行時のメモリ使用量も&#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>
    <item>
      <title>hekyllのimpress.jsスライドを自動的にグリッド配置するjekyllプラグイン</title>
      <link>http://mojavy.com/blog/2013/03/26/jekyll-plugin/</link>
      <pubDate>Tue, 26 Mar 2013 20:37:24 JST</pubDate>
      <category><![CDATA[jekyll]]></category>
      <category><![CDATA[impress.js]]></category>
      <category><![CDATA[ruby]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/03/26/jekyll-plugin/</guid>
      <description>hekyllのimpress.jsスライドを自動的にグリッド配置するjekyllプラグイン</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/bmcmurray/hekyll">hekyll</a>は<a href="https://github.com/bartaz/impress.js/">impress.js</a>用<a href="https://github.com/mojombo/jekyll">jekyll</a>テンプレのようなものだけど、スライドの位置を個別に指定する必要があってめんどうだったので適当なグリッドに配置するプラグインを書いた。</p>
<h3 id="jekyll">jekyllのプラグインについて</h3>
<p><a href="https://github.com/mojombo/jekyll/wiki/Plugins">https://github.com/mojombo/jekyll/wiki/Plugins</a>に必要なことは大体書いてある。</p>
<p>jekyllのディレクトリに<code>_plugins</code>ディレクトリを作り、その中に<code>*.rb</code>をおいておけば自動的にロードされる。
プラグインの種類はおおまかに以下の4通り。サンプルは本家wikiにあるのでメモもかねて概要だけ。</p>
<ul>
<li>Generators 
<ul></li>
<li>カテゴリ別とか期間別といった任意のルールでページを生成する
</ul></li>
<li>Converters
<ul></li>
<li>hamlとかjsonとかのフォーマット変換をする
</ul></li>
<li>Tags
<ul></li>
<li>liquidテンプレートエンジンのタグを追加する</li>
<li>たとえば、<code>{{ your_tag }}</code> というタグをつかいたければ、<code>Liquid::Tag</code>を継承したクラスをつくって、<code>Liquid::Template.register_tag('your_tag', Jekyll::YourTag)</code> などとする
</ul></li>
<li>Filters
<ul></li>
<li>liquidのフィルタを追加する</li>
<li>フィルタとはいいつつどんな関数でも登録できる</li>
<li>適当にモジュールをつくって、<code>Liquid::Template.register_filter(Jekyll::YourModule)</code>とすると、<code>{{ 'arg' | your_filter }}</code> のようにして呼びだせる
</ul></li>
</ul>
<h3 id="_1">ソース</h3>
<p>wikiで説明されているpluginの書き方を踏まえた上で、それを完全に無視する方法で実装した。
Postクラスを拡張してhekyllにあうようにliquidに渡すデータを上書きしてるだけ。</p>
<p>もっといい方法はあると思う。</p>
<div class="pygments_borland"><pre><span class="k">def</span> <span class="nf">once</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
  <span class="k">unless</span> <span class="p">(</span><span class="vi">@__once_executed__</span> <span class="o">||=</span> <span class="o">[]</span><span class="p">)</span><span class="o">.</span><span class="n">include?</span> <span class="n">tag</span>
    <span class="k">yield</span>
    <span class="vi">@__once_executed__</span> <span class="o">&lt;&lt;</span> <span class="n">tag</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="k">module</span> <span class="nn">Jekyll</span>
  <span class="k">class</span> <span class="nc">Post</span>

    <span class="k">def</span> <span class="nf">grid_position</span>
      <span class="n">pos</span> <span class="o">=</span> <span class="vi">@site</span><span class="o">.</span><span class="n">posts</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span>
      <span class="n">siz</span> <span class="o">=</span> <span class="no">Math</span><span class="o">::</span><span class="n">sqrt</span><span class="p">(</span><span class="vi">@site</span><span class="o">.</span><span class="n">posts</span><span class="o">.</span><span class="n">size</span><span class="p">)</span><span class="o">.</span><span class="n">ceil</span>
      <span class="p">{</span>
        <span class="s2">&quot;x&quot;</span> <span class="o">=&gt;</span> <span class="mi">1000</span> <span class="o">*</span> <span class="p">(</span><span class="n">pos</span> <span class="o">%</span> <span class="n">siz</span><span class="p">),</span>
        <span class="s2">&quot;y&quot;</span> <span class="o">=&gt;</span> <span class="mi">1000</span> <span class="o">*</span> <span class="p">(</span><span class="n">pos</span> <span class="o">/</span> <span class="n">siz</span><span class="p">),</span>
      <span class="p">}</span>
    <span class="k">end</span>

    <span class="n">once</span><span class="p">(</span><span class="ss">:redefine_to_liquid</span><span class="p">)</span> <span class="k">do</span>
      <span class="k">alias</span> <span class="n">__old_to_liquid</span> <span class="n">to_liquid</span>
      <span class="k">def</span> <span class="nf">to_liquid</span>

        <span class="n">dat</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">data</span><span class="o">[</span><span class="s2">&quot;data&quot;</span><span class="o">]</span>

        <span class="k">if</span> <span class="n">dat</span><span class="o">.</span><span class="n">nil?</span>
          <span class="nb">self</span><span class="o">.</span><span class="n">data</span><span class="o">[</span><span class="s2">&quot;data&quot;</span><span class="o">]</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">grid_position</span>
        <span class="k">end</span>
        <span class="n">__old_to_liquid</span>
      <span class="k">end</span>
    <span class="k">end</span>

  <span class="k">end</span>
<span class="k">end</span>
</pre></div>

<p><a href="https://gist.github.com/taksatou/5244991">https://gist.github.com/taksatou/5244991</a></p>
<h3 id="_2">まとめ</h3>
<p>impress.jsをつかっておいて単なるグリッドというのもどうかとは思いますが、位置決めをする部分をかえればなんとでもなるのでひまなときにがんばればいいと思います</p>]]></content:encoded>
    </item>
    <item>
      <title>Rainbow for Common Lisp 作りました</title>
      <link>http://mojavy.com/blog/2013/02/19/rainbow-for-common-lisp/</link>
      <pubDate>Tue, 19 Feb 2013 23:55:00 JST</pubDate>
      <category><![CDATA[ruby]]></category>
      <category><![CDATA[common lisp]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/02/19/rainbow-for-common-lisp/</guid>
      <description>Rainbow for Common Lisp 作りました</description>
      <content:encoded><![CDATA[<p><img alt="lisp" src="/images/cl-rainbow-demo.png" /></p>
<p><a href="http://mojavy.com/blog/2013/02/18/ltsv-for-common-lisp/">昨日</a>のテンプレを流用して今日はcl-rainbowという地味なライブラリの宣伝をします。</p>
<p><a href="https://github.com/taksatou/cl-rainbow">https://github.com/taksatou/cl-rainbow</a></p>
<p>cl-rainbowとは、<a href="https://github.com/sickill/rainbow">rubygemにあるrainbow</a>をCommon Lispに移植したものです。
これを使うとターミナルの出力を簡単に色付けできます。</p>
<h3 id="_1">インストール</h3>
<p>現在(2013-02-19) quicklisp登録申請中です。登録されれば以下でインストールできます。</p>
<div class="pygments_borland"><pre>(ql:quickload &#39;cl-rainbow)
</pre></div>

<h3 id="_2">使い方</h3>
<p>以下のように使います。</p>
<div class="pygments_borland"><pre>(setf cl-rainbow:*enabled* t)
(print (cl-rainbow:color :red &quot;red string&quot;))
(print (cl-rainbow:color #x5599ff &quot;rgb color code&quot;))
(loop for c across &quot;RAINBOW&quot; do (format t &quot;~A&quot; (cl-rainbow:color (random #xffffff) c)))
</pre></div>

<p>特に解説は不要だと思いますが、端末はカラー表示に対応している必要があります。</p>
<p>RGBのカラーコード指定すると、256色にダウンサンプルして一番近い色を表示します。</p>
<p>その他、例にはのせてませんが、端末が対応していれば斜体や太字にもできます。詳細はソースを見てください。</p>
<h3 id="_3">まとめ</h3>
<p>ログ出力のときとかにちょっと便利なときがあるかもしれません。</p>
<p>リードマクロで文字列リテラルをごにょごにょして色付けできるようにするともうちょっと便利になるような気がするので、そのうちチャレンジしてみたいと思います。</p>
<p>フィードバック等ありましたらコメント頂けるとうれしいです。</p>]]></content:encoded>
    </item>
    <item>
      <title>tmuxでalcの英単語を引く</title>
      <link>http://mojavy.com/blog/2013/01/11/alc-nokogiri-tmux/</link>
      <pubDate>Fri, 11 Jan 2013 22:00:00 JST</pubDate>
      <category><![CDATA[ruby]]></category>
      <category><![CDATA[tmux]]></category>
      <category><![CDATA[english]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/01/11/alc-nokogiri-tmux/</guid>
      <description>tmuxでalcの英単語を引く</description>
      <content:encoded><![CDATA[<p><img alt="english" src="/images/english-200.png" /></p>
<p><b>2013-01-15追記 規約違反とのコメント頂いたのでスクレイピングするスクリプトを削除しました。</b></p>
<p>tmuxのcommand-promptを使うと任意のコマンドをインタラクティブに実行できます。
これをつかってtmux上でalcの英単語を表示できるようにしたら思いの外便利だったので紹介します。</p>
<p>まず、alcの検索結果をスクレイビングしていい感じに表示するコマンドをつくります。
rubyのnokogiriとrainbowに依存してますが、ぼくがつくった適当なスクリプトでよければこれを使って下さい。</p>
<div class="pygments_borland"><pre><span class="c1"># 2013-01-15 削除しました</span>
</pre></div>

<p>これをパスの通った場所にalcという名前で保存して、.tmux.confに以下の設定を追記します。</p>
<div class="pygments_borland"><pre>unbind C-a
<span class="nb">bind </span>C-a <span class="nb">command</span>-prompt <span class="s2">&quot;split-window -h &#39;alc %% | lv -c&#39;&quot;</span>
</pre></div>

<p>C-aにバインドしてますがお好みのキーに変えてください。
rainbowで色付けしてるのでエスケープシーケンスを解釈できるpagerをつかって下さい。</p>
<p>これで.tmux.confをリロードして、prefix-key C-a とかするとtmux上にプロンプトが表示されるので、そこで調べたい単語を入力します。
そうすると新しいpaneに結果が表示されます。pagerを閉じると自動的にpaneも閉じます。</p>]]></content:encoded>
    </item>
    <item>
      <title>ワンライナーでウェブサーバを起動する方法</title>
      <link>http://mojavy.com/blog/2012/07/18/one-line-webserver/</link>
      <pubDate>Wed, 18 Jul 2012 12:30:00 JST</pubDate>
      <category><![CDATA[python]]></category>
      <category><![CDATA[web]]></category>
      <category><![CDATA[ruby]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2012/07/18/one-line-webserver/</guid>
      <description>ワンライナーでウェブサーバを起動する方法</description>
      <content:encoded><![CDATA[<p><img alt="ruby" src="/images/ruby-logo.png" /></p>
<p>とりあえずウェブサーバがたちあがりさえすればいいときは、pythonのSimpleHTTPServerを使うのが便利です。
起動したカレントディレクトリ以下のファイルをブラウズできるので、テスト用のスタティックなスタブデータを一時的に配置したいときとかにも使えます。最近の一般的なlinuxディストリビューションであればデフォルトではいってるpythonで使えると思います。</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>python -mSimpleHTTPServer 3333
</pre></div>

<p>デフォルトポートは8000ですが、引数で指定することもできます。
<br>
ちなみにrubyでもwebrickを使って同様のことができますが、<a href="http://d.hatena.ne.jp/rx7/20090812/p1">こちら</a> で紹介されているwebrickのワンライナーは長すぎて覚えられないのでいつもpythonを使ってます。
<br>
<br>
でもリクエストに応じたロジックを入れたい場合はrubyのsinatraの方が便利です。</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>ruby -rsinatra -e <span class="s1">&#39;get(&quot;/&quot;){sleep 3}&#39;</span>
</pre></div>

<p>ポートを変更する場合は以下のようにします</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>ruby -rsinatra -e <span class="s1">&#39;set :port,3333; get(&quot;/&quot;){sleep 3}&#39;</span>
</pre></div>

<h2 id="_1">参考</h2>
<ul>
<li><a href="http://d.hatena.ne.jp/rx7/20090812/p1">コマンド1つで今すぐWebサーバを起動させるためのワンライナー(Ruby or Python)</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>rubyのワンライナーで便利な変数まとめ</title>
      <link>http://mojavy.com/blog/2012/07/08/ruby-oneliner-special-variables/</link>
      <pubDate>Sun, 08 Jul 2012 18:30:00 JST</pubDate>
      <category><![CDATA[ruby]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2012/07/08/ruby-oneliner-special-variables/</guid>
      <description>rubyのワンライナーで便利な変数まとめ</description>
      <content:encoded><![CDATA[<p><img alt="ruby" src="/images/ruby-logo.png" /></p>
<h1 id="_1">$.</h1>
<p>現在の行番号を表します。awkでいうNRと同じです。</p>
<div class="pygments_borland"><pre><span class="n">ruby</span> <span class="o">-</span><span class="n">ne</span> <span class="s1">&#39;puts &quot;#{$.},#{$_}&quot;&#39;</span>
</pre></div>

<h1 id="-i">$-i</h1>
<p>この値を文字列で上書きするとin-place置換を行うようになります。オリジナルのファイルはここで指定した文字が拡張子についたファイルとして保存されます。オリジナルファイルが不要なら空文字を設定すればOKです。</p>
<div class="pygments_borland"><pre><span class="n">ruby</span> <span class="o">-</span><span class="n">ne</span> <span class="s1">&#39;BEGIN{$-i=&quot;.old&quot;}; puts($_) if /foo/&#39;</span> <span class="n">path</span><span class="o">/</span><span class="n">to</span><span class="o">/</span><span class="n">file</span>
</pre></div>

<h1 id="_2">$/</h1>
<p>入力の区切り文字を表わす文字です。デフォルトは改行です。</p>
<div class="pygments_borland"><pre><span class="n">ruby</span> <span class="o">-</span><span class="n">ne</span> <span class="s1">&#39;BEGIN{$/=&quot;,&quot;}; p $_&#39;</span>
</pre></div>

<h1 id="_3">$, 、$;</h1>
<p>$, はjoinのデフォルト区切り文字で、$; はsplitのデフォルト区切り文字です。
ワンライナーではjoinとsplitをよく使うと思うので、BEGINで上書きしておけばワンライナーを多少短く書けます。</p>
<div class="pygments_borland"><pre><span class="n">ruby</span> <span class="o">-</span><span class="n">ne</span> <span class="s1">&#39;BEGIN{$,=&quot;\t&quot;;$;=&quot;,&quot;}; puts $_.split.join&#39;</span>
</pre></div>

<h1 id="_4">まとめ</h1>
<p>まだ他にも知らないテクニックがたくさんありそうですが、新しく見つけたら追記していきます。</p>
<h1 id="_5">参考</h1>
<ul>
<li><a href="http://blog.lilyx.net/2007/11/29/writing-one-liner-in-ruby/">http://blog.lilyx.net/2007/11/29/writing-one-liner-in-ruby/</a></li>
<li><a href="http://www.ruby-lang.org/ja/old-man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html">http://www.ruby-lang.org/ja/old-man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html</a></li>
</ul>]]></content:encoded>
    </item>
  </channel>
</rss>
