憂鬱な午後のひととき
以前, 何かのオープンソースで次のコードが使われていて驚いたifdefの使い方.
#define A
#define B
int a[] = {
#ifdef A
1,
#elif B
2,
#endif
}
gcc 4.3ではコンパイルできたがgcc 4.4ぐらいからエラーになったように思う. ちなみに先日のプロセッサチェッカーmcppやVCやclangでは通る.
#elifの後にはconstant-expressionがこないといけないけど#ifdefが真だし評価しなくてもよいのかどうか.
規格的に正しいのかどうかよく分からない. もっと単純にするなら
int a[] = {
#if 1
128,
#elif $#@)"#F"WFV
112,
#endif
};
がコンパイルできるのかどうかという話. mcpp, VC, clangは通してgccはエラー.
カッコのあるなしで一貫性が違うのはどうか, で思い出したけどWindowsのバッチファイルの仕様で「これは酷い」と思ったことが.
Windowsでは普通"c:\Program Files"配下にインストールされたプログラムが入る. それを示す環境変数はProgramFiles.
ところが64bit Windowsでは加えてProgramFiles(x86)という名前の環境変数が追加された.
まず環境変数名にカッコを含めてしまったセンスがどうかと思う. 「仕様を決めた責任者誰だ」と何度思ったか.
次にオプションによってどちらかのディレクトリを選ぶコードを書いたとしよう. たとえば次のような.
@echo off
if "%A%" == "64" (
echo 64 bit
set X=%ProgramFiles(x86)%
) else (
echo 32 bit
set X=%ProgramFiles%
)
echo X=%X%
A=64のとき64bit, それ以外のときは32bitのつもりで書いたコードだが実行すると64bitのとき何やら動きがおかしい.
>set A=32
>a.bat
32 bit
X=C:\Program Files
>set A=64
>a.bat
64 bit
32 bit
X=C:\Program Files
しばらく悩んでいろいろ試行錯誤してわかったのだが,
どうやらバッチファイルのパーサはif文のカッコの始まり'('が"ProgramFiles(x86)"の終わりのカッコ')'で閉じられたと見なし,
そのあと「よきに計らって」コードを実行している模様. そんなあ….
VC++のdefined
マクロ系はあまり近寄りたくないので適当なこと言うけども, これって未定義と違いましたっけ.
mcppで通すとどちらもエラーになりました.
mcpp添付のマニュアルの「3.9.4.6. 'defined' に展開されるマクロ」には
まず #if 行中でマクロ展開の結果に defined という pp-token が出てくるのは、規格では undefined です
とあるなあ(C/C++の規格書でどう書いてるのかとか, C++11で変わったのか, とかは調べてません).
・眠たい. とてつもなく眠たい. 電車を乗り過ごさないようにするのが一苦労.
・日食グラスを買い損ねたので鏡で反射させて眺めた. 欠けた状態で光ってるのが面白い.
先日買った新しいマシンのWindows 7をいろいろ設定していたらショートカットアイコンが黒くなって困ってた.
一度セーフモードで起動すると次回起動時は治るのだけど再起動したらまた黒くなってしまう.
会社のマシンでも起こっていたので何かなーと思っていたら「窓の手2010 for Windows 7」というソフトのせいということが分かった.
[アイコン]タブの[ショートカット]でC:\Windows\System32\imageres.dllの12番のアイコンを選べば状況が改善された(うっすらと四角は見えるけど).
「柳家三三で北村薫。2012」
舞台が明るくなると, スーツを着て椅子に腰掛けた柳家三三が前ふりも無く語り始める.
『夜の蝉』の一つ目の短編「朧夜の底」が始まった. 落語家による独り舞台というのだろうか. 踊ったり派手な身振りとかは殆ど無いが朗読とは違う.
こういう演出は初めて見る.
作中詩吟をするために, 実際に習ったらしい. 非常に丁寧に作られていた.
終わったら実際に「
山崎屋」を演じる. テンポよい.
締めの柳家三三と北村薫の対談も楽しかった.
これは友達らと見て, 終わってからぜひああだこうだ言いたい. 一人ではストレスフル.
次回は北村薫のミステリの中で最高短編と思ってる「六月の花嫁」. これはいかねば.
『花桃実桃』(中島京子)
40歳過ぎの女性がなんとなく思いついて父親の遺産の古いアパートの管理人になる.
状況や構成は『千日紅の恋人』(帚木蓬生)によく似てる. ただ受ける印象はだいぶ違ってあちらが粛々しっとりなのに対してこちらは明るくてどこか抜けてる.
百人一首の独自解釈も楽しい.
首が痛いのはMRIを撮ると椎間板ヘルニアなんだそうな. まだ軽症なので経過観察だって.
『オヤジ・エイジ・ロックンロール』(熊谷達也)
50歳目前の主人公に突然昔やってたロック魂に火がつき, ギターを買い直すところから初めて, 練習してバンドを組んで.
音楽のことは全然分からないけど熱くていい. 仕事と全然違う趣味にそういうのがあると楽しそうだ.
プログラムが趣味なんだか仕事なんだか分からない私にはちょっと羨ましい.
機械学習×プログラミング勉強会に参加.
始まる前に中谷さんと東京駅の地下街でラーメン. 外でラーメンて2年前の6/7のとき以来みたい.
NHKでも少し取り上げられていた
未来なお部屋のrtri7744さんの話.
試行錯誤と地道な改良の努力のところが面白かった. 音のスイッチは私もパチンとたたくとかのほうが分かりやすいだろうと思ったけど, 「コンピュータ~」と呼びかける方がやりやすいのでそちらを目指したとのこと.
なるほど.
あと今回のプレゼンはぐるぐる回ったりはしなくて気持ち悪くならずにすんだ(いつもは彼のときは見てられなくて下を向いてる). やっぱりeffectは少ない方がいいと思う.
Core Duo(2じゃない) 1.8GHzの自宅サーバは流石に古くて遅いのでCore i3-2100Tのショップブランドのサーバを買ってみた(6万4千円).
新しいパソコンは
前回買ったtype-R以来約7年振り! ところがファンの音が意外と甲高くて悩ましい.
やっぱりちゃんと自分でパーツを選んで組み立てた方がよかったのかな.
2巾に丸める話
『ハッカーの楽しみ』(Hasker's Delight)には与えられた整数xにたいしてそれを超えない最大の2巾を与える関数として
inline uint32_t FLP2(uint32_t x) {
x = x | (x >> 1);
x = x | (x >> 2);
x = x | (x >> 4);
x = x | (x >> 8);
x = x | (x >> 16);
return x - (x >> 1);
}
というのが紹介されている. ちょっと試した感じではdoubleのトリック(こちらも紹介されている)を使った
inline uint32_t FLP2(uint32_t x) {
union di {
uint64_t i;
double d;
} di;
if (x == 0) return 0;
di.d = x;
return 1U << ((di.i >> 52) - 1023);
}
の方が速かった. まあでもx86にはbsfがあるのでそちらを使った方がスマートだしより速い.
inline uint32_t FLP2(uint32_t x) {
#ifdef _WIN32
unsigned long ret;
if (_BitScanReverse(&ret, x)) {
return 1U << ret;
} else {
return 0;
#else
if (x == 0) return 0;
return 1U << (__builtin_clz(x) ^ 0x1f);
#endif
}
0x1fとの排他的論理和はbsfとbsrで書いたように必要.
ただし最適化の段階で消してくれるようだ. 上記コードは次のasmを生成した. すばらしい.
xor eax, eax
test edi, edi
je .L2
bsr ecx, edi
mov al, 1
sal eax, cl
.L2:
ret
FLP2とは逆にそれより小さくない最小の2巾を求める関数CLP2(x)は,
x=2n+α(1<=α<2n)の形のときに2n+1になって欲しいのだからx-1を足してFLP2すればよい.
つまりCLP2(x) = FLP2(2x - 1) for x > 0. この式もまた『ハッカーの楽しみ』に書いてあるね.
テストコードはfloor_and_ceil.cpp.
夜中あまりに首が痛いので痛み止めの薬を飲んでるのだが, その薬は胃を荒らすらしくて同時に胃薬もセットで飲む.
それでもむかむか感は酷くてやっぱり寝られない. さっきからずっと頭の中を行列が行列してる(parade of matrix?).
昔
御意見は光成滋生<herumi@nifty.com>までお願いします