2007-02-27

How much money do i need to buy Geisha girl?

NOT SAFE FOR WORK!  ゲイシャというと語弊があるが、前回、江戸時代の通貨について考察した。ところで、傾城を買うにはいくらぐらいかかったのだろうか。  調べてみたところ、http://www.din.or.jp/~sigma/yosiwara/simabara.htmlなどという情報が見つかった。これは吉原ではないのだが、まあ、一般人が買う、並の傾城は、数十匁というところらしい。いまでいうと、2~3万円ぐらいなのだろう。この手の店には縁がないのでよく分からないが、まあ、現代でもこんなものではなかろうか。太夫となると、一両を超えるようだ。太夫というのは、大名などをもてなす遊女のことで、筆や和歌などに通じていなければならない。太夫は一見さんお断りのようだ。  これも同じサイトなのだが、隠し売女の入札価格というものもある。そもそも遊女というのは、借金のかたに働いているものである。親に売られたとか、人さらいにあっただとか、理由は様々ある。隠し売女というものは、幕府の許可を得ずに商売をしていた女である。これがつかまって、科料がわりに、吉原に売られるようだ。つまりは借金となる。それにしても、下は15歳から、上は42歳までいる。高いところで七十両(5~6百万円ぐらいか)、低いところは二両(せいぜい20万円ほど)だ。  それにしても、このサイトの、吉原のついての歴史がなかなか面白い。当時、江戸に政治が移ったことで、遊郭も移動した。そういえば、吉川英治の宮本武蔵にも、そういう記述があった。 参考: http://www.din.or.jp/~sigma/main.html

2007-02-26

Currency conversion from Edo era

 一両っていくら? 一文っていくら? 江戸時代の通貨の価値はどうなっていたのかということが、ふと気になった。そこで、軽く調べてみたが、どうやら物事は、それほど単純ではないようだ。

 まず、貨幣であるが、金貨、銀貨、銭貨(材質は銅)という、三種類の金属製の貨幣があったようだ。参ったことに、この貨幣は、それぞれ別物らしい。というのも、時代によって為替相場が、かなり変動するのだ。つまり、円とドルとユーロが、各々並行して使われていたとでも言うべきだろうか。あるいは、米ドルとカナダドルと香港ドルぐらいだろうか。

 まず価値については、金貨>銀貨>銭貨 である。

 銭貨について述べる。これは、一文、二文と数える。千文集めて、一貫文と言う。

 銀貨はちょっと分かりづらい。まず、丁銀という銀貨がある。この価値は変動するのだが、だいたい五十乃至は六十匁である。その下に、五匁銀というものがある。これは、文字通り五匁である。さらにその下に、一分銀という貨幣がある。一分銀が4枚で、五匁銀である。また、二朱銀と一朱銀があり、十六朱で五匁銀になる。まとめると、次のようになる

 1 丁銀 = 12 五匁銀 = 4 一分銀 = 8 二朱銀 = 16 一朱銀

 さて、金貨はどうなのか。まずおなじみの小判、一両、二両と数える。その下に、二分金、一分金、二朱金、一朱金がある。銀貨の場合と同じく、一両 = 四分 = 十六朱 である。

 さて、変動為替相場がやっかいだ。小判一枚が何文に相当するのか。ちょっと調べた限りでは、4000~6000文といったところだった。かなり曖昧だ。金貨と銀貨は、一両が50~60匁に相当するようだ。これもかなり開きがある。

 さて、交換比率はいいとして、実際に、一両は何円なのかが知りたいところだ。時代劇でよくある、悪代官の袖の下に、切り餅(25両)を通すところなど、実際いくらぐらいなのかが知りたい。とはいえ、そもそも時代が違うのである。物価も大きく違っているのだ。通貨の価値を比較するには、たとえば実際の物資で比較するのが分かりやすいが、何で比較するかによって、だいぶ違う。たとえば、砂糖や菜種油は、かなり高い。特に、砂糖の高さは、現代から考えると異常である。つまり、現代と昔では、砂糖に対する価値が違うので、砂糖を基準にしてしまうと、一両の価値は、数千円になってしまう。米を基準とした場合と一桁違う。物資ではなく、サービスでも同様である。たとえば髪結いだが、現在床屋が2~3千円、美容院は6千円以上はする。ところが、江戸時代では、せいぜい数十文である。髪結いを基準にすると、一両は百万近くにまで跳ね上がってしまう。どうやら、昔と今を単純に比較することはできないようだ。

 まあ、私の結論としては、一両は5~10万ぐらい、一文は10円強というあたりの認識にしておいた。すると、切り餅は150万円ぐらいというところだろうか。

参考:
http://www1.u-netsurf.ne.jp/~sirakawa/J029.htm
http://hirose-gawa.web.infoseek.co.jp/mame/kahei.html
http://plaza.across.or.jp/~akira-f/jd-koban/koban.html

C++0x(x == 9) or a in hex?

http://herbsutter.spaces.live.com/Blog/cns!2D4327CC297151BB!159.entry  お髭のSutter氏によると、なんとか2009年に間に合いそうだとか。  それにしても、コンセプトガベージコレクションなどが、面白そうだ。typedef templateとautoとdecltypeが早く欲しい。  ところで、結局、lambda-expressionは、言語として入るのだろうか。

2007-02-24

