憂鬱な午後のひととき


4月27日_
↓Windowsの場合, 4KBのページ単位でよければTIB(thread information block)経由でスタック消費量を取得できる.
#include <winnt.h>
int GetStackSizeByTIB()
{
    NT_TIB *tib;
    __asm {
        mov eax, dword ptr FS:[18H];
        mov tib, eax;
    }
    return (int)tib->StackBase - (int)tib->StackLimit;
}
配列を使う関数で配列のサイズを少しずつ大きくしながらGetStackSizeByTIB()を見ると4KB単位で増えていくのを観察できる. 「スタックオーバーフローのハンドリング」が大変詳しそう.
昨日のプログラムでスタック領域をマジックナンバーで埋めるところで大きいアドレスから書き込んでいるのはそうしないと例外で落ちるから. 私は去年末はまったばかり. 「Ask Dr. GUI #49」の中程で説明されている.
4月26日_
スタック消費量を調べる.
逆アセンブルから静的に求めるとは面白い. ただし実行時の(複数の関数呼び出しによる)スタック消費量を知りたいときはまた別の方法でないと分からない. たとえば
int fib(int n)
{
    return (n < 3) ? 1 : fib(n - 1) + fib(n - 2);
}
を手元のcheckstack.plで試すと8バイトとなったが, fib(10)がそうじゃないのは容易に推測できる. そういうときは, 大きな配列をとってある値で初期化しておき, 特定の関数を実行した後その配列がどこまで壊されたかを見るというのが一つの手だと思う. たとえばこんな感じ.
#define SS_MAGIC_NUMBER 0x11223344
#define SS_STACK_SIZE (512 * 1024) /* Windowsだと1MB近くが限界 */
#define SS_ARRAY_NUM (SS_STACK_SIZE / sizeof(int))

void InitStack()
{
    int p[SS_ARRAY_NUM];
    int i;
    for (i = 0; i < SS_ARRAY_NUM; i++) {
        p[i] = SS_MAGIC_NUMBER;
    }
}

int GetStackSize()
{
    int p[SS_ARRAY_NUM];
    int i;
    for (i = 0; i < SS_ARRAY_NUM; i++) {
        if (p[i] != SS_MAGIC_NUMBER) {
            break;
        }
    }
    return (i == SS_ARRAY_NUM) ? -1 : (SS_ARRAY_NUM - 1 - i) * 4;
}

