<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10japanesefull.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" xml:lang="ja"><title type="text">◆F99a.q8oVE::Blog</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/" /><updated>2009-09-19T15:45:33+00:00</updated><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="f99aq" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><id>tag:blog.f99aq8ove.net,2005:/</id><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.jp/f99aq" /><entry><title type="html">FreeBSD 7.2でHadoopのサンプルを動かしてみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/09/1253375133.html" /><category term="hadoop" /><author><name>◆F99a.q8oVE</name></author><updated>2009-09-19T08:45:33-07:00</updated><id>tag:blog.f99aq8ove.net,2009-09-20:/archive/2009/09/1253375133.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
とりあえず、hadoop用のアカウントを作ってみた。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% sudo adduser hadoop&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
このユーザー用に、パスワード無しのSSH鍵を作って、ログインできるようにしておく。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
予めtarballを手動で/usr/ports/distfilesに入れておいて、&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% cd /usr/ports/java/diablo-jdk16&#xD;
% sudo make config          # TZUPDATEは無効にしておく(手抜き)&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
で、JDKのインストール&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% sudo portinstall java/diablo-jdk16&#xD;
% sudo portinstall shells/bash&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
JDKが入ったら、次はhadoopのインストール。&lt;a href="http://hadoop.apache.org/common/releases.html#Download"&gt;http://hadoop.apache.org/common/releases.html#Download&lt;/a&gt;らへんからダウンロード。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% tar zxvf hadoop-0.20.1.tar.gz&#xD;
% cd hadoop-0.20.1/conf&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
hadoop-env.shのJAVA_HOMEを設定しておく。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
export JAVA_HOME=/usr/local/diablo-jdk1.6.0&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
docs/quickstart.htmlを見ながら&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
conf/core-site.xml&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;property&amp;gt;&#xD;
    &amp;lt;name&amp;gt;fs.default.name&amp;lt;/name&amp;gt;&#xD;
    &amp;lt;value&amp;gt;hdfs://localhost:9000&amp;lt;/value&amp;gt;&#xD;
  &amp;lt;/property&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
conf/hdfs-site.xml&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;property&amp;gt;&#xD;
    &amp;lt;name&amp;gt;dfs.replication&amp;lt;/name&amp;gt;&#xD;
    &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&#xD;
  &amp;lt;/property&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
conf/mapred-site.xml&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;property&amp;gt;&#xD;
    &amp;lt;name&amp;gt;mapred.job.tracker&amp;lt;/name&amp;gt;&#xD;
    &amp;lt;value&amp;gt;localhost:9001&amp;lt;/value&amp;gt;&#xD;
  &amp;lt;/property&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