I can read! I CAN READ IT!

 http://d.hatena.ne.jp/mb2sync/20050324  読める、読めるぞ!  しかし、これは複雑だ。確かに仮想関数はコストが高いとはいえ、ここまでやるとは。  とりあえず、このソースコードが何をしているか記述してみる。  まず、boost::functionのテンプレート引数に関数の型を渡す。いわば、関数のシグネチャだ。この型によって、然るべきfunctionの特殊化が選ばれる。さて、関数の呼び出し方は分かった。しかし、これだけではまだ足りない。代入される関数オブジェクトの型は、ひとつではないのだ。そもそも、関数オブジェクトには、二種類ある。クラスのオブジェクトとしての関数オブジェクトと、単なる関数ポインタだ。この二つの場合分けをしなければならない。そのため、コンストラクタはテンプレート関数になる。そして、get_function_tagに、代入された型を渡す。このメタ関数は、関数ポインタかどうかを判断してくれる。コンパイル時の条件分岐には、いくつか方法があるが、このコードでは、Overload Resolutionを利用して条件分岐している。  関数オブジェクトの場合、function_obj_managerのstaticメンバ関数を利用して、関数呼び出し時(invoker)と、破棄時(destroyer)の処理を決定する。そして、関数オブジェクトをコピーし、ポインタをvoid *型にキャストしておく。  関数ポインタの場合は、同じようにするが、ポインタは、void(*)()型にキャストする。これは規格上、関数ポインタとvoid *間のキャストができないためだ。ポータブルな実装というべきか。  さて、いよいよ関数を呼び出す。operator()();は、先のポインタと、引数をそのままinvokerへと渡し、戻り値があれば、返すだけだ。invokerは、関数オブジェクトか関数ポインタかによって、元ポインタを、適切な型にキャストして、呼び出す。  破棄されるときには、destroyerが呼び出される。関数オブジェクトならば、deleteし、関数ポインタならば、なにもしない。  しかしまあ、よくもこれを実装しようと思ったものだ。次の強敵は、bindだ。ところでラスボスはなんだろう。Expression Templateを使った変態的なSpiritか、Xpressiveか、あるいは……。

Boost.Function is the magic to me

 anyを理解できたので、functionも読もうとしてみた。そして挫折した。これは難しい。Preprocessor Metaprogrammingという、ふざけた概念には、付き合えそうにない。プリプロセスされた結果を読み解こうとするが、boost/function.hppだけで出力された結果は1.46MBにもなり、とても読みきれない。仕方がない、プリプロセッサメタプログラミングを学ばねばならない。  基本的なことだけを理解して、とりあえず読みにかかったが、実際、膨大すぎる。  とりあえず分かったこと。  boost::functionはBOOST_FUNCTION_FUNCTIONを継承、BOOST_FUNCTION_FUNCTIONはfunction_baseを継承している。BOOST_FUNCTION_FUNCTIONは、BOOST_JOINによって、function10などという風になる。BOOST_JOINは、boost/config/suffix.hppで定義されている。  BOOST_FUNCTION_FUNCTIONは、function_baseを継承している。  で、実際どこでnewをしているのか、どこにoperator()();があるのかすら分からない。

2007-02-23

Unicode has SHOGI PIECE

Unicode Character 'WHITE SHOGI PIECE' (U+2616) Unicode Character 'BLACK SHOGI PIECE' (U+2617)  こんなものまであるとは。☖と☗は将棋グリフだ。とはいっても、Vistaを使うか、あるいはフォントのアップデートをしないと見えないだろう。

2007-02-21

smartphone

 iPhoneの動画を見てみたのだが、これはすごい。こんな携帯ならほしいものだ。はっきり言って、日本ではなぜ、スマートフォンが流行らないのだろう。私の携帯には、どうでもいい機能ばかりがついている。たとえばアナログテレビやFMラジオの受信機能だ。そんなもの、誰が使うというのか。くだらない。動きはもっさりとしていて、非常に使いづらい。文字入力も、細かいところで気が利かない。  それから、こんなものもみつけた。nVidiaの携帯用GPUらしいが。

2007-02-20

Inside Boost.Any

 Boost.Anyを使えば、次のようなコードが書ける。
int main()
{
    std::vector<boost::any> v ;

    for (int i = 0 ; i != 20 ; ++i) {
        switch(rand()%5)
        {
        case 0 : // int型の値
            v.push_back(int(123456)) ;
            break ;
        case 1 : //円周率でも入れてみよう
            v.push_back(float(3.14f)) ;
            break ;
        case 2 : //精度が高くても大丈夫だろう
            v.push_back(double(3.141592)) ;
            break ;
        case 3 : //std::stringはどうかな
            v.push_back(std::string("hello,world")) ;
            break ;
        case 4 : //vectorなんていれてみたりして
            v.push_back(std::vector<int>(10, 0)) ;
        }
    }


    for (std::vector<boost::any>::iterator iter = v.begin(), end = v.end() ; iter != end ; ++iter)
    {
        std::type_info const & t = iter->type() ;
        if (t == typeid(int))
        { std::cout << "int : " << boost::any_cast<int>(*iter) << std::endl ; }
        else if (t == typeid(float) )
        { std::cout << "float : " << boost::any_cast<float>(*iter) << std::endl ; }
        else if (t == typeid(double))
        { std::cout << "double : " << boost::any_cast<double>(*iter) << std::endl ; }
        else if (t == typeid(std::string))
        { std::cout << "string : " << boost::any_cast<std::string>(*iter) << std::endl ; }
        else if (t == typeid(std::vector<int>))
        { std::cout << "std::vector size : " << boost::any_cast< std::vector<int> >(*iter).size() << std::endl ; }
    }
}

これが、あの型に厳しいC++のコードだろうか。見ての通り、anyには、ほぼどんな型でも入れることができる。(CopyConstructibleで、例外を投げないAssignableで、例外を投げないデストラクタでさえあれば)

なにしろ、かの変態的なBoostのライブラリである。さぞかし不可思議なコードになっていることであろうと考えてしまうかもしれないが、実は違う。ものすごく、コロンブスの卵的な、単純なコードで実現されている。どうもanyの実装に関する日本語のWebサイトが引っかからないので、この際、ここで解説を試みる。おそらくは、私のようにanyの実装が気になっていて、自分では実装方法がわからない人は、日本にひとりぐらいはいると思われる。うむ、居るのではないかな。居るかもしれない。

とはいっても、仕組みを知ってしまうと、解説する気さえ失せてしまうのだが。

型を無視したい場合、一体どうするか。たとえば、オブジェクトへのポインタを、void *型にキャストしてしまう方法がある。環境によっては、うまくいくだろうが、これではあまりにも貧弱すぎる。第一、anyのように、どんな型でも入れられるような機能を実装しようとすると、今何を入れているのか、把握しておかなければならない。ではどうするか。

ところで、C++には仮想関数という便利な仕組みが存在する。Baseクラスで純粋仮想関数を定義しておき、それを継承したクラスを作る。そして、Baseクラスのポインタとして呼び出すと、なんと、自分の型の関数が呼ばれるという、なんとも便利な機能だ。