/* 使い方 */
int main()
{
    InitStack();
    fib(10);
    printf("size=%d\n", GetStackSize());
}
ところが実際やってみると, VC++では最適化が邪魔してなかなか思い通りの挙動を示してくれない. pragmaやvolatileなどいろいろ試したけど結局諦めて上記関数をnasmで書いた. やってみるとfib()のスタック消費量はコンパイラやコンパイルオプションによって意外と差がある(fib(10)はVC6=168, icc=148, gcc4.2=100). またprintfのスタック消費量が大きい(数KB)ことも分かる.
4月25日_
無性にこうや豆腐を食べたくなったので作る.
が, 出汁の分量を誤り豆腐達が浸らない. これじゃあ半身浴, いやくるぶしまでしかないやつもおるし困ったな. というわけで修学旅行生のお風呂よろしく入れ代わり立ち代わりさせて対処(出汁を追加するという発想はない). 結果, 見た目がぼろぼろ. でも一応味がついたし, まあええか.
4月24日_
Camelliaのソースが公開されていたので昨日からSIMD化を試みた. が, どうやってもSIMDにはまらず諦めて汎用レジスタの使い回しに走る. P4D 2.8GHz + VC6において40%の高速化(532cycle@128bit). アルゴリズムをいじりようのないことを考えると1st versionとしてはまあまあ? 折角やし, なんのひねりもないのでもうちょい頑張ってみるか.
うひゃあ, 高速な実装が既にあるのね. そりゃそうか.
4月23日_
常識力検定が人気
わはは, 合格率が50%(2級)や10%(1級)なのならそれは常識とは言わん. 蘊蓄や雑学テストやん. 何か勘違いしてはりませんか.
・別の英語ソフトをインストールしてみたが, ユーザインタフェースが最低. 全てのメニューや操作をマウスでしか選べない. キータイプ時になる音が(そんなの邪魔なのに)「タイプライター」と「川のせせらぎ(意味不明)」しか選べない(offにできない). タイプミス時のエラー音が煩い(offにできない). 日本語表示をoffにできない(リスニング練習でこれは致命的な気がする). バックスペースが利かない. なんじゃこりゃ. その点では前のソフト(英語三昧 耳編)は繰り返し練習するときに使いやすいように考えられていた. というか, そういうのが当然やと思うのだけど….
4月22日_
・だらだらと過ごす. なんか似たようなドラマばかりなのでまとめて見るとどれがどれだか分からなくなる. というか, 何, この横並び.
・英語を聞いてその文章を打ち込む(dictation)練習ソフト, 多少は慣れてきたようだ. 初めの頃のを聞き返すとゆっくり聞こえる.
4月19日_
『150cmライフ。』(たかぎなおこ)
意外にもおしゃれLessonの項目が面白かった. へぇ, 女の人って服に手を入れたり(切ったり縫ったり)組み合わせを考えたりするねんね. 朝起きて目についた服を来て会社に行く着たきり雀の私(洗濯はしてますが)には想像もつかない世界であった.
4月18日_
VC6のdspをVC7.1のprojに変換する.
nasmを使ってると, projへの変換がうまくいかないことがあり, それは何年も前から分かってはいたのだけどその場凌ぎで対処してたのでほったらかしていた. (今更だが)調べてみた.
VC6では入力パスを表す$(InputDir)は置換後の文字列が\で終わらない. nasmに渡す場合, \が無いとエラーなので$(InputDir)\とする. しかしVC7.1では$(InputDir)が\で終わるように仕様変更があった. それだけなら問題ない(\はいくつ続いてもよい)のに, VC7.1はお節介にも$(InputDir)\が現れると$(InputDir)に直す. 加えてダブルクォーテーションで括ってくれる. その結果, "$(InputDir)"となり, これはたとえば"test\"に置換される. shellは\"をエスケープ処理するためエラーになる. $(InputDir)/でもわざわざ"test\"にしてくれてエラー.
結局, "$(InputDir)/./"にすれば"$(InputDir)./"に置換されるのでうまくいくことが分かった. でも, なんだかなあ.
4月14日_
epeg vs 自前その後.
今週時間があったので, 腰を据えての最適化により2.5sec@P4D. オリジナル比約3.3倍速. P4だと4.1secなので約4倍. 結局asm使わないまま突っ走った. このぐらい速くなってくると質的変化が起こりだす. ちょっと楽しみ.
4月13日_
首相の鶴の一声で決まってしまうこともある(情けなくも恐ろしい)影響力を考えると「格好いいねえ」[朝日新聞4/11]なんて記事はどうなん. 少なくとも写真を載せるべきじゃないやろ. 期限延長要求側の思惑に乗せられてるようにしか見えない. 著作権保護期間の延長に反対. そもそも創作者が死んでるのに権利もなかろうが.
4月12日_
『東京再発見』(伊東孝)
東京のことまだ殆ど何も知らんよな, というわけで読んでみる. 前半の東京各地の建築物に関する蘊蓄や批評は面白い. ただ少々散文過ぎる. 最終章の「近代土木遺産を考える」は土木屋と建築家の違いとか, 土木遺産を守るための提言などが興味深かった.
岩淵水門を設計した青山士は講演で「(工事費が)大金のように思うけど, (中略)軍艦たった一艘で荒川下流の水害を除くことができるのです」と言ったそうな.
直接は関係ないけど「ヨーロッパには安い家賃の公営住宅をたてて, 低所得の人々にも安定した生活を保証するという伝統がある.」[朝日新聞3/27] 記事の最後には「(合理化の先に)どんな殺伐とした都市と生活が待っているか.」
さて今の日本は. 米軍基地移転費用8000億円とか言ってるけど.
4月11日_
『また,つかぬことをうかがいますが…』(ニュー・サイエンティスト編集部編/金子浩訳)
些細な疑問に対する回答集. 中にはふざけた質問にふざけた答えもあって, どこまで本当なのか少し不安. 一つ, へーって思ったやつ. 「マルハナバチが航空力学的には飛ばない」というのは嘘で, 正確には「羽ばたかないマルハナバチは飛ばない」ということなんだとか(えーっ, そうなの). そりゃ, 小さくてずんぐりしてるから羽ばたかないと飛ばんやろう.
4月9日_
乗り初めてもう1年経ってるのに東急東横線の案内板がどうも慣れない.
+----------------------+
|← 2(C)           1 →|
+------+---------------+
|のりば| 行き先        |
+------+---------------+
|  1(B)| 各停|元町(A)  |
+------+---------------+
|  2   | 特急|元町     |
+------+---------------+
ってなってるのだけど, 慣れてない人がこれを見るときって多分最初に「行き先」の(A), 次に「のりば」の(B), 最後にホームの(C)になると思う. つまり目線の流れが左から右に行って再度先頭に戻り, 最後に上に行くという, 行ったり来たりなんよね.
+------------------+---+
|     各停|元町    | 1 |
+---+--------------+---+
| 2 | 特急|元町        |
+---+------------------+
とか
+------------------+---+
| 1 | 各停|元町    |→ |
+---+--------------+---+
| 2 | 特急|元町    |← |
+---+------------------+
とかの方が分かりやすし目線の流れが左から右へ一度で済むのでいいいと思うんやけどなあ. 急いでるときに各停が特急の待ち合わせしてるところに出くわすと, 焦って間違えることしばしば(えっ, 私だけ?).
4月8日_
値の変わらないローカルな配列にはconstだけでなくstaticもつけたほうがよいようだ. たとえば
int func(int a)
{
    const int tbl[] = { 1, 2, 3, 4 };
    return tbl[a];
}
という関数では意味は同じはずだが(違うなら教えて), constの前にstaticをつけるべき. そうでないとVC6では関数に突入するたびに毎回tblを初期化するコードが生成される.
func proc near
    sub        esp, 16
    mov        eax, [esp+16+4]
    mov        [esp+0], 1
    mov        [esp+4], 2
    mov        [esp+8], 3
    mov        [esp+12], 4
    mov        eax, [esp+eax*4]
    add        esp, 16
    ret