起動してみる。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% cd ../bin&#xD;
% ./hadoop namenode -format        # HDFSの初期化&#xD;
% ./start-all.sh&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
エラーが出なければ成功。jpsで動作してるか確認できる。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% mkdir ~/inputs&#xD;
% cp CHANGES.txt ~/inputs            # 適当なファイルを入れて&#xD;
% hadoop dfs -put ~/inputs inputs    # HDFSにコピー&#xD;
% hadoop dfs -ls inputs              # コピーできたか確認&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
いよいよ、map, reduceを実行してみる。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% hadoop jar hadoop-0.20.1-examples.jar wordcount inputs outputs&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
ほっとくと、なにやら出力が出て終了。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
## __GooglePrettify__&#xD;
% hadoop dfs -ls outputs&#xD;
Found 2 items&#xD;
drwxr-xr-x   - hadoop supergroup          0 2009-09-19 22:58 /user/hadoop/outputs/_logs&#xD;
-rw-r--r--   1 hadoop supergroup     126351 2009-09-19 22:59 /user/hadoop/outputs/part-r-00000&#xD;
% hadoop dfs -cat outputs/part-r-00000      # に、単語をカウントした結果が出力される&#xD;
&lt;/pre&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">C++ で学ぶ JavaScript の参照渡し (入門編)</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/05/1241948336.html" /><category term="JavaScript" /><category term="C++" /><author><name>◆F99a.q8oVE</name></author><updated>2009-05-10T02:38:56-07:00</updated><id>tag:blog.f99aq8ove.net,2009-05-10:/archive/2009/05/1241948336.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
発端は、2ch で見かけた、この発言 &lt;a href="http://pc11.2ch.net/test/read.cgi/tech/1192182741/605"&gt;JavaScript&lt;/a&gt;.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
まずは、こちらをご覧ください。&lt;br&gt;&#xD;
(注: 例示の JavaScript は SpiderMonkey や Rhino のインタプリターで実行するか、print を alert に読みかえてブラウザーで実行してください。)&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
function func1(a) {&#xD;
    a = {hoge: 2};&#xD;
}&#xD;
var b = {hoge: 1};&#xD;
func1(b);&#xD;
print(b.hoge); // =&amp;gt; 1&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
実行すると、1 と表示されましたよね。「参照渡し(call by reference)なら、ここで 2 と表示されなければおかしい。これは、値渡し(call by value)じゃないの?」というのがリンク先で投げかけられていた疑問です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ここで、次の関数を考えてみます。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
function func2(a) {&#xD;
    a.hoge = 2;&#xD;
}&#xD;
var b = {hoge: 1};&#xD;
func2(b);&#xD;
print(b.hoge); // =&amp;gt; 2&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
今度は 2 と表示されたと思います。この挙動を指して、参照渡しだと説明された場合は納得できると思います。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ここで、突然ですが、視点を変えて C++ で同様の関数をつくってみましょう。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
#include &amp;lt;iostream&amp;gt;&#xD;
&#xD;
using namespace std;&#xD;
&#xD;
class Hoge&#xD;
{&#xD;
public:&#xD;
    int hoge;&#xD;
    Hoge(int a) : hoge(a) {}&#xD;
};&#xD;
&#xD;
void func_v1(Hoge a)&#xD;
{&#xD;
    a = Hoge(2);&#xD;
}&#xD;
&#xD;
void func_v2(Hoge a)&#xD;
{&#xD;
    a.hoge = 2;&#xD;
}&#xD;
&#xD;
void func_r1(Hoge &amp;amp;a)&#xD;
{&#xD;
    a = Hoge(2);&#xD;
}&#xD;
&#xD;
void func_r2(Hoge &amp;amp;a)&#xD;
{&#xD;
    a.hoge = 2;&#xD;
}&#xD;
&#xD;
int main(void)&#xD;
{&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_v1(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 1&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_v2(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 1&#xD;
        // まぁ、値渡しですから。&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_r1(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // おっ!?&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_r2(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // うんうん。これこそ、参照渡しです。&#xD;
    }&#xD;
&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
同じような事をするのに、2 倍のパターンが出てきました。さてさて、JavaScript はどちらのパターンでしょう。&#xD;
結論から言うと後者の _r 付きのパターンにあたります。これが参照渡し(call by refference)です。&#xD;
_v 付きは、もちろん値渡し(call by value)です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ここで、よ〜く見ると、func_r1 と func1 の挙動が異なりますね。&#xD;
ここで更に C++ について学んで行きましょう。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
#include &amp;lt;iostream&amp;gt;&#xD;
&#xD;
using namespace std;&#xD;
&#xD;
class Hoge&#xD;
{&#xD;
public:&#xD;
    int hoge;&#xD;
    Hoge(int a) : hoge(a) {}&#xD;
};&#xD;
&#xD;
void func_p1(Hoge *a)&#xD;
{&#xD;
    a = new Hoge(2);&#xD;
}&#xD;
&#xD;
void func_p1_(Hoge *a)&#xD;
{&#xD;
    *a = Hoge(2);&#xD;
}&#xD;
&#xD;
void func_p2(Hoge *a)&#xD;
{&#xD;
    a-&amp;gt;hoge = 2;&#xD;
}&#xD;
&#xD;
int main(void)&#xD;
{&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_p1(&amp;amp;b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 1&#xD;
        // あらあら (このままだとメモリーリークします)&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_p1_(&amp;amp;b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // おぁ!?&#xD;
    }&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_p2(&amp;amp;b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // うんうん&#xD;
    }&#xD;
&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
またしても分裂してしまいました。ここで、func1 と同じものは func_p1 です。func_r1 と同じものは func_p1_ です。(本当は、参照は書き変え不可な所が違いますが。)&lt;br&gt;&#xD;
func_p1 と func_p1_ の違いのポイントは、代入時の左辺値が a か *a か、という点です。&#xD;
これによって、処理の対象が "ポインタ" か "ポインタが指し示している先のオブジェクト" か、という違いが生じます。&lt;br&gt;&#xD;
C++ では参照を用いることで、"*" を使わずに "参照先のオブジェクト" に対して処理を実行することができます。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ところで、先程の C++ の関数はこうも書けます。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
#include &amp;lt;iostream&amp;gt;&#xD;
&#xD;
using namespace std;&#xD;
&#xD;
class Hoge&#xD;
{&#xD;
public:&#xD;
    int hoge;&#xD;
    Hoge(int a) : hoge(a) {}&#xD;
};&#xD;
&#xD;
void func_r1_(Hoge &amp;amp;a)&#xD;
{&#xD;
    a.operator=(Hoge(2));&#xD;
}&#xD;
&#xD;
int main(void)&#xD;
{&#xD;
    {&#xD;
        Hoge b(1);&#xD;
        func_r1_(b);&#xD;
        cout &amp;lt;&amp;lt; b.hoge &amp;lt;&amp;lt; endl; // =&amp;gt; 2&#xD;
        // おおっ!?&#xD;
    }&#xD;
&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
この書き方のほうが、参照先のオブジェクトの代入演算子を実行している...、参照先のオブジェクトのメンバ関数 operator= を実行しているということがわかりやすいと思います。&lt;br&gt;&#xD;
ポインタによる参照渡しの例 func_p1 に戻ると、こっちは参照先自体(ポインタ)を入れ替える処理が実行されます。そしてこれは、JavaScript での参照渡しと同様の動作です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
func_p1 と func_r1 の差はここです。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
C++ での参照は、一貫して参照先のオブジェクトに○○を適用という感じです。&#xD;
JavaScript でも、C++ のそれとだいたい同じなのですが、代入の時だけは参照を貼り替えるという動作になります。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
なんとなくイメージはつかんでいただけたかなと思うのですが、いかがでしょう?&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
最後に、C++ では参照先のオブジェクトに対して代入演算子が呼ばれると言いましたが、この動作と同じようなことを JavaScript でやってみましょう。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
function assign(that){&#xD;
    if (this === that) return this;&#xD;
&#xD;
    for (var i in that) if (that.hasOwnProperty(i)) {&#xD;
        this[i] = that[i];&#xD;
    }&#xD;
    return this;&#xD;
}&#xD;
&#xD;
function func1_(a) {&#xD;
    a.assign = assign; // Assign method を生やして...&#xD;
    a.assign({hoge: 2});&#xD;
}&#xD;
var b = {hoge: 1};&#xD;
func1_(b);&#xD;
print(b.hoge); // =&amp;gt; 2&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
この様に、ちゃんと値が書き変わりました。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
おわり。(続編は有りません。)&#xD;
&lt;/p&gt;&#xD;
&#xD;
参考文献&#xD;
&lt;ul&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4894714515/f99aq-22/ref=nosim"&gt;Effective C++ 原著第3版&lt;/a&gt;&lt;br&gt;&#xD;
    私はこれで C++ を学びました ;) 持ってるのは改訂第2版だけど。&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4894714760/f99aq-22/ref=nosim"&gt;新訂版 More Effective C++&lt;/a&gt;&lt;br&gt;&#xD;
    私はこれ(ry こっちも、新訂版は持ってない!&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4894714108/f99aq-22/ref=nosim"&gt;Effective STL—STLを効果的に使いこなす50の鉄則&lt;/a&gt;&lt;br&gt;&#xD;
    3 冊セットということで、ついでに。&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4873113296/f99aq-22/ref=nosim"&gt;JavaScript 第5版&lt;/a&gt;&lt;br&gt;&#xD;
    JavaScript といえば、この本。&#xD;
    &lt;/li&gt;&#xD;
    &lt;li&gt;&#xD;
    &lt;a href="http://www.amazon.co.jp/o/ASIN/4873113911/f99aq-22/ref=nosim"&gt;JavaScript: The Good Parts —「良いパーツ」によるベストプラクティス&lt;/a&gt;&lt;br&gt;&#xD;
    JavaScript での Effective C++ 的な本。(だと個人的に思う。)&#xD;
    &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">GooglePrettify でシンタックスハイライトするようにしてみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/05/1241350752.html" /><category term="JavaScript" /><author><name>◆F99a.q8oVE</name></author><updated>2009-05-03T04:39:12-07:00</updated><id>tag:blog.f99aq8ove.net,2009-05-03:/archive/2009/05/1241350752.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
組み込むのは簡単だった。&lt;br&gt;&#xD;
&lt;a href="http://steps.dodgson.org/"&gt;steps to phantasien&lt;/a&gt; インスパイアで、__GooglePrettify__ を埋め込んだ &amp;lt;pre&amp;gt;&#xD;
対象にしてみた。こうしておくと、FeedReader で読んでる人への目印(?)になる。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
これら CSS と JavaScript をロードしておいて、&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&amp;lt;!-- __GooglePrettify__ --&amp;gt;&#xD;
&amp;lt;link rel="stylesheet" type="text/css" href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" /&amp;gt;&#xD;
&#xD;
&amp;lt;script type="text/JavaScript" src="http://www.google.com/jsapi"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
&amp;lt;script type="text/JavaScript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
こんなのを実行するようにしておく。&#xD;
&lt;pre&gt;&#xD;
// __GooglePrettify__&#xD;
(function(){&#xD;
        // jQuery をロードして…&#xD;
        google.load("jquery", "1");&#xD;
&#xD;
        // コールバックは google.setOnLoadCallback で指定&#xD;
        google.setOnLoadCallback(function(){&#xD;
            // __GooglePrettify__ を含む &amp;lt;pre&amp;gt; の class に prettyprint を指定して、__GooglePrettify__ の行を取り除く&#xD;
            $("pre:contains('__GooglePrettify__')").addClass("prettyprint").each(function(i, elm){&#xD;
                    elm.innerHTML = elm.innerHTML.replace(/^.*?__GooglePrettify__.*?\n/, "");&#xD;
                    $(this).css("background-color", "white");&#xD;
                });&#xD;
&#xD;
            // prettyPrint!!&#xD;
            prettyPrint();&#xD;
        });&#xD;
    })();&#xD;
&lt;/pre&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">GooglePrettify のテスト</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/04/1240754481.html" /><category term="C" /><author><name>◆F99a.q8oVE</name></author><updated>2009-04-26T07:01:21-07:00</updated><id>tag:blog.f99aq8ove.net,2009-04-26:/archive/2009/04/1240754481.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			すいません。ちょっとテストしますよ。。。&#xD;
&lt;pre&gt;&#xD;
/* __GooglePrettify__ */&#xD;
#include &amp;lt;stdio.h&amp;gt;&#xD;
&#xD;
int main(void) {&#xD;
    printf("Hello world!\n");&#xD;
    return 0;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">ZFS で snapshot をローテーションしながら取得していく script</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/02/1233759024.html" /><category term="ZFS" /><author><name>◆F99a.q8oVE</name></author><updated>2009-02-04T06:50:24-08:00</updated><id>tag:blog.f99aq8ove.net,2009-02-04:/archive/2009/02/1233759024.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
ZFS で、際限なく延々と snapshot をとるのではなく、古い snapshot は自動で消したいよね、というモチベーション。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
そこで、こんな script を書いてみた。(自己の責任にてご利用ください。)&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;script src="http://gist.github.com/58114.js"&gt;&lt;/script&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
以下のように crontab に書いておくと…&#xD;
&lt;/p&gt;&#xD;
&lt;pre class="syntax-highlight"&gt;&lt;span class="synSpecial"&gt;@daily&lt;/span&gt;   &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank days_later   7  recursive&lt;/span&gt;&#xD;
&lt;span class="synSpecial"&gt;@weekly&lt;/span&gt;  &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank weeks_later  5  recursive&lt;/span&gt;&#xD;
&lt;span class="synSpecial"&gt;@monthly&lt;/span&gt; &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank months_later 12 recursive&lt;/span&gt;&#xD;
&lt;span class="synSpecial"&gt;@yearly&lt;/span&gt;  &lt;span class="synStatement"&gt;/root/bin/zfs_snapshot.sh tank years_later  10 recursive&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
このような感じで、今日 0days_later だった snapshot が明日には 1days_later ... というふうにローテーションしていきます。&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;tank/usr                                    5.23G   137G  2.64G  /usr&#xD;
tank/usr@0weeks_later                           0      -  2.57G  -&#xD;
tank/usr@0months_later                          0      -  2.57G  -&#xD;
tank/usr@3days_later                        29.5K      -  2.57G  -&#xD;
tank/usr@2days_later                        6.22M      -  2.59G  -&#xD;
tank/usr@1days_later                        6.16M      -  2.59G  -&#xD;
tank/usr@0days_later                        6.16M      -  2.59G  -&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
既知の問題&#xD;
&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;snapshot が規定数に達していない場合は、zfs destroy, zfs rename がエラーになる&lt;/li&gt;&#xD;
&lt;li&gt;コメントの英語が変&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">TypePad Connect でコメント欄をつけてみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2009/02/1233495676.html" /><category term="web" /><author><name>◆F99a.q8oVE</name></author><updated>2009-02-01T05:41:16-08:00</updated><id>tag:blog.f99aq8ove.net,2009-02-01:/archive/2009/02/1233495676.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.movabletype.jp/blog/typepad_connect_beta.html"&gt;TypePad Connect Beta を開始 | MovableType.jp&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.typepad.com/connect/"&gt;TypePad - TypePad Connect Beta - Home&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
ということで、つけてみた。↓の方参照。&#xD;
&lt;/p&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">perl で seq を実装してみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/08/1218565761.html" /><category term="perl" /><author><name>◆F99a.q8oVE</name></author><updated>2008-08-12T11:29:21-07:00</updated><id>tag:blog.f99aq8ove.net,2008-08-13:/archive/2008/08/1218565761.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
この前は &lt;a href="http://blog.f99aq8ove.net/archive/2008/08/1217763880.html"&gt;mktemp&lt;/a&gt; を書いてましたが、今度は seq を書いてみました。&#xD;
seq は、shell script でループを書く時によく使ってます。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
勉強ということで、Test::Base を使ってみたり、コードは gist に貼ってみたり...。&#xD;
しかし、これだと feed reader 上で直接コードが読めないところが難点かな。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
(ref: &lt;a href="http://gihyo.jp/dev/feature/01/test-perl/0002"&gt;Happy Testing Perl:第 2 回 Test::Base の紹介|gihyo.jp ... 技術評論社&lt;/a&gt;)&#xD;
&lt;/p&gt;&#xD;
&lt;a href="http://gist.github.com/5103"&gt;gist: 5103 — GitHub&lt;/a&gt;&#xD;
&lt;script src="http://gist.github.com/5103.js"&gt;&lt;/script&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">perl で mktemp を実装してみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/08/1217763880.html" /><category term="perl" /><author><name>◆F99a.q8oVE</name></author><updated>2008-08-03T04:44:40-07:00</updated><id>tag:blog.f99aq8ove.net,2008-08-03:/archive/2008/08/1217763880.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
最近、シェルスクリプトをいじってることが多いんだけど、シェルスクリプト中で使って便利なのが mktemp.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
それで、乱用ぎみに使っていたのですが、とある環境で作業をしていて、mktemp を使おうと思ったら無かったんで perl で実装してみたり。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
&lt;a href="http://freehg.org/u/f99aq/utils/file/09177d8ec349/perl/mktemp"&gt;utils: perl/mktemp@09177d8ec349&lt;/a&gt;にあげておいた。&#xD;
ライセンスは&lt;a href="http://opensource.org/licenses/bsl1.0.html"&gt;Boost Software License 1.0 (BSL1.0)&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
もっときれいに書けないかな〜。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="PreProc"&gt;#!/usr/bin/env perl&lt;/span&gt;&#xD;
&lt;span class="Statement"&gt;use strict&lt;/span&gt;;&#xD;
&lt;span class="Statement"&gt;use warnings&lt;/span&gt;;&#xD;
&lt;span class="Statement"&gt;use &lt;/span&gt;Fcntl;&#xD;
&#xD;
&lt;span class="Comment"&gt;# use Data::Dumper;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$try_count&lt;/span&gt; = &lt;span class="Constant"&gt;10&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%options&lt;/span&gt; = (&#xD;
  &lt;span class="Constant"&gt;t &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;using_tempdir&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;u &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;unsafe&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;d &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;dir&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;,&#xD;
);&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%mode&lt;/span&gt; = (&#xD;
  &lt;span class="Constant"&gt;using_tempdir &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;0&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;unsafe &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;0&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;dir &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;0&lt;/span&gt;,&#xD;
);&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$template&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;foreach&lt;/span&gt; &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$arg&lt;/span&gt; (&lt;span class="Identifier"&gt;@ARGV&lt;/span&gt;) {&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$arg&lt;/span&gt; =~&lt;span class="Statement"&gt; /&lt;/span&gt;&lt;span class="Constant"&gt;^-&lt;/span&gt;&lt;span class="Special"&gt;(.*)&lt;/span&gt;&lt;span class="Constant"&gt;$&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;) {&#xD;
    &lt;span class="Statement"&gt;foreach&lt;/span&gt; (&lt;span class="Statement"&gt;split&lt;/span&gt;&lt;span class="Statement"&gt; //&lt;/span&gt;, &lt;span class="Identifier"&gt;$1&lt;/span&gt;) {&#xD;
      &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;unknown option: &lt;/span&gt;&lt;span class="Identifier"&gt;$_&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt; &lt;span class="Statement"&gt;unless&lt;/span&gt; &lt;span class="Statement"&gt;exists&lt;/span&gt; &lt;span class="Identifier"&gt;$options&lt;/span&gt;{&lt;span class="Identifier"&gt;$_&lt;/span&gt;};&#xD;
      &lt;span class="Identifier"&gt;$mode&lt;/span&gt;{&lt;span class="Identifier"&gt;$options&lt;/span&gt;{&lt;span class="Identifier"&gt;$_&lt;/span&gt;}} = &lt;span class="Constant"&gt;1&lt;/span&gt;;&#xD;
    }&#xD;
  } &lt;span class="Statement"&gt;else&lt;/span&gt; {&#xD;
    &lt;span class="Identifier"&gt;$template&lt;/span&gt; ||= &lt;span class="Identifier"&gt;$arg&lt;/span&gt;;&#xD;
  }&#xD;
}&#xD;
&#xD;
&lt;span class="Statement"&gt;unless&lt;/span&gt; (&lt;span class="Statement"&gt;defined&lt;/span&gt; &lt;span class="Identifier"&gt;$template&lt;/span&gt;) {&#xD;
  &lt;span class="Identifier"&gt;$mode&lt;/span&gt;{using_tempdir} ||= &lt;span class="Constant"&gt;1&lt;/span&gt;;&#xD;
  &lt;span class="Identifier"&gt;$template&lt;/span&gt; = &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;tmp.XXXXXXXXXX&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;;&#xD;
}&#xD;
&#xD;
&lt;span class="Comment"&gt;# warn Dumper \%mode;&lt;/span&gt;&#xD;
&lt;span class="Comment"&gt;# warn $template;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;while&lt;/span&gt; (&lt;span class="Identifier"&gt;$try_count&lt;/span&gt;) {&#xD;
  &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; = &lt;span class="Identifier"&gt;$template&lt;/span&gt;;&#xD;
  &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; =~ &lt;span class="Statement"&gt;s/&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;X&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;&amp;amp;rand_char(&lt;/span&gt;&lt;span class="Identifier"&gt;$1&lt;/span&gt;&lt;span class="Constant"&gt;)&lt;/span&gt;&lt;span class="Statement"&gt;/eg&lt;/span&gt;;&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{using_tempdir}) {&#xD;
    &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; = (&lt;span class="Identifier"&gt;$ENV&lt;/span&gt;{TMPDIR} || &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;/tmp&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;) . &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;/&lt;/span&gt;&lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;;&#xD;
  }&#xD;
  &lt;span class="Comment"&gt;# warn $temp_name;&lt;/span&gt;&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{dir}) {&#xD;
    &lt;span class="Statement"&gt;last&lt;/span&gt; &lt;span class="Statement"&gt;if&lt;/span&gt; &lt;span class="Statement"&gt;mkdir&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;;&#xD;
  } &lt;span class="Statement"&gt;else&lt;/span&gt; {&#xD;
    &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Statement"&gt;sysopen&lt;/span&gt; &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$fh&lt;/span&gt;, &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;, O_WRONLY | O_CREAT | O_EXCL) {&#xD;
      &lt;span class="Statement"&gt;close&lt;/span&gt; &lt;span class="Identifier"&gt;$fh&lt;/span&gt;;&#xD;
      &lt;span class="Statement"&gt;last&lt;/span&gt;;&#xD;
    }&#xD;
  }&#xD;
  &lt;span class="Identifier"&gt;$try_count&lt;/span&gt;--;&#xD;
}&#xD;
&#xD;
&lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;make temp failed: &lt;/span&gt;&lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt; &lt;span class="Statement"&gt;if&lt;/span&gt; &lt;span class="Identifier"&gt;$try_count&lt;/span&gt; == &lt;span class="Constant"&gt;0&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{unsafe}) {&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{dir}) {&#xD;
    &lt;span class="Statement"&gt;rmdir&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; &lt;span class="Statement"&gt;or&lt;/span&gt; &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Identifier"&gt;$!&lt;/span&gt;;&#xD;
  } &lt;span class="Statement"&gt;else&lt;/span&gt; {&#xD;
    &lt;span class="Statement"&gt;unlink&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; &lt;span class="Statement"&gt;or&lt;/span&gt; &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Identifier"&gt;$!&lt;/span&gt;;&#xD;
  }&#xD;
}&#xD;
&#xD;
&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Identifier"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;rand_char&lt;/span&gt;&lt;span class="Identifier"&gt;()&lt;/span&gt;&lt;span class="Identifier"&gt; &lt;/span&gt;{&#xD;
  &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;@chars&lt;/span&gt; = (&lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;a&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;..&lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;z&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;, &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;A&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;..&lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;Z&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;, &lt;span class="Constant"&gt;0.&lt;/span&gt;.&lt;span class="Constant"&gt;9&lt;/span&gt;);&#xD;
  &lt;span class="Statement"&gt;return&lt;/span&gt; &lt;span class="Identifier"&gt;$chars&lt;/span&gt;[&lt;span class="Statement"&gt;rand&lt;/span&gt;(&lt;span class="Statement"&gt;scalar&lt;/span&gt; &lt;span class="Identifier"&gt;@chars&lt;/span&gt;)];&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">TAP on C++</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/06/1214149170.html" /><category term="C++" /><category term="tap" /><author><name>◆F99a.q8oVE</name></author><updated>2008-06-22T08:39:30-07:00</updated><id>tag:blog.f99aq8ove.net,2008-06-23:/archive/2008/06/1214149170.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