class Dwarf
{
public :
    virtual void show_yourself(void) = 0 ;
} ;

class Dwalin : public Dwarf
{
public :
    virtual void show_yourself(void)
    { std::cout << "Dwalin at your service!" << std::endl ; }
} ;
class Balin : public Dwarf
{
public :
    virtual void show_yourself(void)
    { std::cout << "Balin at your service!" << std::endl ; }
} ;
class Kili : public Dwarf
{
public :
    virtual void show_yourself(void)
    { std::cout << "Kili at your service!" << std::endl ; }
} ;

このように、ドワーフクラスを継承した、各ドワーフ達に、挨拶をさせることができる。

しかし悲しいかな、現実は、往々にしてうまくいかないものだ。既存のドワーフクラスがあり、それらを再利用したいとする。それぞれ、てんでばらばらである。共通のベースクラスを継承しているなどということはない。ただし、show_yourselfメンバ関数で、挨拶をすることだけは、共通している。

// 汚い既存の現実のコード
// それぞれ、異なる思想で設計されている。
// ただし、show_yourself関数だけは共通
class Dwalin 
{
public :
    void show_yourself(void)
    { std::cout << "Dwalin at your service!" << std::endl ; }
} ;
class Balin
{
public :
    int a, b, c, d, e, f, g ;
    void show_yourself(void)
    { std::cout << "Balin at your service!" << std::endl ; }
} ;
class Kili : class CommonObject
{
public :
    virtual void CommonWhat() ;
    virtual void CommonFunc() ;
    virtual void show_yourself(void)
    { std::cout << "Kili at your service!" << std::endl ; }
} ;

中つ国の住人ならば既にお気づきかと思われるが、これはホビットの冒険に出てくるドワーフ達である。つまり、こんなクラスが13個もあるのだ(ドワーフは13人いる) このクラスのオブジェクトを管理し。show_yourself関数を呼び出したいとする。実行時にオブジェクトを管理しなければならないので、コンパイル時に型が決まってしまうテンプレートでは役不足である。実行時にドワーフを入れ替えたいのだ。さて、どうしよう。

こういうとき、どんなドワーフでも代入できる、any_dwarfなるクラスがあれば便利だ。早速作ってみよう。

実装のミソは、仮想関数である。

class placeholder
{
public :
    virtual void show_yourself(void) = 0 ;
} ;

template < typename DwarfType >
class holder
{
public :
    holder(DwarfType const & dwarf)
        : held(dwarf) { }

    virtual void show_yourself(void)
    {
        held.show_yourself() ;
    }
private :
    DwarfType held ;
} ;
 基本はこれ。
class Dwalin 
{
public :
    void show_yourself(void)
    { std::cout << "Dwalin at your service!" << std::endl ; }
} ;
class Balin
{
public :
    void show_yourself(void)
    { std::cout << "Balin at your service!" << std::endl ; }
} ;
class Kili
{
public :
    virtual void show_yourself(void)
    { std::cout << "Kili at your service!" << std::endl ; }
} ;

class any_dwarf
{
private :
    class placeholder
    {
    public : // structers
        virtual ~placeholder(){}
    public : // queries
        virtual placeholder * clone(void) = 0 ;
    public : // member function
        virtual void show_yourself(void) = 0 ;
    } ;

    template < typename DwarfType >
    class holder : public placeholder
    {
    public :
        explicit holder(DwarfType const & dwarf)
            : held(dwarf)
        { }
        virtual placeholder * clone(void)
        {
            return new holder(held) ;
        }
        virtual void show_yourself(void)
        {
            held.show_yourself() ;
        }
    private :
        DwarfType held ;
    } ;

public :
    template < typename DwarfType >
    any_dwarf(DwarfType const & dwarf)
        : content(new holder<DwarfType>(dwarf) )
    { }

    any_dwarf(any_dwarf const & other)
        : content(other.content.get() ? other.content->clone() : 0)
    { }

    any_dwarf & operator = (any_dwarf const & rhs)
    {
        if (this != &rhs)
        { content.reset(rhs.content->clone()) ; }
        return *this ;
    }

    template < typename DwarfType >
    any_dwarf & operator = (DwarfType const & rhs)
    {
        content.reset(new holder<DwarfType>(rhs)) ;
        return *this ;
    }

    void show_yourself(void)
    {
        content->show_yourself() ;
    }



private :
    std::auto_ptr<placeholder> content ;
} ;



int main()
{
    std::vector<any_dwarf> v ;

    for (int i = 0 ; i != 20 ; ++i)
    {
        switch(rand()%3)
        {
        case 0 :
            v.push_back(Dwalin()) ;
            break ;
        case 1 :
            v.push_back(Balin()) ;
            break ;
        case 2 :
            v.push_back(Kili()) ;
            break ;
        }
    }

    for (std::vector<any_dwarf>::iterator iter = v.begin(), end = v.end() ;
        iter != end ; ++iter )
    {
        iter->show_yourself() ;
    }
}

まず、placeholderという抽象クラスがある。これを継承するテンプレートなクラス、holderが、それぞれの型のオブジェクトを持つ。any_dwarf自体は、holderへのポインタを持てばよい。こうすることによって、実行時に型を変えることができる。そして、仮想関数のディスパッチによって、正しいshow_yourself関数が呼ばれることになる。

Boostのanyも、これと同じ実装である。

実際にコードを示したほうが分かりやすいと思ったが、まさかこんな例を使うことになるとは思わなかった。しかし、Type Erasureは、よくよく考えると当たり前の挙動だ。何故今まで思いつかなかったのだろう。実装も実にたやすい。コードも短い。

肝心のany_iteratorだが、なんだか結構複雑だ。何故あんなに複雑なのだろう。確かにイテレータには、種類があるとしても、何故だろう。今なら、any_iteratorのコードも読めそうな気がする。

それにしても、まさか自分で、anyを実装できるようになるとは思わなかった。C++ Template Metaprogrammingという本はすばらしい。

 参考:C++ Template Metaprogramming

2007-02-19

Otogi-zoushi by Dazai Osamu