func endp
VC2005でも同じだったのでそういう主義(?)なのかもしれない. gccでは3.4.2(mingw)が同じく初期化コードを生成していたが4.0.2(linux)では生成しなかった. ただしVC6でもstatic constに変更する, あるいはテーブルを関数の外に出すとそのような余分なコードは生成されない.
func proc near
    mov        eax, [esp+4]
    mov        eax, offset_tbl[eax*4]
    ret
func endp
一応VC6の名誉(?)のために言っておくと, たとえばprintf("func=%d\n", func(3));というコードを-Ox -Ob2オプションでコンパイルすると, 定数伝搬が起こってfunc(3)は4という数値に置き換えられる.
string db "func=%d\n"
    push    4
    push    offset string
    call    _printf
gccの場合は3.4.2ではやぼったい, 4.0.2でも少し不要なレジスタ間の移動が発生している(-O3 -finline-function -fomit-frame-pointer).
    movl    $4, %eax
    movl    %eax, 4(%esp)
    movl    offset string (%esp)
    call    printf
いずれにせよconstじゃなくてstatic constのほうがよいようだ.
4月7日_
・他の会社に電話したら, 新入社員だったのだろうか. えらくたどたどしくてなんか必死さが伝わってきたぞ.
入学拒否[朝日新聞]
1カ月前の記事. その後これに関する意見の記事が見当たらなかったように思う. 入学できないという点で類似の出来事では, 暫く前に合格したけどお金がなくて入学を諦めた子どものエピソードが載ってたし, もし障害者がそれを理由に拒否されたら, 過去の例からして「識者の声」などでもっといろいろ取り上げていただろう. だから「記事にしない」こと自体がやな感じと思っていた.
今朝, 賠償提訴への記事. 紙の媒体には若干コメントが載ってる. とは言え, やっぱり印象薄いなあ.
4月6日_
・icc for Linuxのインストールで少しはまる.
icc: error: could not find directory in which g++ resides
webを見たらLANG=Cにしろという意見が多いが, 私のところではそれも駄目だった. いろいろ試してLANGUAGEもCにしたら出来た(日本語版iccならja_JPでもよい). でも
setenv GXX_ROOT `gcc -print-search-dirs | awk '/instal/ {print $2}'`
とするほうがまともっぽい(しかし, 相変わらずiccは日本語周りでトラブルなあ).
『ユーモアの流儀』(小田島雄志)
少々内輪っぽいのが多くてあんまし笑えなかった. とは言え所々笑うぐらいが丁度いいかも.
4月4日_
・肩凝りと頭痛が治まってきたと思ったら, 寝違えして首が曲がらん. ディスプレイ見にくい.
合否情報流出[朝日新聞]
「ダミー用」として本物を渡していたことについて, 「配慮に欠けていた」ってそういうもんとちゃうやろ. 「慮」の意味がこれっぽちも感じられない行動だ.
・新聞に載っていたパズルがどうしても解けなくて(途中で必ず行き詰まる), 「えらい老化したな」とがっくりしていたら問題のミスだったもよう. うー, 何時間も使ってしまった. こっちならすぐ解ける.
4月2日_
・大きなる勘違い. 『折々のうた』(大岡信)から
とりかえしつかないことの第一歩 名付ければその名になるおまえ
私はてっきり, なにやら得体の知れない世の中の流れに, 名前をつけることで一気に進んでしまう恐れを歌ったものかと思ってしまった(たとえば勝ち組・負け組, 下流社会, 愛国心みたいな). 本当は俵万智の幼いいとし子を詠んだ歌だそうな.
・↓どうせだったら「seiyocryptツールを改良してAES解読」とかの方がまだましだった. 切れ味無し.
4月1日_
・疲れ果ててるからゆっくり寝ていたかったのに, 待ち合わせに遅れて謝っているところで目が冷める夢を明け方何度も見た.
・P4D専用に高度に最適化されたプログラムを486時間走らせた結果, SHA256のコンフリクトを見つけた. けど, それを記すにはここの余白は狭すぎる*.
・近所の約2kmの並木道の桜が満開. 天気もよく絶好の花見日和. しかも人通りはそれほど多くなく, みな適当に机やござ持ち込んでる. そののんびり感や最高.
webの余白って何やねん

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