憂鬱な午後のひととき


8月31日_
Ofice2010のPower Pointを使って資料を作り始めてみた. 数式エディタはかなり凄い. 使い方はWordの数式の基本が便利. 特に入力している最中にどんどん式ができあがっていくのは感動. これはTeX使っててしょっちゅう夢見た環境そのもの. ただまだまだ不安定で, 流石に落ちることは無かったけれども, どうにも編集できなくて削除しないといけなくなったことが何度か. あと, 目茶苦茶重たい. 一文字ずつゆっくり入力しないと先行入力がまた悪さするのでストレスが溜まる.
8月29日_
追跡AtoZ "はやぶさ"快挙はなぜ実現したか
幾度も逆境を跳ね返した「知恵」と「執念」は見事だった. でも皆をそこに持っていったチームをまとめるリーダーシップの役割も大きかったんだなあと思う. 最近は単独作業が多いので, そういうのもまたやってみたい.
8月28日_
家の古いLinuxにはexecstackコマンドが無かったけどgcc fac.c -z execstack -m32でうまくいった. 古いMacでも動いた. でも新しいMacでは駄目だったみたい. Macにはexecstackも-z execstackも無かったらしい.
int32じゃ駄目だろうというのには同意(作るとき少し迷った). でも最低64bitにするとしても, どちらでも動かすのはめんどい(無理ではない)ので読者の課題ということに.
8月27日_
せっかくなのでWindowsとLinux(32bit)で動くようにした.
>cat fac.c

#include <stdio.h>
#include <stdlib.h>
a=atoi;
b=printf;
c=0x20216425;
d=0x7525203d;
e=0x0000000a;
main=0x55535756;
f=0x000000E8;
g=0x6C8B5E00;
h=0xFD831424;
i=0x8B127401;
j=0x8B18246C;
l=0x8B55046D;
m=0xD5FFE36E;
n=0x8904C483;
o=0x0CEC83C5;
p=0x89EB468D;
q=0x768B2404;
r=0x43DB31E7;
s=0xAF0FDF89;
t=0x245C89FB;
u=0x247C8904;
v=0x43D6FF08;
w=0xEE76EB39;
x=0x5D0CC483;
y=0xC35E5F5B;
Windowsでは一時的に[データ実行防止]に作ったexeを登録する必要がある(実験が終わったら消してね). Linuxでも
>gcc fac.c -m32
>execstack -s ./a.out  ; 実行許可
./a.out 3
1! = 1
2! = 2
3! = 6
>execstack -c ./a.out  ; 実行禁止
./a.out 3
Segmentation fault
てな感じで. Macだとどうするのかな.
8月26日_
頭痛が酷かったので有給とって寝てた. 久しぶりによう寝れた. 気分がましになったのでカッコの話をやってみた. 多分takesakoさんかshinhさんがやってそうな気もするけど, 32bit Windows Xp + VCのCで0個. Windows 7だとdata segment上のcodeには実行属性が無くてエラーになるっぽい. オプションで解除できたっけな.
#include <stdio.h>
#include <stdlib.h>

struct {
    char code[128];
    char s[12]; // +128
    char one[4]; // +140
    int argc; // +144
    int argv; // +148
    int patoi; // +152
    int pprintf; // +156
} main = {
    "\x56\x57\x53\x55\xE8\x00\x00\x00\x00\x5E\x83\xEE\x09\x8B\x8E\x94"
    "\x00\x00\x00\x8B\x09\x8B\x49\x04\x8D\x86\x8C\x00\x00\x00\x8B\x96"
    "\x90\x00\x00\x00\x8B\x12\x83\xFA\x01\x0F\x45\xC1\x50\x8B\x8E\x98"
    "\x00\x00\x00\xFF\xD1\x83\xC4\x04\x8D\xAE\x80\x00\x00\x00\xBB\x01"
    "\x00\x00\x00\x89\xDF\x8B\xB6\x9C\x00\x00\x00\x0F\xAF\xFB\x50\x57"
    "\x53\x55\xFF\xD6\x83\xC4\x0C\x43\x58\x39\xC3\x76\xEE\x5D\x5B\x5F"
    "\x5E\xC3",
    "%d! = %u\n",
    "1",
    &__argc,
    &__argv,
    atoi,
    printf
};