青空文庫:お伽草紙 お伽草紙とは、太宰治が書いた、昔話のパロディである。BOOK OFFで、100円ぐらいで投げ売られていることであろうが、即席に読みたいという本の虫諸君のために、青空文庫が便宜を図ってくれている。まったく、青空文庫があれば、一生読み物に困らない気さえしてくるから、面白い時代になったものだ。  元になっている物語は、四つある。瘤取り爺さん、浦島太郎、カチカチ山、舌切雀である。それぞれ、太宰治らしき脚色が加えられていて、実に愉快である。世に蔓延せる、下手な三文ラノベより、よほど笑いを誘う事、何のかたきことあらんや。  ここに、その概略を記すの愚を、敢えてして、云わば、まずい筆の我との比較によって、太宰治のすばらしさを伝えたいと思う。  まず始めに、瘤取り爺さんの話である。一般的な話の次第は下の通り。  昔々、あるところに、善良なる瘤爺さんと、邪悪なるこぶ爺さんが居た。善良なる瘤爺さんが、鬼の酒盛りで踊りを披露して、たいそう喜ばれ、邪魔な瘤をもいでもらった。邪悪なる爺さん、これを聞くや、自らも鬼の元へ出かけ踊りを披露するが、たいそうまずい踊りで、先の善良なる爺さんの瘤もつけられて、二つの瘤を持つことになったそうな。  この物語が、太宰治の手にかかると、だいぶ変わって来る。善良なる爺さんは、単なる酔っ払いの痴れ者に変わってしまい、邪悪なる爺さんは、学と財があれど、絶えず瘤を気にしている神経質な爺さんになってしまう。鬼どもも、たんに粗野なる山の野人に代わってしまう。酔っ払い爺さんは、その粗野な酒盛りで、なんとも原始的な芸にあきれ果て、自分がましな芸を見せてやろうと踊りだす。このため、鬼どもは、再びこの爺さんに来てもらいたくなり、大切なものと勘違いした、瘤を取り上げて、亦来るように言う。神経質な爺さんはこの話を聞き、我もと鬼の元に出かけるが、疲労する芸は、酒盛りには向かない冷めたもので、鬼どもから逃げられ、瘤を返すから、勘弁してくれとまで言われて、もうひとつの瘤を付けられてしまう。  つまり、この話に、悪人は一人も登場していない。  次は浦島太郎の話である。  浦島太郎は、丹後の水江(京都府北部)に住む豪族の長男で、人々が他人を批判しあうのを疎ましく感じていた。彼が助けた亀に連れられて、竜宮へ行って帰ってくるのだが、まず冒頭から、亀に関する考察が始まる。そもそもどんな亀なのか。海のそこ深く潜るには、水かきがついていなければならぬが、そもそもそういう亀は、小笠原や沖縄に住んでいるのである。日本海にいるわけがない、と言った調子である。  カチカチ山、これは酷い話だ。一般的には、この話は狸が悪役である。婆汁を作って爺さんに食わせたりしているからだ。しかし、これだけをもって、狸を悪と決め付けるのは早計である。なにしろこの狸、爺さんに、狸汁にされるため、捕まえられたのである。死に物狂いで逃げ出したというのが正しい話であろう。爺さんの戦意を喪失させるために、婆汁を作ったというのも、頷ける話である。兎が仇討ちをするのも、まあいいだろう。しかし、やり方が汚い。背中に大やけどを負わせられ、唐辛子を塗りこまれた挙句、泥舟で溺死させられるのである。何故、名乗りを上げて、一太刀の下に切り捨てなかったのか。こんな話は、日本には他に存在しない。まったくもって武士道に、即ち男の道に反する。そうだ、この兎は女だったのだ。兎は歳十六ほどの少女、狸は、その少女に惚れ込んだ中年男である。公でなければ説明がつかぬ。兎は狸の弱みを利用して、ネチネチといたぶるのである。なんと酷い話だらう。  舌切雀の話に行く前に、何故桃太郎を書かなかったのかという理由を書いている。桃太郎は日本一の主人公にして、貧弱な空想力の自分では、到底書き得ない、というのが、その理由だ。  肝心の舌切雀は、どうも太宰治らしさが、十分に発揮せられていないように感じる。これはどうしたことだろう。  

2007-02-18

about any_iteretor

 any_iteratorというものがある。これは文字通り、どんなイテレータでも代入できる、イテレータである。たとえば、下のように。
