<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
  <title>iddy.jp - RSS feeds by mattn</title> 
  <link>http://iddy.jp/rss/blog/mattn/</link> 
  <description>RSS feeds by mattn hosted at http://iddy.jp/</description>
  <language>ja</language>
  <item>
    <title>シャア「Viをやめろと言ったはずだ。それがVimとはな」 </title> 
    <description>
    <![CDATA[
    
<blockquote class="quote" style="font-size: 13px">
シャア 「Viをやめろと言ったはずだ。それがVimとはな」<br />
セイラ 「兄さんこそ、EmacsユーザにまでなってVimmerに復讐しよう<br />
　　　　　なんてやることが筋違いじゃなくて？」<br />
シャア 「お前の兄がその程度の男だと思っているのか？アルテイシア」<br />
セイラ 「え？」<br />
シャア 「Emacsユーザになって小指を鍛えて来たのも、小指で遠いESCキーを<br />
　　　　　押したかったからだ。しかしな、アルテイシア、私だってそれから<br />
　　　　　少しは大人になった」<br />
<br />
シャア 「VimmerをEmacsユーザが倒すだけではテキストエディタ界の真の<br />
　　　　　平和は得られないと悟ったのだ」<br />
セイラ 「なぜ？」<br />
シャア 「Eclipseの逆襲だ」<br />
セイラ 「EclipseがエディタじゃなくIDEだから？」<br />
<br />
ブライト 『Eclipse？』<br />
<br />
シャア 「うむ、そのEclipseを敵にするのは面白くない。今後はこれまで<br />
　　　　　培った変態技が使えぬ、ということだ」<br />
セイラ 「IDE推進派は、Eclipseは開発環境全体が変わるべき理想のIDEだ、と<br />
　　　　　教えてくれたわ。だったら、Eclipseを敵にする必要はないはずよ」<br />
　　　 「キャスバル兄さん、兄さん何を考えてるの？」<br />
シャア 「もう変態技を使えぬと言った。アルテイシアはVimを使うのを止めろ」<br />
セイラ 「Vim？あの変態エディタのこと？」<br />
シャア 「ああ。Sakuraエディタに乗り換えるくらいの移行手順書は残していく。<br />
　　　　　Windowsユーザになって一生をまっとうしろ。私はもう、<br />
　　　　　お前の知っている兄さんではない」<br />
セイラ 「に、兄さん」<br />
シャア 「vimshellを使っている訳がわかるな？私はシェルを捨てたのだよ」<br />
</blockquote>


インスパイア元<br />

<blockquote class="quote">
  <a href="http://shibats.tumblr.com/post/23600220688/javascript-ajax">シャア</a><br />
  <cite>http://shibats.tumblr.com/post/23600220688/javascript-ajax</cite>
</blockquote>

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/etc/20120523191833.htm</link> 
    <pubDate>Wed, 23 May 2012 19:24:00 +0900</pubDate>
   </item>
  <item>
    <title>GitHub が Windows 向けクライアントを公開！</title> 
    <description>
    <![CDATA[
    
時代がWindowsハッカーに追いついてきた。<br />
<br />
<blockquote class="quote">
  <a href="http://windows.github.com/">GitHub for Windows</a><br />
  <p>sync Stay in sync The sync button turns the complex workflow of pulling and pushing into a single op...</p>
  <cite>http://windows.github.com/</cite>
</blockquote>

<blockquote class="quote">
  <a href="https://github.com/blog/1127-github-for-windows">GitHub for Windows - GitHub</a><br />
  <p>Ever wish there was an easy way to get up and running with Git and GitHub on your Windows computer? ...</p>
  <cite>https://github.com/blog/1127-github-for-windows</cite>
</blockquote>
<br />
<br />

<img src="http://go-gyazo.appspot.com/c2a8628d901275fd.png" alt="github for windows" />
<br />
<br />

待ってたよ。<br />
ダウンロードしてインストールしてみた。<br />

<img src="http://go-gyazo.appspot.com/a51897a89d3ddf58.png" alt="login" />
<br />
<br />

<em>この後、PC内から存在するリポジトリを検索してくれるけど、いくらか抜けがあったのであまりあてにならない。</em><br />
ここでスキップしても後から超簡単に追加出来るので、いっそスキップしてしまって良い。<br />
<br />


ログインすると所属の一覧なんかが出てくる。<br />
<img src="http://go-gyazo.appspot.com/4c080fb4ec27443f.png" alt="organizations" />
<br />
<br />

<br />
右側のパネルにリポジトリを含むフォルダをドロップすると、リポジトリ一覧に追加される。<br />
自分のリポジトリじゃなくても使えるし、管理しやすそうだったので僕はローカルにある物をガサーっとドロップした。<br />
<br />

<img src="http://go-gyazo.appspot.com/41c22318e9a229b6.png" alt="repos" />
<br />
<br />

絞り込みも出来るし、右のペインにREADMEも表示される。もちろんmarkdownにも対応。<br />

<img src="http://go-gyazo.appspot.com/cfa17909710a3288.png" alt="filter" />
<br />
<br />

リポジトリ名をダブルクリックするとcommit一覧とファイル一覧が表示される。<br />

<img src="http://go-gyazo.appspot.com/91a19fa7f3b74b65.png" alt="commits" />
<br />
<br />
ここからブランチを切り替えたり、選択リポジトリへpushしたり、revertしたり色んな事が出来る。<br />
あと、github上の各リポジトリに「clone in windows」というボタンが出来ていて、これをクリックするとGitHub for Windowsの管理対象に追加される。<br />

<img src="http://go-gyazo.appspot.com/df04326d4ebdddfa.png" alt="clone in windows" />
<br />
<br />
<br />
ぶっちゃけ、他のGit GUIに比べたら非にならないくらい便利だし、分かりやすい。<br />
<br />
エクスプローラのエクステンションなんかも試した事あるけど、僕は殆どgithubで管理してるのでこれがあればいらない子。<br />
Gitリポジトリ管理ツールはこれで決まりだ。<br />
<br />
要望を言うとしたら、少し重たいのと、filterでキーをタイプするとフォーカスを見失ってしまうことくらいかな。

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/github/20120522091742.htm</link> 
    <pubDate>Tue, 22 May 2012 09:19:00 +0900</pubDate>
   </item>
  <item>
    <title>Perl で 逆FizzBuzz</title> 
    <description>
    <![CDATA[
    
<blockquote class="quote">
  <a href="http://d.hatena.ne.jp/matarillo/20120515/p1">逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記</a><br />
  <p>逆FizzBuzz問題 (Inverse FizzBuzz) General | Inverse Fizzbuzz - just another scala quant を日本語にしました。 ちなみに...</p>
  <cite>http://d.hatena.ne.jp/matarillo/20120515/p1</cite>
</blockquote>

逆FizzBuzzって、オートマトンなので正規表現を使うと楽に出来るはず。

<blockquote class="code">
<span class="PreProc">#!perl</span><br />
<span class="Statement">use strict</span>;<br />
<span class="Statement">use warnings</span>;<br />
<span class="Statement">use&nbsp;</span>Test::More;<br />
<br />
<span class="Statement">sub&nbsp;</span><span class="Identifier">inv_fizzbuzz&nbsp;</span>{<br />
&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;(<span class="Identifier">$fz</span>,&nbsp;<span class="Identifier">$n</span>,&nbsp;<span class="Identifier">$pat</span>) = (<span class="Constant">''</span>,&nbsp;<span class="Constant">1</span>,&nbsp;<span class="Statement">join</span>&nbsp;<span class="Constant">'</span><span class="Constant">,*?</span><span class="Constant">'</span>,&nbsp;<span class="Identifier">@_</span>);<br />
&nbsp;&nbsp;<span class="Statement">while</span>&nbsp;(<span class="Constant">1</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$fz</span>&nbsp;.=&nbsp;<span class="Identifier">$n</span>&nbsp;%&nbsp;<span class="Constant">15</span>&nbsp;&gt;&nbsp;<span class="Constant">0</span>&nbsp;?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$n</span>&nbsp;%&nbsp;<span class="Constant">3</span>&nbsp;&gt;&nbsp;<span class="Constant">0</span>&nbsp;?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$n</span>&nbsp;%&nbsp;<span class="Constant">5</span>&nbsp;&gt;&nbsp;<span class="Constant">0</span>&nbsp;?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">'</span><span class="Constant">,</span><span class="Constant">'</span>:&nbsp;<span class="Constant">'</span><span class="Constant">buzz,</span><span class="Constant">'</span>:&nbsp;<span class="Constant">'</span><span class="Constant">fizz,</span><span class="Constant">'</span>:&nbsp;<span class="Constant">'</span><span class="Constant">fizzbuzz,</span><span class="Constant">'</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(<span class="Identifier">$fz</span>&nbsp;=~&nbsp;<span class="Statement">/</span><span class="Constant">,</span><span class="Special">(</span><span class="Identifier">$pat</span><span class="Special">)</span><span class="Statement">/</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$rhs</span>&nbsp;=&nbsp;<span class="Identifier">$</span><span class="Constant">1</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$lhs</span>&nbsp;=&nbsp;<span class="Statement">substr</span>(<span class="Identifier">$fz</span>,&nbsp;<span class="Constant">0</span>,&nbsp;<span class="Statement">index</span>(<span class="Identifier">$fz</span>,&nbsp;<span class="Identifier">$rhs</span>) +&nbsp;<span class="Constant">1</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$lhs</span>&nbsp;=~&nbsp;<span class="Statement">s/</span><span class="Special">(</span><span class="Constant">fizz|buzz</span><span class="Special">)</span><span class="Statement">//g</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$rhs</span>&nbsp;=~&nbsp;<span class="Statement">s/</span><span class="Special">(</span><span class="Constant">fizz|buzz</span><span class="Special">)</span><span class="Statement">//g</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$lhs</span>&nbsp;=&nbsp;<span class="Statement">length</span>(<span class="Identifier">$lhs</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$rhs</span>&nbsp;=&nbsp;<span class="Identifier">$lhs</span>&nbsp;+&nbsp;<span class="Statement">length</span>(<span class="Identifier">$rhs</span>||<span class="Constant">''</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;[<span class="Identifier">$lhs</span>,&nbsp;<span class="Identifier">$rhs</span>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$n</span>++;<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">3</span>,&nbsp;<span class="Constant">3</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>), [<span class="Constant">5</span>,&nbsp;<span class="Constant">5</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>), [<span class="Constant">3</span>,&nbsp;<span class="Constant">5</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">5</span>,&nbsp;<span class="Constant">6</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>), [<span class="Constant">6</span>,&nbsp;<span class="Constant">10</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">6</span>,&nbsp;<span class="Constant">9</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">3</span>,&nbsp;<span class="Constant">6</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizzbuzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">15</span>,&nbsp;<span class="Constant">18</span>]);<br />
<br />
done_testing;<br />
</blockquote>


<b>追記1</b><br />
Vimだとこうか？<br />
<blockquote class="code">
<span class="Statement">function</span>!&nbsp;<span class="Special">s:</span>inv_fizzbuzz<span class="Special">(</span><span class="Statement">...</span><span class="Special">)</span><br />
&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;[fz,&nbsp;<span class="Statement">n</span>,&nbsp;<span class="Statement">p</span>]&nbsp;<span class="Statement">=</span>&nbsp;[<span class="Constant">''</span>,&nbsp;<span class="Constant">1</span>,&nbsp;<span class="Identifier">join</span><span class="Special">(</span><span class="Identifier">a:000</span>,&nbsp;<span class="Constant">',\{-}'</span><span class="Special">)</span>]<br />
&nbsp;&nbsp;<span class="Statement">while</span>&nbsp;<span class="Constant">1</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">fz</span>&nbsp;<span class="Statement">.=</span>&nbsp;<span class="Statement">n</span>%<span class="Constant">15</span><span class="Statement">&gt;</span><span class="Constant">0</span>?<span class="Statement">n</span>%<span class="Constant">3</span><span class="Statement">&gt;</span><span class="Constant">0</span>?<span class="Statement">n</span>%<span class="Constant">5</span><span class="Statement">&gt;</span><span class="Constant">0</span>?<span class="Constant">&quot;,&quot;</span>:&nbsp;<span class="Constant">&quot;buzz,&quot;</span>:&nbsp;<span class="Constant">&quot;fizz,&quot;</span>:&nbsp;<span class="Constant">&quot;fizzbuzz,&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">m</span>&nbsp;<span class="Statement">=</span>&nbsp;<span class="Identifier">matchstr</span><span class="Special">(</span>fz, p<span class="Special">)</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;<span class="Identifier">len</span><span class="Special">(</span>m<span class="Special">)</span>&nbsp;<span class="Statement">&gt;</span>&nbsp;<span class="Constant">0</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">lhs</span>&nbsp;<span class="Statement">=</span>&nbsp;<span class="Identifier">len</span><span class="Special">(</span><span class="Identifier">split</span><span class="Special">(</span>fz[:<span class="Normal">stridx</span><span class="Special">(</span>fz, m<span class="Special">)</span><span class="Statement">-</span><span class="Constant">1</span>],&nbsp;<span class="Constant">','</span>,&nbsp;<span class="Constant">1</span><span class="Special">))</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;[lhs,&nbsp;lhs&nbsp;<span class="Statement">+</span>&nbsp;<span class="Identifier">len</span><span class="Special">(</span><span class="Identifier">split</span><span class="Special">(</span>m,&nbsp;<span class="Constant">','</span>,&nbsp;<span class="Constant">1</span><span class="Special">))</span><span class="Statement">-</span><span class="Constant">1</span>]<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">endif</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">n</span>&nbsp;<span class="Statement">+=</span>&nbsp;<span class="Constant">1</span><br />
&nbsp;&nbsp;<span class="Statement">endwhile</span><br />
<span class="Statement">endfunction</span><br />
</blockquote>
<br />

<b>追記2</b><br />
ちょっと改良。方針は変わってない。<br/ >

<blockquote class="code">
<span class="PreProc">#!perl</span><br />
<span class="Statement">use strict</span>;<br />
<span class="Statement">use warnings</span>;<br />
<span class="Statement">use&nbsp;</span>Test::More;<br />
<br />
<span class="Statement">my</span>&nbsp;<span class="Identifier">$gs</span>&nbsp;=&nbsp;<span class="Constant">'</span><span class="Constant">AAFAABAFAAAFABAAFAAAZ</span><span class="Constant">'</span>;<br />
<br />
<span class="Statement">sub&nbsp;</span><span class="Identifier">inv_fizzbuzz&nbsp;</span>{<br />
&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;(<span class="Identifier">$fz</span>,&nbsp;<span class="Identifier">$n</span>,&nbsp;<span class="Identifier">$pat</span>) = (<span class="Constant">''</span>,&nbsp;<span class="Constant">1</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">join</span>(<span class="Constant">'</span><span class="Constant">A*?</span><span class="Constant">'</span>,&nbsp;<span class="Statement">map</span>({<span class="Constant">fizz</span>=&gt;<span class="Constant">'</span><span class="Constant">F</span><span class="Constant">'</span>,&nbsp;<span class="Constant">buzz</span>=&gt;<span class="Constant">'</span><span class="Constant">B</span><span class="Constant">'</span>,&nbsp;<span class="Constant">fizzbuzz</span>=&gt;<span class="Constant">'</span><span class="Constant">Z</span><span class="Constant">'</span>}-&gt;{<span class="Identifier">$_</span>},&nbsp;<span class="Identifier">@_</span>)));<br />
&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$m</span>;<br />
&nbsp;&nbsp;<span class="Statement">while</span>&nbsp;(<span class="Constant">1</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$fz</span>&nbsp;.=&nbsp;<span class="Identifier">$n</span>&nbsp;%&nbsp;<span class="Constant">15</span>&nbsp;&gt;&nbsp;<span class="Constant">0</span>&nbsp;?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$n</span>&nbsp;%&nbsp;<span class="Constant">3</span>&nbsp;&gt;&nbsp;<span class="Constant">0</span>&nbsp;?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$n</span>&nbsp;%&nbsp;<span class="Constant">5</span>&nbsp;&gt;&nbsp;<span class="Constant">0</span>&nbsp;?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">'</span><span class="Constant">A</span><span class="Constant">'</span>:&nbsp;<span class="Constant">'</span><span class="Constant">B</span><span class="Constant">'</span>:&nbsp;<span class="Constant">'</span><span class="Constant">F</span><span class="Constant">'</span>:&nbsp;<span class="Constant">'</span><span class="Constant">Z</span><span class="Constant">'</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">last</span>&nbsp;<span class="Statement">if</span>&nbsp;<span class="Statement">length</span>(<span class="Identifier">$fz</span>) &gt;&nbsp;<span class="Statement">length</span>(<span class="Identifier">$gs</span>) *&nbsp;<span class="Statement">length</span>(<span class="Identifier">@_</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(<span class="Identifier">$fz</span>&nbsp;=~&nbsp;<span class="Statement">/</span><span class="Constant">^</span><span class="Special">.*(</span><span class="Identifier">$pat</span><span class="Special">)</span><span class="Identifier">$</span><span class="Statement">/</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$rhs</span>&nbsp;=&nbsp;<span class="Identifier">$</span><span class="Constant">1</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$lhs</span>&nbsp;=&nbsp;<span class="Statement">substr</span>(<span class="Identifier">$fz</span>,&nbsp;<span class="Constant">0</span>,&nbsp;<span class="Statement">rindex</span>(<span class="Identifier">$fz</span>,&nbsp;<span class="Identifier">$rhs</span>) +&nbsp;<span class="Constant">1</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$m</span>&nbsp;= [<span class="Identifier">$lhs</span>,&nbsp;<span class="Identifier">$rhs</span>]&nbsp;<span class="Statement">if</span>&nbsp;!<span class="Statement">defined</span>(<span class="Identifier">$m</span>) ||&nbsp;<span class="Statement">length</span>(<span class="Identifier">@{$m}[</span><span class="Constant">1</span><span class="Identifier">]</span>)&nbsp;<span class="Statement">gt</span>&nbsp;<span class="Statement">length</span>(<span class="Identifier">$rhs</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$n</span>++;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;[]&nbsp;<span class="Statement">unless</span>&nbsp;<span class="Identifier">$m</span>;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;(<span class="Identifier">$lhs</span>,&nbsp;<span class="Identifier">$rhs</span>) =&nbsp;<span class="Identifier">@{$m}</span>;<br />
&nbsp;&nbsp;<span class="Identifier">$lhs</span>&nbsp;=&nbsp;<span class="Statement">length</span>(<span class="Identifier">$lhs</span>);<br />
&nbsp;&nbsp;<span class="Identifier">$rhs</span>&nbsp;=&nbsp;<span class="Identifier">$lhs</span>&nbsp;+&nbsp;<span class="Statement">length</span>(<span class="Identifier">$rhs</span>||<span class="Constant">''</span>) -&nbsp;<span class="Constant">1</span>;<br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;[<span class="Identifier">$lhs</span>,&nbsp;<span class="Identifier">$rhs</span>];<br />
}<br />
<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">3</span>,&nbsp;<span class="Constant">3</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>), [<span class="Constant">5</span>,&nbsp;<span class="Constant">5</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>), [<span class="Constant">9</span>,&nbsp;<span class="Constant">10</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">5</span>,&nbsp;<span class="Constant">6</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>), [<span class="Constant">6</span>,&nbsp;<span class="Constant">10</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">6</span>,&nbsp;<span class="Constant">9</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">3</span>,&nbsp;<span class="Constant">6</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizzbuzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">15</span>,&nbsp;<span class="Constant">18</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">fizzbuzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">fizz</span><span class="Constant">'</span>), [<span class="Constant">15</span>,&nbsp;<span class="Constant">18</span>]);<br />
is_deeply(inv_fizzbuzz(<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>,&nbsp;<span class="Constant">'</span><span class="Constant">buzz</span><span class="Constant">'</span>), []);<br />
<br />
done_testing;<br />
</blockquote>

vimスクリプト版はkoronさんが書いてた。<br />
<blockquote class="quote">
  <a href="https://github.com/koron/zzub-zzif-vim">koron/zzub-zzif-vim ﾂｷ GitHub</a><br />
  <cite>https://github.com/koron/zzub-zzif-vim</cite>
</blockquote>

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/lang/perl/20120517135954.htm</link> 
    <pubDate>Thu, 17 May 2012 14:00:00 +0900</pubDate>
   </item>
  <item>
    <title>Go言語から mruby が操作できる go-mruby 書いた</title> 
    <description>
    <![CDATA[
    
<blockquote class="quote">
  <a href="https://github.com/mattn/go-mruby">mattn/go-mruby - GitHub</a><br />
  <p>go-mruby make interface to embed mruby into go.</p>
  <cite>https://github.com/mattn/go-mruby</cite>
</blockquote>

Matzさんにヒントも貰いながら、さっき出来ました。<br />
メソッドは <code>Run</code> と <code>Eval</code> があり、mrubyの評価値を取得する事が出来ます。Go言語から渡した引数が ARGV になります。なので mruby 上では String とは限りません。<br />

<blockquote class="code">
<span class="Statement">package</span>&nbsp;main<br />
<br />
<span class="Statement">import</span>&nbsp;<span class="Constant">&quot;github.com/mattn/go-mruby&quot;</span><br />
<br />
<span class="Statement">func</span>&nbsp;main() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;mrb := mruby.New()<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">defer</span>&nbsp;mrb.Close()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">println</span>(mrb.Eval(<span class="Constant">`&quot;hello &quot; + ARGV[0]`</span>,&nbsp;<span class="Constant">&quot;mruby&quot;</span>).(<span class="Type">string</span>))<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">for</span>&nbsp;_, i :=&nbsp;<span class="Statement">range</span>&nbsp;mrb.Eval(<span class="Constant">`ARGV.map {|x| x + 1}`</span>,&nbsp;<span class="Constant">1</span>,&nbsp;<span class="Constant">2</span>,&nbsp;<span class="Constant">3</span>).([]<span class="Statement">interface</span>{}) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">println</span>(i.(<span class="Type">int32</span>))&nbsp;<span class="Comment">// 2 3 4</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</blockquote>

良かったら遊んでみて下さい。

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/lang/ruby/20120510180554.htm</link> 
    <pubDate>Thu, 10 May 2012 19:04:00 +0900</pubDate>
   </item>
  <item>
    <title>mruby で Sinatra に似せた WAF、Sinatic が動いた。</title> 
    <description>
    <![CDATA[
    
<img src="http://go-gyazo.appspot.com/8d6ba539edc6910d.png" alt="しなちく" align="right" />
「お前それ、シナチクって言いたかっただけやろ」<br />
<br />
...<br />
...<br />
...<br />
...<br />
<br/ >
「そうですが、何か」<br />
<br />
mruby で <a href="https://github.com/mattn/mruby-http">mruby-http</a> と <a href="https://github.com/mattn/mruby-uv">mruby-uv</a> を使い、sinatra ライクなのが動くまでに到った。<br />
ショボいアプリケーションなら書ける様になったけど、mrubyはまだファイルIOが出来ないのでアプリと呼べる様な物が動くにはまだまだ先。<br clear="all" />
<blockquote class="code">
<span class="PreProc">require</span>&nbsp;<span class="Special">'</span><span class="Constant">HTTP</span><span class="Special">'</span><br />
<span class="PreProc">require</span>&nbsp;<span class="Special">'</span><span class="Constant">UV</span><span class="Special">'</span><br />
<br />
<span class="Comment"># {{{</span><br />
<span class="PreProc">module</span>&nbsp;<span class="Type">Sinatic</span><br />
&nbsp;&nbsp;<span class="Identifier">@routes</span>&nbsp;=&nbsp;{&nbsp;<span class="Special">'</span><span class="Constant">GET</span><span class="Special">'</span>&nbsp;=&gt;&nbsp;[],&nbsp;<span class="Special">'</span><span class="Constant">POST</span><span class="Special">'</span>&nbsp;=&gt;&nbsp;[]&nbsp;}<br />
&nbsp;&nbsp;<span class="PreProc">def</span>&nbsp;<span class="Constant">self</span>.<span class="Identifier">route</span>(method, path, opts, &amp;block)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">@routes</span>[method] &lt;&lt;&nbsp;[path, opts, block]<br />
&nbsp;&nbsp;<span class="PreProc">end</span><br />
&nbsp;&nbsp;<span class="PreProc">def</span>&nbsp;<span class="Constant">self</span>.<span class="Identifier">do</span>(r)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">@routes</span>[r.method].each&nbsp;{|<span class="Identifier">path</span>|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;path[<span class="Constant">0</span>] == r.path<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param =&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.body.split(<span class="Special">'</span><span class="Constant">&amp;</span><span class="Special">'</span>).each&nbsp;{|<span class="Identifier">x</span>|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokens = x.split(<span class="Special">'</span><span class="Constant">=</span><span class="Special">'</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param[tokens[<span class="Constant">0</span>]] =&nbsp;<span class="Type">HTTP</span>::<span class="Type">URL</span>::decode(tokens[<span class="Constant">1</span>])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body = path[<span class="Constant">2</span>].call(r, param)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Special">&quot;</span><span class="Constant">HTTP/1.0 200 OK</span><span class="Special">&quot;</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Special">&quot;</span><span class="Constant">Content-Type: text/html; charset=utf-8</span><span class="Special">&quot;</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Special">&quot;</span><span class="Constant">Content-Length:&nbsp;</span><span class="Special">#{</span>body.size<span class="Special">}</span><span class="Special">&quot;</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Special">&quot;&quot;</span>,&nbsp;<span class="Special">&quot;&quot;</span>].join(<span class="Special">&quot;</span><span class="Special">\r\n</span><span class="Special">&quot;</span>) + body<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">end</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;<span class="Special">&quot;</span><span class="Constant">HTTP/1.0 404 Not Found</span><span class="Special">\r\n</span><span class="Constant">Content-Length: 10</span><span class="Special">\r\n\r\n</span><span class="Constant">Not Found</span><span class="Special">\n</span><span class="Special">&quot;</span><br />
&nbsp;&nbsp;<span class="PreProc">end</span><br />
&nbsp;&nbsp;<span class="PreProc">def</span>&nbsp;<span class="Constant">self</span>.<span class="Identifier">run</span>()<br />
&nbsp;&nbsp;&nbsp;&nbsp;s =&nbsp;<span class="Type">UV</span>::<span class="Type">TCP</span>.new()<br />
&nbsp;&nbsp;&nbsp;&nbsp;s.bind(<span class="Type">UV</span>::ip4_addr(<span class="Special">'</span><span class="Constant">127.0.0.1</span><span class="Special">'</span>,&nbsp;<span class="Constant">8888</span>))<br />
&nbsp;&nbsp;&nbsp;&nbsp;s.data =&nbsp;[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;s.listen(<span class="Constant">50</span>)&nbsp;{|<span class="Identifier">x</span>|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;<span class="Statement">if</span>&nbsp;x !=&nbsp;<span class="Constant">0</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c = s.accept()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.read_start {|<span class="Identifier">b</span>|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h =&nbsp;<span class="Type">HTTP</span>::<span class="Type">Parser</span>.new()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h.parse_request(b) {|<span class="Identifier">r</span>|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = b.index(<span class="Special">&quot;</span><span class="Special">\r\n\r\n</span><span class="Special">&quot;</span>) +&nbsp;<span class="Constant">4</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.body = b.slice(i, b.size - i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.write(::<span class="Type">Sinatic</span>.do(r)) {|<span class="Identifier">x</span>|&nbsp;c.close }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.data &lt;&lt; c<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">while</span>&nbsp;<span class="Constant">1</span>&nbsp;<span class="Statement">do</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Comment">#&nbsp;</span><span class="Todo">NOTE</span><span class="Comment">: must be call run_once to run GC.</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Type">UV</span>::run_once()<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">end</span><br />
&nbsp;&nbsp;<span class="PreProc">end</span><br />
<span class="PreProc">end</span><br />
<br />
<span class="PreProc">module</span>&nbsp;<span class="Type">Kernel</span><br />
&nbsp;&nbsp;<span class="PreProc">def</span>&nbsp;<span class="Identifier">get</span>(path, opts={}, &amp;block)<br />
&nbsp;&nbsp;&nbsp;&nbsp;::<span class="Type">Sinatic</span>.route&nbsp;<span class="Special">'</span><span class="Constant">GET</span><span class="Special">'</span>, path, opts, &amp;block<br />
&nbsp;&nbsp;<span class="PreProc">end</span><br />
&nbsp;&nbsp;<span class="PreProc">def</span>&nbsp;<span class="Identifier">post</span>(path, opts={}, &amp;block)<br />
&nbsp;&nbsp;&nbsp;&nbsp;::<span class="Type">Sinatic</span>.route&nbsp;<span class="Special">'</span><span class="Constant">POST</span><span class="Special">'</span>, path, opts, &amp;block<br />
&nbsp;&nbsp;<span class="PreProc">end</span><br />
<span class="PreProc">end</span><br />
<span class="Comment"># }}}</span><br />
<br />
get&nbsp;<span class="Special">&quot;</span><span class="Constant">/foo.js</span><span class="Special">&quot;</span>&nbsp;<span class="Statement">do</span><br />
<span class="Special">'</span><span class="Constant">$(function() {</span><br />
<span class="Constant">&nbsp;&nbsp;$(&quot;#foo&quot;).text(&quot;hello world&quot;);</span><br />
<span class="Constant">})</span><span class="Special">'</span><br />
<span class="Statement">end</span><br />
<br />
get&nbsp;<span class="Special">&quot;</span><span class="Constant">/</span><span class="Special">&quot;</span>&nbsp;<span class="Statement">do</span><br />
<span class="Special">'</span><br />
<span class="Constant">&lt;script src=&quot;<a href="http://code.jquery.com/jquery-latest.js">http://code.jquery.com/jquery-latest.js</a>&quot;&gt;&lt;/script&gt;</span><br />
<span class="Constant">&lt;script src=&quot;/foo.js&quot;&gt;&lt;/script&gt;</span><br />
<span class="Constant">&lt;div id=&quot;foo&quot;&gt;&lt;/div&gt;</span><br />
<span class="Constant">&lt;form action=&quot;/add&quot; method=&quot;post&quot;&gt;</span><br />
<span class="Constant">&lt;label for=&quot;name&quot;/&gt;お名前&lt;/label&gt;</span><br />
<span class="Constant">&lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot; value=&quot;&quot;&gt;</span><br />
<span class="Constant">&lt;input type=&quot;submit&quot;&gt;</span><br />
<span class="Constant">&lt;/form&gt;</span><br />
<span class="Special">'</span><br />
<span class="Statement">end</span><br />
<br />
post&nbsp;<span class="Special">&quot;</span><span class="Constant">/add</span><span class="Special">&quot;</span>&nbsp;<span class="Statement">do</span>&nbsp;|<span class="Identifier">r</span>,&nbsp;<span class="Identifier">param</span>|<br />
<span class="Special">&quot;</span><br />
<span class="Constant">&lt;meta http-equiv=refresh content='2; URL=/'&gt;</span><br />
<span class="Constant">通報しますた「</span><span class="Special">#{</span>param[<span class="Special">'</span><span class="Constant">name</span><span class="Special">'</span>]<span class="Special">}</span><span class="Constant">」</span><br />
<span class="Special">&quot;</span><br />
<span class="Statement">end</span><br />
<br />
<br />
<span class="Type">Sinatic</span>.run<br />
<br />
<span class="Comment"># vim&#0058; set fdm=marker:</span><br />
</blockquote>

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/lang/ruby/20120509211817.htm</link> 
    <pubDate>Wed, 09 May 2012 21:19:00 +0900</pubDate>
   </item>
</channel>
</rss>