実行例
>fac
>1! = 1

>fac 7
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
あれ, もしかして[]や{}もカウントするのか? それなら
char main[128 + 12 + 4] =
    "\x56\x57\x53\x55\xE8\x00\x00\x00\x00\x5E\x83\xEE\x09\x8B\x8E\x94"
    "\x00\x00\x00\x8B\x09\x8B\x49\x04\x8D\x86\x8C\x00\x00\x00\x8B\x96"
    "\x90\x00\x00\x00\x8B\x12\x83\xFA\x01\x0F\x45\xC1\x50\x8B\x8E\x98"
    "\x00\x00\x00\xFF\xD1\x83\xC4\x04\x8D\xAE\x80\x00\x00\x00\xBB\x01"
    "\x00\x00\x00\x89\xDF\x8B\xB6\x9C\x00\x00\x00\x0F\xAF\xFB\x50\x57"
    "\x53\x55\xFF\xD6\x83\xC4\x0C\x43\x58\x39\xC3\x76\xEE\x5D\x5B\x5F"
    "\x5E\xC3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "%d! = %u\n\0\0\01\0\0\0";
int argc = &__argc;
int argv = &__argv;
int patoi = atoi;
int pprintf = printf;
にすれば[]の2個にまで減らせる. そして
int main = 0x55535756;
int main1 = 0x000000e8;
..
とすれば美しくはないけど本当に0個になる. てか, なんで__argc, __argvを使ってんだよ. [esp + 4], [esp + 8]でいいやん. やっぱりまだ錯乱してるな.
8月25日_
Haskell勉強会におじゃました. 複数の言語が混ざると用語の意志統一だけでも一苦労だなと思った. 話自体はおもろかったけどね.
8月23日_
会社に1時間早く行くと電車の時間が片道7~8分ほど短くなるみたい. ラッシュ時は遅いからなあ. 往復15分近い時間はもったいない気がする. というわけでしばらく早く出社して早く帰ってみる.
8月21日_
x86勉強会はまあ多くは語らないが, 会いたい何人かの方に会えたのでよかったとする.
8月19日_
・アルゴロジック「ピーナッツ」の8手解がわからん.
optimal ate pairingの実装Pairing 2010にacceptされた. Xbyak公式デビュー?(いや本文で一言触れただけやけど^^).
8月17日_
アルゴロジック
面白くて難しい. 6年ぐらい前にこういうののリアル版(20cmぐらいのブロックを並べて動かすやつ)で遊んだな, どこだっけと探したら, 新宿の未来科学技術情報館だったようだ. 残念ながら数年前に閉鎖していた. ちょっと探したらこのページに写真つきで載っていた. 「アルゴブロック」というものだった. あれ, でもこれパソコンの画面みたいだな. 違うバージョンだろうか. そういや大型シャボン玉装置も体験した. 友達は原子炉運転シミュレーションにえらいはまっていたのを思い出す.
8月16日_
夜9時を過ぎても室温32度っておかしいし. さすがにエアコン必要.
8月15日_
ポッカレモンを炭酸水で割って飲みながら, まとめ買いした『ハチミツとクローバー』を読む. なんて自堕落な生活.
8月12日_
友達が東京見物したいというので日の出桟橋から水上バスで浅草に行ってすき焼き食べて建設中のスカイツリー見て帰った. よくあんな駅の間近で建築できるな. 帰り, また頭痛くなったので頭痛薬飲んで寝たら流星群見に行き損ねた. どのみちこの近辺じゃ見えないんだろうけど.
8月11日_
・久しぶりに友達と夕飯を食べた. 一年振り? 毎日朝8時に出て夜12時頃帰ってるらしい. 大変だなあ. 体壊さんように.
・『クジラの彼』(有川浩)
ちょー「ベタ甘ラブロマ」(ンス)だった. 負の方向の思考回路の, 畳み込むようなテンポは少々うっとうしいところもあるが, 話自体は嫌いじゃない. この文体のリズムって古処誠二のそれに似てる気がする. どこが? と言われると困るけど(深酷さは全く違うし), 新井素子なら多少同意は得られるのかな. って思ってたらあとがきで『星へ行く船』が好きだって書いてあった.
8月8日_
kinabaさんから
if (i = 1) {
  int i = 1;
}