int main() { // intにデリファレンスできるイテレータ typedef IteratorTypeErasure::any_iterator< int , boost::bidirectional_traversal_tag , int & , ptrdiff_t > any_bid_iter ; any_bid_iter iter, end ; std::vector<int> v ; std::list<int> l ; std::set<int> s ; for ( int i = 0 ; i != 10 ; ++i ) { v.push_back(i) ; l.push_back(i) ; s.insert(i) ; } // vectorのイテレータを入れる iter = v.begin() ; end = v.end() ; for ( ; iter != end ; ++iter ) { std::cout << *iter << std::endl ; } // 同じオブジェクトに、listのイテレータも代入可能 iter = l.begin() ; end = l.end() ; for ( ; iter != end ; ++iter ) { std::cout << *iter << std::endl ; } // setも入れてみよう。 iter = s.begin() ; end = s.end() ; for ( ; iter != end ; ++iter ) { std::cout << *iter << std::endl ; } }
 ご覧の通りである。any_iteratorを用いれば、実行時に型を変更できる。つまり、「吾輩は君に、forward iterator以上で、intにデリファレンス可能なイテレータを作ってもらいたい。型については、吾輩が知ったことではない。君の好きにし給え。ただ吾輩の要求通りのイテレータとして振舞えば、それで事は足りる。実行時に、吾輩の担当している部分に、別の型を渡すこともできる。」ということもできる。  そして、私はドキュメントを最後まで読まずに遊び始め、次のようなコードで引っかかった。
// ところで、typedef templateってC++0xに入るの? // こういうところで非常にほしい。 template < typename T > void print(IteratorTypeErasure::any_iterator< T , boost::bidirectional_traversal_tag , T const & , ptrdiff_t > iter , IteratorTypeErasure::any_iterator< T , boost::bidirectional_traversal_tag , T const & , ptrdiff_t > last) { for ( ; iter != last ; ++iter) { std::cout << *iter << std::endl ; } } int main() { typedef IteratorTypeErasure::any_iterator< int , boost::bidirectional_traversal_tag , int & , ptrdiff_t > any_bid_iter ; typedef IteratorTypeErasure::any_iterator< int , boost::bidirectional_traversal_tag , int const & , ptrdiff_t > any_const_bid_iter ; any_bid_iter iter, end ; std::vector<int> v(0) ; for ( int i = 0 ; i != 10 ; ++i) { v.push_back(i) ; } // VC8でコンパイルできない。なぜ。 //print<int>(v.begin(), v.end()) ; // こっちはOK iter = v.begin() ; end = v.end() ; print<int>(iter, end) ; }
 これはなぜかというと、any_iteratorのコンストラクタがexplicitなためだ。ドキュメントにもちゃんと書いてあるが、ドキュメントを最後まで読まないのがこの私だ。  なぜ、explicitなのか。こういう風に使いたい人は、私以外にもいるはずだ。こうすれば、関数に実行時にいろんな型を渡せるはず。何故これがダメなのかというと、メタプログラミングの限界らしい。私はメタプログラミングを呼吸しているわけではないので、完全に理解していないのだが、どうも、SFINAEの規格では、イテレータではない型が渡されたときに、恐ろしく奇妙なコンパイルエラーになってしまうんだそうだ。たとえば、
boost::is_convertible< int, some_any_iterator_type >
というメタファンクションを書いた場合、答えを得られずに、単なるコンパイルエラーになってしまうらしい。これはまずいというわけだ。あとは、プロクシクラスを使った場合の問題など。  むちゃくちゃなコンパイルエラーを出すより、無効にしたほうがいい?  おまけの超邪悪なコード
int main() { // うひひひひ typedef IteratorTypeErasure::any_iterator< boost::any , boost::bidirectional_traversal_tag , boost::any & , ptrdiff_t > Iter ; Iter iter, end ; std::vector<boost::any> v ; // ふはは for (int i = 0 ; i != 20 ; ++i) { switch(rand()%3) { case 0 : v.push_back(i) ; break ; case 1 : v.push_back(float(i)) ; break ; case 2 : v.push_back(boost::lexical_cast<std::string>(i)) ; break ; } } iter = v.begin() ; end = v.end() ; // へっへっへ for ( ; iter != end ; ++iter) { if (iter->type() == typeid(int)) { std::cout << "int : " << boost::any_cast<int>(*iter) << std::endl ; } else if (iter->type() == typeid(float) ) { std::cout << "float : " << boost::any_cast<float>(*iter) << std::endl ; } else if (iter->type() == typeid(std::string)) { std::cout << "string : " << boost::any_cast<std::string>(*iter) << std::endl ; } } }
参考:http://d.hatena.ne.jp/mb2sync/20070217#p1

2007-02-16

May the fate favored you

 Fateというゲームがある。DiabloライクなRPGだ。ストーリーはない。ただ、延々と続くダンジョンにもぐるだけ。レベルアップと、アイテム収集のみだ。ひとつの街とひとつのダンジョンのみで構成される。なかなか面白い。  遊び方だが、まず、キャラを作成する。髪型と顔を選択し、名前を入力する。つぎに、ペットとして、犬か猫を選択する。どちらも違いはない。グラフィックが変わるだけである。  基本的に、クエストを引き受け、ダンジョンにもぐり、クエストを果たして、タウンポータルで戻るというルーチンワークになる。タウンポータルで戻ると、街から戻った場所に移動できるので、より深いところを目指していける。  もうちょっと色々な要素があると、さらに面白くなったと思うのだが、惜しい。

Die sutpid smoker who does not belong in modern society!!

JTが「禁煙反対」の組織票、ネットアンケに社員動員  日本人を薬物中毒にするのが目標のJT(Japan Toluene:日本トルエンの略、純粋なトルエンを吸ってハイになろう!)が、自社社員の工作活動の一環として、組織票を企て、実行に移した。その成果は、それまで賛成多数であったタバコ規制を、反対多数に押し込むすばらしいものであった。ここにその成果を記録する。  事の次第は、去る2006年12月26日から27日にかけて、神奈川県が、公共の場所を喫煙にする条例に対する是非を問うアンケートを、ウェブ上で行った。ここに、我等の誇るJTの工作員等が突撃し、見事反対多数のまま、無事にアンケートを終わらせた。あっぱれあっぱれ。  ところで、読売新聞はどういうセンスをしているのだろう。ネットアンケと略すのはどうかと思う。

2007-02-15

Japanese news paper ie funny joke paper

読売新聞:ネット競売に個人で大量出品、96%が表示義務違反
 インターネットで商品を競売するネットオークションに個人として大量に出品している人の96%が、特定商取引法に違反していたことが経済産業省の調査で分かった。  同法は、販売業者に住所や電話番号の表示を義務づけているが、個人は対象外で、IDだけを表示する“匿名出品”も可能。しかし、大量出品者は販売業者とみなされ、氏名や電話番号の表示義務が課される。  この定めに基づき、経産省は「ヤフー・オークション」「楽天オークション」「ビッダーズ」の大手3サイトを対象に、昨年7月から、個人として参加している出品者の中に販売業者とみなされるケースがないかを継続調査してきた。  その結果、出品者4121人のうち、11%にあたる452人が販売業者の条件を満たす大量出品者とみなされ、そのうち96%にあたる433人に表示義務違反が認められたという。大半は経産省からの注意メールを受けて是正したが、是正しない場合などには、毎月、同省がホームページ上でIDを公表している。  2月上旬には25の出品者がIDを公表されたが、すべてヤフー・オークションへの出品者だった。ヤフーでは「出品者が法令を順守することが望ましいのは言うまでもないが、我々が業者か個人かを見極めるのは難しい」と話している。 (2007年2月14日14時37分 読売新聞)
 すばらしく誤解させるタイトルだ。本当に、日本の新聞というのは、ジョークにしか思えない。このタイトルでは、出品者のほぼ全員が違反していると解釈される恐れがある。いや、少なくともエスパー能力のない自分は、そう解釈した。96%とは、特定商取引法で業者とみなされる出品者のうちの96%である。まあ、彼等は皆、法解釈上「個人」で出品していると思い込んでいるのだから、公開していなくても不思議はない。  しかし、どのくらい出品すると、業者とみなされるのだろう。  まあ、笑いたいときは、日本の新聞を読むに限る。ジョークの宝庫だ。

2007-02-14

イオシスのCD購入

 例の電波ソングのCDを購入した。
2トラック目「魔理沙は大変なものを盗んでいきました」の3分26秒頃から8秒間ほどの部分のリピートは、不具合ではなく作者の意図によるものです。混乱を招いてしまい申し訳ありません。
 いや、どう見ても不愉快な雑音にしか聞こえないし、私はこれを理解できるセンスは持ち合わせていない。とりあえず最後の部分はフェードアウトでもかけて、mp3にエンコードすることにしよう。  ちなみに、東方月燈篭の16トラック目が、なかなかいい電波を発している。

2007-02-13

Vistaのカーネルについて

Inside the Windows Vista Kernel: Part 1  Vistaのカーネルで何が変わったか。  まず、スケジューラだが、割り込みが起こることで、スレッドに対するCPUサイクルの割り当てが不公平になる問題を、解決している。また、動画や音楽など、クリティカルなアプリケーションのために、優先度を変更するテンプレートのようなものを用意しているらしい。この設定項目に、GPUに対する優先度もあるが、Vistaでは、実装されていないようだ。GPUに対するマルチタスクは、まだ成熟していないので、実装しようにもできないのだろう。  VistaのNTFSでは、ファイルベースのシンボリックリンクがはれるようになった。  I/Oについては、なかなか面白い。I/O完了ポートの最適化や、I/Oに対する優先度などがあるが、最も分かりやすいのは、同期I/Oをキャンセルできるようになったことだ。XPで、エクスプローラから、ネットワーク上の存在しないホストのファイルにアクセスしようとすると、ウインドウの応答がなくなる。これは、同期I/Oがキャンセルできないためだ。エクスプローラは、タイムアウトまで待つしかない。それがキャンセルできるようになり、エクスプローラは、ユーザの終了動作に対して、I/O操作を途中でやめることができる。  まあ、同期IOのキャンセルが、一番、直感的に分かりやすくて、便利そうだ。

2007-02-12

XHTMLとCSSは本当に難しい

ソースコードを表示するのに、preタグを使っていたが、別のものを使うようにしてみた。codeタグはどうだろう。早速試してみたが、どうもこれはひどい。ボーダーを付けたり、背景色を変えたりしたいのだが、どうやらcodeタグの扱いは、そういうことを想定してはいないようだ。しかたがない。やっぱり独自のクラスを定義しよう。というわけで、次のようになった。
#include< typename T > int main() { std::cout << "hello,world" << std::endl ; }
 IE7はCSS2をサポートしていると聞いたのだが、white-spaceのpre-wrapがきかないのはどういうわけだろう。  ついでにみつけた面白いもの

正規表現は楽しい

正規表現は面白い。rubyを用いると、次のような感じだ。

text = 'C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.' ;

re1 = /C\+{1}/ ;
re2 = /y.*f/ ;
re = /#{re1}.*#{re2}/ ;
re.match(text) ;

p(text) ;
p(re) ;
p($&) ;

なるほど、正規表現は確かに面白い。しかしこれは、他人の書いた正規表現は読めそうにない。たとえば、次のようなもの

IPv4にマッチする正規表現はどう書くか?
RFC2822に準拠する、メアドにマッチする正規表現
HTTP URLにマッチする正規表現

こんなもの、誰も読めるわけがない。

2007-02-11

言語理論

ドラゴンブックなどを読みながら、勉強している。なかなか面白い。まず、正規表現がこんなに面白いものだとは思わなかった。しばらく、正規表現で遊ぶことにする。

2007-02-10

今年の目標

1. 俺様言語を作る。
 C言語のインタプリタというのは無謀かな。

2. DirectX9で何かゲームを作る。
 本音を言うと、DX9など使いたくはない。最低でも9.0L……、理想はDX10を使いたい。デバイスがロストするなどもってのほかだ。
3. 体調を崩さぬようにする。
 これがある意味、一番重要。去年は酷かった。

来年の目標
1. 一発成功して、数十億ぐらい稼ぎ、田舎に隠居する。
 それもひとつの幸せな人生だと思う。
2. ひとつの力の指輪所有者になる。
 ひとつの指輪はすべてを統べ、一つの指輪はすべてを見つけ、暗闇の中につなぎとめる。影横たわるモルドールの国に。
3. 鬼を笑わせる。
 来年のことを言うと何とやら。

2007-02-07

恐ろしいピアノの弾き方

http://www.youtube.com/watch?v=DAb2nI2hVqk

なんだこれは。

性差によるシャワー使用の違いについて

http://www.youtube.com/watch?v=Qehxjub5lyo

Lesson One
レッスン1
How to shower Like a Woman
女のシャワーの浴び方
take off clothing.
服を脱ぐ。
Place it in sectioned laundry hamper according to lights and darks
洗濯カゴに、色物に分けて入れる。
Walk to bathroom wearing long dressing gown.
ガウンを着て、風呂場まで歩く。
If you see husband along the way. cover up any exposed areas.
もし、夫に出会う場合、秘所は慎み深く隠す。
Look at your womanly physique in the mirror.
鏡で自分の体を確認する。
Make mental note to do more sit-ups, leg-lifts, etc.
もうすこし腹筋や<a href="http://www.dcdoctor.com/pages/rightpages_wellnesscenter/homeexercises/back/exercises/exer_abd_leglifts.html">レッグリフト</a>等をするように心に誓う。
Adjust breasts.
胸を確認する。
Turn on shower.
シャワーを出す。
Wash your face with crushed apricot facial scrub for 10 minutes until red.
アプリコットオイルで、顔面が赤くなるまで、10分間ほどよく擦る。
Use face cloth, arm cloth, leg cloth, long loofah, wide loofah and pumice stone.
顔用手拭、腕用手拭、脚用手拭、長いヘチマ、広いヘチマ、軽石を使い分ける。
Wash your hair once with cucumber and sage shampoo with 43 added vitamins.
キュウリとセージの43種類のビタミン配合シャンプーで、髪を一度洗う。
Wash your hair again to make sure it's clean.
もう一度髪を洗い、確実に汚れを落とす。
Condition your hair with grapefruit mint conditioner enhanced with real passionfruit.
グレープフルーツにパッションフルーツを加えたコンディショナーで髪に香りを付ける。
Rinse conditioner off hair.
コンディショナーをすすぎ落とす。
Shave armpits and legs.
脇と脚の無駄毛を剃る。
Get out of shower and stand directly on bathmat.
風呂場から上がり、バスマットの上に立つ。
Dry with towel the size of a small country.
偉大なるタオルで体を拭く。
Spray mold spots with Tilex.
ティレックス社のカビ落としスプレーをかける。
Squeegee off all wet surfaces in shower.
シャワーの曇りをすべてふき取る。
Return to bedroom wearing long dressing gown and towel on head.
ガウンを着、タオルを頭に載せて、風呂場を後にする。

How to shower Like a Man
男のシャワーの浴び方
Take off clothes while sitting on the edge of the bed and leave them in a pile.
ベッドに座って服を脱ぎ、そのまま脱ぎ散らかしておく。
Walk to the bathroom naked.
裸のまま風呂場まで行く。
If you see wife along the way, shake wiener at her making the 'woo-woo' sound.
もし、妻に出会う場合、ウインナーをぶらぶらと揺らして、キャーキャー言わせる。
Admire the size of your wiener and scratch your ass.
自分のウインナーの大きさを褒め称え、ケツを掻く。
Look at your manly physique in the mirror.
自分の体を鏡で確認する。
turn on shower. Wash face.
シャワーを出し、顔を洗う。
Spend majority of time washing privates.
秘所を洗うことに、シャワー時間の大半を費やす。
Blow your nose in your hands and let the water rinse them off.
手バナをかみ、シャワーで洗い流す。
Fart and laugh at how loud it sounds.
屁をこき、その音の大きさに笑う。
Wash your hair.
髪を洗う。
Make a Shampoo mohawk.
髪型をモヒカンにして遊ぶ。
Wash your butt, leaving those coarse butt hairs stuck on the soap.
ケツを洗う。野太いケツ毛は、石鹸に張り付くがままにしておく。
Pee.
小便
Rinse off and get out of shower. Avoid bathmat.
体をすすぎ、風呂場から出る。バスマットは避ける。
Dry off forearms and butt only.
腕とケツだけは拭く。
Draw a penis on the mirror.
鏡にチンポを描く。
Then draw boobs so you feel manly.
おっぱいを描く。男らしさを感じる。
Shake weiner and watch water fly off.
ウインナーをぶらぶらと振り、水が羽飛ぶさまを観察する。
If you pass wife, pull off towel, shake wiener at her and make the 'woo-woo' sound again.
風呂上りに妻に出会った場合、タオルを取って、ウインナーをぶらぶらと振り、もう一度キャーキャー言わせる。

なんという偏見に満ちた動画だろう。実に面白い。

2007-02-06

Vistaは腐ってやがる。早すぎたんだ

Vistaがどのようなものかを体験するために、ソフマップへ行ってきた。とりあえず、メーカ製のPCが売られているところへ行く。そこには、確かにWindows Vistaがあった。擦りガラスのようなウインドウが有効になっているので、まさにAeroが動いていると言える。

さて、店頭での展示品を少し触ったが、売り文句のひとつ、3Dフリップの仕方が分からなかったので、店員を呼び止めてみた。問う、「Vistaの3Dフリップ機能、これ如何」と。店員答えて曰く、「ウインドウズキー+Eなり。DirectXを使うウインドウ及び、複数の動画再生ある場合にても、Vistaこれを悉く表示す。あるいは、タスクバーから操作すれば、キーを押し続けなくてもこれ機能す」と。

なるほど、本来排他的にGPUを使うはずだったDirectXでの描画が、複数のプロセスで問題なく使われているのは、気分がいい。DX10では、ドライバが停止したとか、デバイスが物理的に外されたなどという場合以外では、デバイスはロストしない。これはとても楽だ。

さて、さようなら善良なる我、そしてこんにちは、悪霊なる我。いざVistaに試練を与えんとす。

まず、ウインドウズキー+Eを数秒間押し続けてみることにした。50個ほどのエクスプローラが開き、操作しがたいほど、Windowsの反応が遅くなった。これはおかしい。メーカ製とはいえ、このPCのCPUはC3Dである。私のAthlonXPですら、50個程度のエクスプローラを一度に開いた程度では、特になんともないのに、どういうことだろう。エクスプローラを消すと、元に戻ったが、何かがおかしい。3Dフリップが機能していない。不思議に思っていると、あの特徴的な擦りガラスのウインドウでなく、不透明なウインドウになっている。これはどうしたことか。

どうやら、ウインドウを開きすぎると、VRAMが足りないため、Aeroが自動的に無効になるらしい。後で考えてみると、これは当然だ。3Dフリップなどの機能を提供するためには、個々のウインドウをすべて描画させておいて、最終的なデスクトップにまとめて描画せねばならない。ひとつのウインドウにつき、そのサイズのテクスチャ、つまりはVRAMが必要になるはずだ。1024x768のウインドウひとつにつき、3MBのVRAMを消費する。開いたエクスプローラは、その程度のウインドウサイズであった。それが50個ということは、150MBである。そのPCに積まれているGPUは、マザーボード内蔵のATIのもので、VRAMは、システムメモリから、200MB割り当てであった。そもそも足りなさ過ぎるのだ。Vistaでは、VRAMとシステムメモリの間でスワップがあるが、いずれにせよ、足りないものは足りない。また、貧弱なVAIOなどでためすと、ユーザが操作不可能になってしまった。単にウインドウズキー+Eを数秒間押し続けただけである。

GEEKでない者がVistaを購入したとしよう。彼等が購入するのは、決まってメーカ製のPCである。使い方がわからず、キーボードを適当に叩く。そのとき、Windowsキー+Eを数秒押し続けるだけで、もうPCが使えなくなる。「なんだ。ボタンを適当に押し続けただけで、パソコンがバグったぞ。だからパソコンは難しくて嫌いなんだ。f*** M$」と悪態をつくこと必定である。

さて、これはどちらが悪いのか。あまりにも公スペックを要求するMS Vistaか。あるいは、ぼったくりの低スペックなメーカ製PCか。私は、メーカにも多少責任があると考える。とにかくGPUを軽視しすぎている。C2D、メモリ512MB、IntelのGPU、これだけで18万はする。メモリが1GBになると、20万を超える。ぼったくりにもほどがある。これらのメーカに、Vista Home Basic以外を載せる選択肢はない。

Valentine's Day in japan

I just write it to improve my English skill. Yes, Valentine's Day is well known in japan. but it is bit different. Valentine's Day is a day on which woman give chocolates to men. There are two types of chocolate. honmei-choco (本命チョコ : literally the favorite chocolate) this is gave to man she really like. giri-choco (義理チョコ: literally social obligation chocolate) this is gave to men such as friends, co-workers, families. Now, there are many men who got no chocolate. what a shame! we have to do something! Looking for girl is tedious. it is waste of time and resources. And you know, there aren't many good-looking girls in the world. Most of them are stupid dirty bitch! But as i said, no chocolate is shame. So what to do... just fake it! This great site explain all we need to do. If you are a man who got no chocolate in your life, you will know you got no chocolate this year too. Because every year, you had hoped for chocolates and got none of them. Is that OK for you? Of course not! Number of Chocolate you got does not mesure man's worth, and you are not the man who live with such mesurement. But... All right. it's time to fake it. You just buy some. So, the problem is where to buy chocolate. There are 3 shops which sell chocolates. 1. convenience store 2. special sale event in supermarket 3. store specializing in chocolate It's all hard to buy for men like ours. Convenience store is more ease than buy porn. But they don't sell high grade of chocolate. There are real girls in 2 and 3 shops so we need big courage, and bit expensive too. You have to determine where to buy it. Let's assume we could buy chocolate. (You really buy it? really you could?) But it don't fake it all. You have to make it known that you got a chocolate from girl. Buying a chocolate is just fill your satisfaction. What important most is you can't simply said "e;I got a chocolate from girl! hehe."e; Because if someone ask you who gave it to you, you can't answer it. if you lied, say "e;Naomi gave to me."e; Naomi herself deny it, your lie would broken out. So you can't let it be known yourself, and use another approach. How to do it. Here is sample. Put chocolate into a bag and change the bag's shape as if chocolate in it. Your friend notice it and ask you what is that. you just said. "Nothing." "Nothing? Surely there is something in it! what that?" "it's... just a chocolate. Don't tell others." "Oh! Really? Who gave it to you?" "I cant tell you." Bingo! you don't need to tell who gave it to you.

あまりに稚拙なので消そうかと思ったが、まあ、黒歴史で一応残しておく。

2007-02-05

電波ソングが売り切れ

東方月燈籠
東方乙女囃子
東方風櫻宴

これらのCDを買いに行こうとメロンブックスに行ったが、売り切れていた。東方風櫻宴だけは、かろうじて残っていた。確かにこれは電波じゃないから、売れ行きもそれほどではなかったのだろうか。これも捨てたものではないと思うのだけれど。今回は、通販で買うことにした。

2007-02-04

二年間、ハードウェアを勉強して分かったこと

 結論:私はハードに向いていない。

もうハードウェアはうんざりだ。動かない。動く気配がない。何故動くかは理解できるが、何故動かないかは理解できないし、誰も教えてくれない。どこかが間違っているのだが、どこが間違っているかは分からない。それが配線を間違えたなどというミスならまだしも、トランジスタを変えたら動いたなどというのは勘弁して欲しい。何故まったく同じトランジスタに、100倍以上もの特性の開きが仕様なのか。そんな精度でいいのか。

もういい。私なんぞは、土方か交通整理か、ド田舎で畑でも耕している方が、よほど性にあっているのかもしらん。まったく変化のない日常を生き、平凡に死ぬのもひとつの道だ。何ぞ自ら苦を求めんや。所詮は人間など、百年も生きられないのだ。

今思う最高の生活とは、こうだ。のんびりと昼頃に出勤し、定時に帰る。妻子を持たぬため、収入は多くなくていい。のんびりと読書をしたり、プログラミングをして時間をつぶす。

すばらしい。問題は、孤独に耐えられるかどうかであるが。

2007-02-03

VistaのDRMについて

どうも、VistaにはDRMがあるから不買すべきだという人がいるらしい。DRMがいやなら、使わなければいいだけの話ではないのだろうか。不買すべきなのはVistaではなく、DRMを付加してコンテンツを販売している業者ではないのか。

なぜITunes Storeは叩かれていないのだろう。実に不思議だ。

しかし、DRMの際の保護モードが、新たなセキュリティ上の問題を引き起こすという懸念がある。これはちょっと困るかな。

2007-02-02

ハリーポッター最終巻の発売日が決定

 ハリーポッター最終巻、Deathly Hallowsの発売日が決定された。2007年、7月21日、土曜日、0時1分である。これはBSTなので、JSTに直すと、2007年、7月21日、土曜日、8時1分になる。

 ソースはオフィシャルサイトだ。

 あと5ヶ月もあるとは、待ち遠しい限りだ。いよいよハリーポッターも完結となる。うれしいような悲しいような。

2007-02-01

XHTMLについて

 XHTMLは面白い。いままで、HTMLを適当に扱っていたが、この機会に、しっかりとした、XHTMLを覚えようかと思う。デザインを自由に変えられるかどうかという懸念であるが、Bloggerは、なかなかいい。ちなみに、新しいテンプレートの、詳しいドキュメントは、ヘルプにあった。Google Help > Blogger Help >Working with Blogger > Layoutsだ。ところで、OperaでWYSIWYGで投稿しようとすると、リンクがうまく機能しない。結局、自分で直接XHTMLを書いたほうが楽だ。