憂鬱な午後のひととき


1月31日_
・チームは組めそう. さて相手はいかん.
1月30日_
実証実験
・軽いジョギング(脈拍120)で32分. もうちょっとペース上げてもよかったかも. というわけで知り合いの方, 私んちは渋谷から小走り30分です. 出張の際はどうぞお寄りください(^^;
・面白そうなネタがやってきた. ぜひやってみたいが, さてうまくチームを組めるだろうか.
1月29日_
・初めてsizeof(long)=8なる環境に触る. 計算屋さんじゃないから3GBのメモリ使うプログラムが普通に動いてるのも新鮮.
・ひたすら開発の一日. そういやopteronのアセンブラ調べなきゃ, と調査を始めたけどなかなか資料が無いなあ. nasmが使えないのは痛いぞ. 代わりにyasm? SIMD命令はどの程度使えるんだろう. そもそもどうやってコード書くんだ? ABIは? うぉぉ...
1月28日_
・余暇プログラミング
面白い. 面白いんだが寝不足気味...
・全文引用について
別に今更議論をしたいわけじゃないが, ビジネスメールであろうとなんであろうと, 「全文引用メールを受信して不愉快になる人はよく聞くけど, 全文引用じゃないメールを受信して不愉快になった人は聞いたことが無い」 というただ一点において全文引用は無しにして欲しいなあ. 肯定派の意見は送信側のメリットをあげるのみで受信側の立場について触れられているものを見たことが無いし.
1月27日_
・↓ああ, ようやく理解. (const int, int)を渡すとAがconst intと解釈されるが, それが同じ引数に使われている二個目のAと型が違うからあかんよ, というわけやのね.
# 一個だったら大丈夫なのは当然.
でも規格書眺めると参照型じゃなかったらcv限定は無視されるみたい. 実際, 下記コードで&を外すとgccでもC1 = 0, C2 = 1がOKになった. 参照型とそうじゃない型で異なる理由は何?
・自家製ヨーグルトの匂いが実家のときよりきつい. 食べてみたけど, 調子が悪くなったら失敗だった, てか. やな判定法だな.
1月26日_
#include <stdio.h>

template<typename A>
static A func(A& a, const A& b) { return a + b; }

#if (C1 == 1)
template<typename A>
static A func(const A& a, const A& b) { return a + b; }
#endif

int main()
{
#if (C2 == 1)
    const
#endif
    int a = 2;
    int b = 4;
    printf("%d\n", func(a, b));
    return 0;
}
というコードが各コンパイラで
C1 = 0, C2 = 0C1 = 1, C2 = 0C1 = 0, C2 = 1C1 = 1, C2 = 1
VC6×
icc/bcc
gcc/VC7.1×
となった. 規格上正しいのはどれ? help me. 素人考えながらC1 = 0, C2 = 1が駄目なのは面倒な気がする. で, webをさまよってたら, The Forwarding Problem: Argumentsに触れられていた(まだきちんと読んでないけどgccが正しいのかな).
訂正:VC7.1はVC6と違って, gccと同じ正しい挙動を示していた.
ところで
template<typename A>
static A func(A& a) { return a; }

int main()
{
    const int a = 2;
    printf("%d\n", func(a));
    return 0;
}
だとgccでも通るけど, それはよいの?
1月25日_
・skype
通信経路によっては遅延が大きいことがあり, 慣れないとお互いの発言がぶつかってしまう. チャットは遅延が小さいので, 互いに喋り終わったときに何か一文字出すというルールにすると, 相手が喋り終わる直前に自分の番だと分かる. 結局はこれも慣れの問題だけどしばらくそういうルールで運用してみよう.
・ICC(Intel C compiler)での日本語SJIS対応
前も書いたけどやり方を忘れてしまってたのでもう一度.
-Qoption,cpp,--multibyte_charsをIA32/bin/icl.cfgなどに書いておく.
1月24日_
・STLport + iccで
  error: class template "_STL::pointer_to_unary_function"
  has already been defined
てなエラーでコンパイルできないことがあったので, stlport/config/stl_intel.hに
  #undef _STLP_DONT_RETURN_VOID
を書いたら通った(適当). iccのVC6/VC7.1のバグのエミュレートってなんかちぐはぐなときがある.
・ちなみに手持ちのコードのとある計算でVC6/icc7.1/mingw 3.2.3は9.31/6.18/9.99secとiccの圧勝だった.
・まれに見るタイミングでどたばたした(楽しい)週末を過ごした分, 反動が来て少々へこむ.
・skypeを試す. こんなに簡単に使えてしかも音質がクリア. こりゃ凄い.
1月21日_
・身の回りの違いそのほか:
新聞もかなりちゃうなあ. 文化や日常の素朴な記事や投書欄など, 東京ってお笑いネタが少くてつまらん.
おまぬけミスまた発覚.
どうもすんません. でもそこそこ速くなってきたね.
1月20日_
図書館巡り. 古い本(古典という意味ではない)がえらく多いなあ. 何冊かまとめて持ってると, 当時そういう経験はしてないのに20年前に連れ込まれたかのよう. しかも閉館時の音楽がなにゆえブルグミュラー. 近くのおでんやさんもつみれ一個20円. どうみても流れてる空気の粘性が高いぞ. 変わった街だ.
1月19日_
livedoor MAPって指定した二点間の道のりが出て面白い. こうやって見てると, やっぱり東京って密集しているなあってつくづく思う. 実家で通ってたトレーニングジムまで6kmあったけど, 近所って認識しか無かった(準備運動とも思ってない). こっちで遠いというイメージの渋谷までとそう変わらん. 自分のスコープにも入ってなかった大崎は, 大学時代に自転車で通っていた距離より1.5kmも近いみたいや.
1月18日_
救命病棟24時
正座して見るしかない.
1月17日_
不機嫌なジーン
なんで今頃利己的遺伝子なんやと思ったけど, ヒロインの言動にめっちゃ受けてしまった. デフォルメされてるけど似たような発言してる人いたなあと. 数学の教授の発言は元ネタが見え見えだったのがちょっと.
1月16日_
最近, キャッシュカードやクレジットカードに関する犯罪調査の本やテレビ番組がよくあるけど, 今のところこれっと言った対策が無いみたい. 持たないのが一番だけどそういうわけにはいかんし. 不安だなあ.
1月15日_
アイデア自体は昔からあったのだけど, それを実現できるSoftWireの偉大さを体感すべくJIT型割り算コードを作ってみた.
# udivアルゴリズムはAMDのリファレンスにあったやつを元にした.
その一部
class Udiv : public SoftWire::CodeGenerator {
    /*
        input eax = x
        output eax = x / dividend
        となるasmコードを生成する
    */
    bool generate(unsigned int dividend)
    {
        ...
        mov(edx, int(m));
        mul(edx);
        if (a) {
            add(eax, int(m));
            adc(edx, 0);
        }
        if (len) {
            shr(edx, len);
        }
        mov(eax, edx);
        ret();
        return true;
    }
};
a, m, lenなどは普通の変数, mov, mulなどがSoftWireのからくり部分. 見てのとおり実に自然に統合されている. すばらしい.
  Udiv udiv;
  udiv.generate(d);
generate()の中ではd(=dividend)は定数だから, 上記a, m, lenなどは全て定数値となりgenerate()を呼び出したときに普通にアセンブルできる. その後
  int (*div)(unsigned int) = (int (*)(unsigned int))udiv.callable();
により実行コードのポインタを取得して
  div(i)
でそのコードが呼び出される. 実際, d = 1234, 10, 65536などを実行時に渡してdiv()のところでブレークポイントを置いてみると
d = 10
006B37E0   mov         edx,0CCCCCCCDh
006B37E5   mul         eax,edx
006B37E7   shr         edx,3
006B37EA   mov         eax,edx
006B37EC   ret

d = 12345
006B38D0   mov         eax,dword ptr [esp+4]
006B38D4   mov         edx,54F077C7h
006B38D9   mul         eax,edx
006B38DB   add         eax,54F077C7h
006B38E1   adc         edx,0
006B38E7   shr         edx,0Ch
006B38EA   mov         eax,edx
006B38EC   ret

d = 65536
006B3678   mov         eax,dword ptr [esp+4]
006B367C   shr         eax,0Fh
006B367F   ret
とそれぞれ実行時に最適な割り算コードが生成されているのが解る. すごい感動. 範囲を限定すれば更にmul命令もshift + add/subに分解できるだろう. たとえばMPEGの量子化 + ジグザグスキャンの部分とか, 64回のループなんで割り算を全部展開しちゃえるやろなあ.
1月14日_
・webでとってきたソースが
class A {
    enum {
        NUM = 1
    };
    struct B {
        void put()
        {
            printf("A::NUM=%d\n", A::NUM);
        }
    };
};
みたいになっててgcc 3.2.3/2.96, icc, VC7.1ではコンパイルできるのにVC6, bcc32ではエラー. またコンパイラが古いから, 入れ子のクラスのアクセス制御がうまくのかなあと思ったら, cppll:11116を見るとそういうわけではないみたい. class A {の直後にfriend class B;を入れてもエラーは出るのでどうしようかと思ったけど
    class B;
    friend class A::B;
を入れたら通るようになった.
・というわけでSoftWireを少しだけいじってVC6に対応させる.
・gccでコンパイルしようとしてandやorをキーワード扱いされちゃって困ったんだけど, C++ではand, or, cmpl, bitandとかがキーワードになってるんだ. 全然知らなかった. -fno-operator-namesをつければOKとのこと.
# 暫く悩んで分かったのだけど, 実はSoftWireのページに書いてあった. ドキュメントはちゃんと読もう.
1月13日_
・議論しながら試行錯誤. 面白いんだけど敵は強すぎる(T_T).
・早く風邪治ってくれ~.
1月10日_
地図を見たら意外と近そうだったので自転車で渋谷まで行ってみる. 20分ちょい. ただ自転車置き場が無いのでゆっくりできないなあ. 人も車も多いし. この距離なら走っても25~30分ぐらい?
1月9日_
・下宿の窓から富士山が見えるんだ. びっくり.
・テレビである人が「違和感がある」と発言したとき, 挿入されたテロップは「違和感を感じる」になっていた. 割と見かける表現だけど, 馬から落馬したみたいで私は好まない. 自分の発言がそう変えられたらやだな.
1月8日_
・最近あまり使ってない19インチモニタをノートPCにつないでdual monitorにした(できるのを忘れていた). これで3200x1200だ. MSDN開いとくだけでも十分便利そう.
A Plan for Spamを見ながら, 二日ほどでエンジンだけ作ってみた(C++). しょぼしょぼだけどそれなりに学習して判別してくれるもんやねぇ. POPFileは気に入ってるんだけど遅いので, ちゃんと作ってみようかな.
1月5日_
ネットワーク系で今をときめく開発者に(強引に? (^^;)会わせてもらった. やっぱり刺激になりますな.
1月4日_
『動物化するポストモダン』(東浩紀)
オタク系文化の批評論. ちょっと読むのが遅かったみたい. 人気のあったキャラクタのパーツを再構成して人気のあるキャラクタを生成する. その際, そのキャラクタの存在意義や世界観などはどうでもよいという流れを 「大きな非物語」や「データベース的消費」というキーワードで説明していて解りやすい. ただ, 最近ヒットしているドラマ,映画,小説を見てると, それは「オタク」に限らず一般的な風潮になってる気がする. 一億総オタク化してるのかな.
著者と異なる世代にとっても解りやすい理論なのかという点と, 最後のピントがずれてる(と思う)HTMLうんぬんが気になった.
1月2日_
・Gbase(const F2poly::Set G, ...)
おお間抜けなミス発見. キャッシュがうまく働かなかったのはこのせいだった. でも直してもまだまだ及ばない...
・今後の方針打ち合わせ. とりあえず何でもいいから作ると.
・知人夫妻の家にお招き頂く. とても楽しい時間だった.
1月1日_
・私は今まで仕事にせよ何にせよ, 絶対にできる(or 成功する)と確信できたものにしか手をださなかった. 安全と言えば聞こえはいいが, 挑戦的ではなかったわけで. だけど, 去年後半は初めて不確定なものにいろいろ手を出した. 特に大晦日前日の出来事は辛[かった|い](ん?). それはともかく, 先行きが見えないのは不安だけどできる限りのことはしよう. そしてできると思っている以上のことをなし遂げたい.
・うーん, この10日間ほど試行錯誤してたんだけど, どうもキャッシュ部分がうまくいってないみたい. しかし実体を持つとコストが大きいし, ポインタだと寿命の管理が難しそうだしどうしたもんか.

御意見は光成滋生<herumi@nifty.com>までお願いします