はC++の規格書に明示的に駄目と書いてある(6.4.3)と教えていただいた. まずはこれがエラーにならないgccはアウトと. ただその直前に

 if (x) int i;
 if (x) { int i; }
と同値とあるのでややこしい. 少し規格書を遡ってみると3.3.2 Local scopeの4で
Names declared in the for-init-statement, and in the condition of if, while, for, and switch statements are local to the if, while, for, or switch statement (including the controlled statement), and shall not be redeclared in a subsequent condition of that statement nor in the outermost block (or, for the if statement, any of the outermost blocks) of the controlled statement.
とある. ということは7日のような同名のものを再定義するコードはエラーになるのが正しいということか. うーん, 混乱してきた. まあ, とりあえず分かったのは, そういうコードを書くなと(えっ).
8月7日_
・『四畳半神話体系』(森見登美彦)
テレビでやってた終わり3話だけ見て, 面白そうなんだけど一体どういう話かさっぱり分からなくて原作を見た. パラレルワールドストーリーだった. この原作をああいうアニメにしたのは凄い才能だと思った. 最初からちゃんと見てみたいな.
6日の続き
ifの条件部分でも変数定義できたのか. 知らなんだ. というわけでredefine?で教えてもらったように
for(int i = 0; int j = 0; ) {
 int i = 1;
 int j = 1;
}
がエラーになるVCもgccも規格外という結論???
8月6日_
3日の続き
C++の規格を見ると(C++0xでも変わらない),
  for (init cond;exp) state
  {
    init
    while (cond) {
        state
        exp;
    }
  }
と同値, ただしinitの中で定義された名前はcondの中で定義されたのと同じ定義範囲であることを除いて, とある. でwhileについては
  while (T t = x) state
  label:
  {
    T t = x;
    if (t) {
      state
      goto label;
    }
  }
と同値とある. 初期化の後if {}でくくってるのだからgccのコンパイルできるが正しいのかなと思った. けどgccは
  while (int i = 0) {
    int i = 0;
  }
をiが2回定義されているといってエラーにした(VCもエラー). というわけでgccも変かな. "同値"というときに「{}が入ってしまってることのそういう影響」ってどの程度考慮されたのた知らないのだけど, どちらもエラーにしてしまうVC的仕様の方がいい気がする.
8月5日_
Haskellで共通部分を取り出したいとき, intersectだったかintersectionだったかいつも迷う. でちゃんとマニュアルを見たらData.Set.intersectionData.List.intersectだったという落ち(いやマニュアルは毎回見てるのだけど比べてはいなかった). 名詞か動詞かぐらい統一しろよな. 合併はどちらもunionなんだし.
あとIntをData.Setで使うときはIntSetを使う方がだいたい2倍ぐらい速い感じ. 型推論とかえらそうなこと言うんだからSet Intの実装を自動的にIntSetにするぐらいのライブラリ設計にすべきでは. かなりださい.
8月4日_
『七人の敵がいる』(加納朋子)
仕事を持つ女性が, PTAや子供会や義母や夫とバトルする. 目次からして結構面白い. 小学生のとき, PTAなんかで来るのは母親なのになんでみんな保護者欄に父親の名前を書くのか不思議だったのを思い出す. こういうのいそうだなーと思いつつ, ただちょっと主人公が安易に敵を作りすぎ. ラストも作者ならではの一捻りが欲しかったところ.
8月3日_
VC8ではエラー, gcc 4.5ではOK. どちらが正しいのかな.
int main()
{
    for (int i = 0; ;) {
        int i = 0;
    }
}
8月2日_
先週金曜日は有給とって3連休にしてひたすら寝てたけどまだ体調が完全でない. kikxさんに教えていただいたSteinhausの定理とか見たことある気がしてちゃんと確認したいんだが. RudinのFunctional Analysisとかかな. そういやRudinってこの5月にお亡くなりになっていたのか.

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