Test Anything Protocol - TAP ですが、なんとなく C++ で実装してみました。&#xD;
&lt;/p&gt;&#xD;
&lt;h3&gt;tap.hpp&lt;/h3&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synPreProc"&gt;#ifndef TAP_HPP_526c07e9e0a11dc15e7838c85f7e46780782392d&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define TAP_HPP_526c07e9e0a11dc15e7838c85f7e46780782392d&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synType"&gt;namespace&lt;/span&gt; tap {&#xD;
    &lt;span class="synType"&gt;size_t&lt;/span&gt; tests__ = &lt;span class="synConstant"&gt;0&lt;/span&gt;;&#xD;
    &lt;span class="synType"&gt;size_t&lt;/span&gt; numof_tested__ = &lt;span class="synConstant"&gt;0&lt;/span&gt;;&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; tests(&lt;span class="synType"&gt;size_t&lt;/span&gt; n) {&#xD;
        tests__ = n;&#xD;
        std::cout &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"1.."&lt;/span&gt; &amp;lt;&amp;lt; n &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; ok_notok__(&lt;span class="synType"&gt;bool&lt;/span&gt; is_ok, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name) {&#xD;
        std::cout &amp;lt;&amp;lt; (is_ok ? &lt;span class="synConstant"&gt;"ok "&lt;/span&gt; : &lt;span class="synConstant"&gt;"not ok "&lt;/span&gt;) &amp;lt;&amp;lt; ++numof_tested__ &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" - "&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&lt;span class="synType"&gt;typename&lt;/span&gt; T, &lt;span class="synType"&gt;typename&lt;/span&gt; U&amp;gt; &lt;span class="synType"&gt;void&lt;/span&gt; is__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; file, &lt;span class="synType"&gt;size_t&lt;/span&gt; line,&#xD;
            T got, U expected, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name = &lt;span class="synConstant"&gt;""&lt;/span&gt;) {&#xD;
        &lt;span class="synStatement"&gt;if&lt;/span&gt; (got != expected) {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;false&lt;/span&gt;, name);&#xD;
            std::cerr&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   Failed test '"&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   at "&lt;/span&gt; &amp;lt;&amp;lt; file &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" line "&lt;/span&gt; &amp;lt;&amp;lt; line &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;".&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#          got: '"&lt;/span&gt; &amp;lt;&amp;lt; got &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#     expected: '"&lt;/span&gt; &amp;lt;&amp;lt; expected &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'"&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&#xD;
        } &lt;span class="synStatement"&gt;else&lt;/span&gt; {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;true&lt;/span&gt;, name);&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&lt;span class="synType"&gt;typename&lt;/span&gt; T, &lt;span class="synType"&gt;typename&lt;/span&gt; U&amp;gt; &lt;span class="synType"&gt;void&lt;/span&gt; isnt__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; file, &lt;span class="synType"&gt;size_t&lt;/span&gt; line,&#xD;
            T got, U expected, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name = &lt;span class="synConstant"&gt;""&lt;/span&gt;) {&#xD;
        &lt;span class="synStatement"&gt;if&lt;/span&gt; (got == expected) {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;false&lt;/span&gt;, name);&#xD;
            std::cerr&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   Failed test '"&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   at "&lt;/span&gt; &amp;lt;&amp;lt; file &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" line "&lt;/span&gt; &amp;lt;&amp;lt; line &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;".&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#     '"&lt;/span&gt; &amp;lt;&amp;lt; got &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#         ne&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#     '"&lt;/span&gt; &amp;lt;&amp;lt; expected &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'"&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&#xD;
        } &lt;span class="synStatement"&gt;else&lt;/span&gt; {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;true&lt;/span&gt;, name);&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; fail__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; file, &lt;span class="synType"&gt;size_t&lt;/span&gt; line, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name) {&#xD;
        ok_notok__(&lt;span class="synConstant"&gt;false&lt;/span&gt;, name);&#xD;
        std::cerr&#xD;
            &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   Failed test '"&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
            &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   at "&lt;/span&gt; &amp;lt;&amp;lt; file &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" line "&lt;/span&gt; &amp;lt;&amp;lt; line &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; diag__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; d) {&#xD;
        std::cerr &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"# "&lt;/span&gt; &amp;lt;&amp;lt; d &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
}&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#define is(g, e, n) tap::is__(&lt;/span&gt;&lt;span class="synConstant"&gt;__FILE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, &lt;/span&gt;&lt;span class="synConstant"&gt;__LINE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, (g), (e), (n))&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define isnt(g, e, n) tap::isnt__(&lt;/span&gt;&lt;span class="synConstant"&gt;__FILE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, &lt;/span&gt;&lt;span class="synConstant"&gt;__LINE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, (g), (e), (n))&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define fail(n) tap::fail__(&lt;/span&gt;&lt;span class="synConstant"&gt;__FILE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, &lt;/span&gt;&lt;span class="synConstant"&gt;__LINE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, (n))&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define diag(d) tap::diag__((d))&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#endif&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
こんな風に使います。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;"tap.hpp"&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synStatement"&gt;using&lt;/span&gt; &lt;span class="synType"&gt;namespace&lt;/span&gt; std;&#xD;
&#xD;
&lt;span class="synType"&gt;int&lt;/span&gt; main(&lt;span class="synType"&gt;void&lt;/span&gt;) {&#xD;
    tap::tests(&lt;span class="synConstant"&gt;6&lt;/span&gt;);&#xD;
    is(&lt;span class="synConstant"&gt;1&lt;/span&gt;, &lt;span class="synConstant"&gt;3&lt;/span&gt;, &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;);&#xD;
    string hoge = &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;;&#xD;
    string geho = &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;;&#xD;
    isnt(hoge, geho, &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;);&#xD;
    isnt(&lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;);&#xD;
    fail(&lt;span class="synConstant"&gt;"asdf"&lt;/span&gt;);&#xD;
    is(&lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;"asf"&lt;/span&gt;);&#xD;
    diag(&lt;span class="synConstant"&gt;"asdf"&lt;/span&gt;);&#xD;
    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;0&lt;/span&gt;;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
実行すると...。&#xD;
&lt;pre&gt;&#xD;
% g++ -Wall -Wextra test.cpp &amp;amp;&amp;amp; ./a.out&#xD;
1..6&#xD;
not ok 1 - hoge&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 10.&#xD;
#          got: '1'&#xD;
#     expected: '3'&#xD;
not ok 2 - hoge&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 13.&#xD;
#     'hoge'&#xD;
#         ne&#xD;
#     'hoge'&#xD;
not ok 3 - hoge&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 14.&#xD;
#     '0'&#xD;
#         ne&#xD;
#     '0'&#xD;
not ok 4 - asdf&#xD;
#   Failed test 'asdf'&#xD;
#   at test.cpp line 15&#xD;
ok 5 - asf&#xD;
# asdf&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
a.t を用意して...。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synComment"&gt;#!/bin/sh&lt;/span&gt;&#xD;
./a.out&#xD;
&lt;/pre&gt;&#xD;
&lt;pre&gt;&#xD;
% prove -v ./a.t&#xD;
./a......&#xD;
1..6&#xD;
not ok 1 - hoge&#xD;
not ok 2 - hoge&#xD;
not ok 3 - hoge&#xD;
not ok 4 - asdf&#xD;
ok 5 - asf&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 10.&#xD;
#          got: '1'&#xD;
#     expected: '3'&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 13.&#xD;
#     'hoge'&#xD;
#         ne&#xD;
#     'hoge'&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 14.&#xD;
#     '0'&#xD;
#         ne&#xD;
#     '0'&#xD;
#   Failed test 'asdf'&#xD;
#   at test.cpp line 15&#xD;
# asdf&#xD;
 Failed 5/6 subtests&#xD;
&#xD;
Test Summary Report&#xD;
-------------------&#xD;
./a.t (Wstat: 0 Tests: 5 Failed: 4)&#xD;
  Failed tests:  1-4&#xD;
  Parse errors: Bad plan.  You planned 6 tests but ran 5.&#xD;
Files=1, Tests=5,  0 wallclock secs ( 0.03 usr +  0.01 sys =  0.04 CPU)&#xD;
Result: FAIL&#xD;
[1]    3716 exit 1     prove -v ./a.t&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
こうなる。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
freeHG にあげときました。BSL1.0 です。&lt;a href="http://freehg.org/u/f99aq/utils/file/3370b4d11c7b/cpp/tap/"&gt;utils: Manifest&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
テストに失敗したときの戻り値を...には、まだ対応していません。&#xD;
&lt;/p&gt;&#xD;
		&lt;/div&gt;</content></entry><entry><title type="html">GNU/Linux で Expert Mouse を使うメモ</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/06/1214138301.html" /><category term="linux" /><author><name>◆F99a.q8oVE</name></author><updated>2008-06-22T05:38:21-07:00</updated><id>tag:blog.f99aq8ove.net,2008-06-22:/archive/2008/06/1214138301.html</id><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
			&lt;p&gt;&#xD;
EM7 用 /etc/X11/xorg.conf 設定メモ&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
&lt;a href="http://www.amazon.co.jp/o/ASIN/B0006J09LU/f99aq-22/ref=nosim"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/41HYXS04FJL._SL160_.jpg" alt="KENSINGTON 64325 EXPERT MOUSE OPTICAL"&gt;&lt;/img&gt;KENSINGTON 64325 EXPERT MOUSE OPTICAL&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synStatement"&gt;Section "InputDevice"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Identifier&lt;/span&gt;     &lt;span class="synConstant"&gt;"em7"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Driver&lt;/span&gt;         &lt;span class="synConstant"&gt;"mouse"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;CorePointer&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Protocol&lt;/span&gt;&lt;span class="synConstant"&gt;" "auto"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Device&lt;/span&gt;&lt;span class="synConstant"&gt;" "/dev/input/mice"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Buttons&lt;/span&gt;&lt;span class="synConstant"&gt;" "9"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Emulate3Buttons&lt;/span&gt;&lt;span class="synConstant"&gt;" "&lt;/span&gt;&lt;span class="synSpecial"&gt;true&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;EmulateWheelButton&lt;/span&gt;&lt;span class="synConstant"&gt;" "8"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;EmulateWheel&lt;/span&gt;&lt;span class="synConstant"&gt;" "&lt;/span&gt;&lt;span class="synSpecial"&gt;true&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;YAxisMapping&lt;/span&gt;&lt;span class="synConstant"&gt;" "4 5"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;XAxisMapping&lt;/span&gt;&lt;span class="synConstant"&gt;" "6 7"&lt;/span&gt;&#xD;
  &lt;span class="synComment"&gt;# Option    "DragLockButtons" "8"&lt;/span&gt;&#xD;
&lt;span class="synStatement"&gt;EndSection&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
これで、右奥のボタンを押しながらボールを転がすことでスクロール可能に。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
加えて Firefox の設定を以下にする(about:config で)と、横スクロールもできるようになる。Firerox 3 だと標準でこの設定になってるっぽい。&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
  &lt;li&gt;mousewheel.horizscroll.withnokey.action = 0&lt;/li&gt;&#xD;
  &lt;li&gt;mousewheel.horizscroll.withnokey.numlines = 1&lt;/li&gt;&#xD;
  &lt;li&gt;mousewheel.horizscroll.withnokey.sysnumlines = true&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
		&lt;/div&gt;</content></entry></feed>
