<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>HIRASE CONNECTION WK</title><link>http://blogs.wankuma.com/hirase/</link><description>programming collection</description><managingEditor>T.Hirase</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>T.Hirase</dc:creator><title>[CUDA] CUDA CAPS</title><link>http://blogs.wankuma.com/hirase/archive/2009/10/03/181796.aspx</link><pubDate>Sat, 03 Oct 2009 01:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/10/03/181796.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181796.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/10/03/181796.aspx#Feedback</comments><slash:comments>60</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181796.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181796.aspx</trackback:ping><description>&lt;p&gt;うちのMacBookに載っているGeForce 9400Mで、どの程度、CUDA遊びができるか知りたかったので、コーディング。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
  int num_devices;
	cudaGetDeviceCount(&amp;num_devices);
	printf("number of devices : %d\n\n", num_devices);
	
	for (int device_id = 0; device_id &amp;lt; num_devices; ++device_id)
	{
		cudaDeviceProp device_properties;
		cudaGetDeviceProperties(&amp;device_properties, device_id);
		
    printf("name                     : %s\n" , device_properties.name                    ); /* char[256] */
    printf("totalGlobalMem           : %zd\n", device_properties.totalGlobalMem          ); /* size_t    */
    printf("sharedMemPerBlock        : %zd\n", device_properties.sharedMemPerBlock       ); /* size_t    */
    printf("regsPerBlock             : %d\n" , device_properties.regsPerBlock            ); /* int       */
    printf("warpSize                 : %d\n" , device_properties.warpSize                ); /* int       */
    printf("memPitch                 : %zd\n", device_properties.memPitch                ); /* size_t    */
    printf("maxThreadsPerBlock       : %d\n" , device_properties.maxThreadsPerBlock      ); /* int       */
    printf("maxThreadsDim            : {%d,%d,%d}\n", device_properties.maxThreadsDim[0], device_properties.maxThreadsDim[1], device_properties.maxThreadsDim[2]); /* int[3]    */
    printf("maxGridSize              : {%d,%d,%d}\n", device_properties.maxGridSize[0], device_properties.maxGridSize[1], device_properties.maxGridSize[2]); /* int[3]    */
    printf("clockRate                : %d\n" , device_properties.clockRate               ); /* int       */
    printf("totalConstMem            : %zd\n", device_properties.totalConstMem           ); /* size_t    */
    printf("major                    : %d\n" , device_properties.major                   ); /* int       */
    printf("minor                    : %d\n" , device_properties.minor                   ); /* int       */
    printf("textureAlignment         : %zd\n", device_properties.textureAlignment        ); /* size_t    */
    printf("deviceOverlap            : %d\n" , device_properties.deviceOverlap           ); /* int       */
    printf("multiProcessorCount      : %d\n" , device_properties.multiProcessorCount     ); /* int       */
    printf("kernelExecTimeoutEnabled : %d\n" , device_properties.kernelExecTimeoutEnabled); /* int       */
    printf("integrated               : %d\n" , device_properties.integrated              ); /* int       */
    printf("canMapHostMemory         : %d\n" , device_properties.canMapHostMemory        ); /* int       */
    printf("computeMode              : %d\n" , device_properties.computeMode             ); /* int       */
	}

  return 0;
}&lt;/pre&gt;
&lt;p&gt;結果は、こんな感じ。&lt;/p&gt;
&lt;pre style="color:white; background:black"&gt;number of devices : 1

name                     : GeForce 9400M
totalGlobalMem           : 266010624
sharedMemPerBlock        : 16384
regsPerBlock             : 8192
warpSize                 : 32
memPitch                 : 262144
maxThreadsPerBlock       : 512
maxThreadsDim            : {512,512,64}
maxGridSize              : {65535,65535,1}
clockRate                : 1100000
totalConstMem            : 65536
major                    : 1
minor                    : 1
textureAlignment         : 256
deviceOverlap            : 0
multiProcessorCount      : 2
kernelExecTimeoutEnabled : 1
integrated               : 1
canMapHostMemory         : 1
computeMode              : 0
&lt;/pre&gt;
&lt;p&gt;"Compute Capability" は "1.1" か（major.minor)。ちょっと古いな。"multiProcessorCount" = 2 ってことは、"Scalar Processor" = 2 * 8 = 16 ってことか。まぁ、ぼちぼちかな。Tesla C1060に比べれば少ないけど、まぁ、まぁ、実験くらいはできるなぁ。大学で使ってたXeon×8マシンと数的には一緒か（いや、全然意味が違うけど）。16 ってでも微妙なんだよなぁ。もうちょっと、せめて64SPくらいは欲しいところだぁ。&lt;/p&gt;
&lt;p&gt; totalGlobalMem =2GBになってるけど、9400Mってメインメモリと共有だから、これ、メインメモリのサイズだよなぁ。騙されるとこだった。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181796.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[CUDA] はじめてのCUDA的な。</title><link>http://blogs.wankuma.com/hirase/archive/2009/10/02/181763.aspx</link><pubDate>Fri, 02 Oct 2009 01:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/10/02/181763.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181763.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/10/02/181763.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181763.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181763.aspx</trackback:ping><description>&lt;p&gt;CUDA開始。すごく入り口は簡単だけど、並列思考が求められる。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

__global__ void krnlTest(float* dstv, float* srcv)
{
  int idx = blockDim.x * blockIdx.x + threadIdx.x;  // thread index
  dstv[idx] = srcv[idx] * srcv[idx];
}

int main(void)
{
  const int    num     = 512;
  const size_t vecsize = num * sizeof(float);

  // allocate host memory
  float* host_dstv = (float*)malloc(vecsize);
  float* host_srcv = (float*)malloc(vecsize);

  // initialize input data
  for (int i = 0; i &lt; num; ++i) {
    host_srcv[i] = i;
  }

  // allocate kernel memory
  float* krnl_dstv;
  float* krnl_srcv;
  cudaMalloc((void**)&amp;krnl_dstv, vecsize);
  cudaMalloc((void**)&amp;krnl_srcv, vecsize);

  // transfer input data
  cudaMemcpy(krnl_srcv, host_srcv, vecsize, cudaMemcpyHostToDevice);

  // run (asynchronous)
  krnlTest&amp;lt;&amp;lt;&amp;lt;1,512&amp;gt;&amp;gt;&amp;gt;(krnl_dstv, krnl_srcv);

  // wait and transfer output data
  cudaMemcpy(host_dstv, krnl_dstv, vecsize, cudaMemcpyDeviceToHost);

  // free kernel memory
  cudaFree(krnl_dstv);
  cudaFree(krnl_srcv);

  // print
  for (int i = 0; i &lt; num; ++i) {
    printf("%f\n", host_dstv[i]);
  }

  // free host memory
  free(host_dstv);
  free(host_srcv);

  return 0;
}
&lt;/pre&gt;
&lt;p&gt;cuda?関数はCUDA組み込み関数。blockDimなどは組み込み変数。そしてその行はスレッドインデックスを取得するためのおまじない。あと、__global__はCUDA用コンパイルさせるための指定子。ホストPCからCUDA（カーネル）側の関数を呼び出すときは、不思議なおまじない「&amp;lt;&amp;lt;&amp;lt;d,b,n,m&amp;gt;&amp;gt;&amp;gt;」というのが関数名にくっつく。&lt;/p&gt;
&lt;p&gt;何か間違えているところあったら、Comments are welcomeです。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181763.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] 1から10までの総和をマクロでエレファントに解く。</title><link>http://blogs.wankuma.com/hirase/archive/2009/09/30/181733.aspx</link><pubDate>Wed, 30 Sep 2009 22:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/09/30/181733.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181733.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/09/30/181733.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181733.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181733.aspx</trackback:ping><description>&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/episteme/archive/2009/09/30/181731.aspx"&gt;1+2+…+10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/andochin/archive/2009/09/30/181717.aspx"&gt;[C++] １から１０まで足す&lt;/a&gt;&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

#define SIGMA(X) SIGMA_##X
#define SIGMA_10 (10 + SIGMA_9)
#define SIGMA_9  ( 9 + SIGMA_8)
#define SIGMA_8  ( 8 + SIGMA_7)
#define SIGMA_7  ( 7 + SIGMA_6)
#define SIGMA_6  ( 6 + SIGMA_5)
#define SIGMA_5  ( 5 + SIGMA_4)
#define SIGMA_4  ( 4 + SIGMA_3)
#define SIGMA_3  ( 3 + SIGMA_2)
#define SIGMA_2  ( 2 + SIGMA_1)
#define SIGMA_1  ( 1          )

int main(void)
{
  printf("%d\n", SIGMA(10));
  return 0;
}
&lt;/pre&gt;
&lt;p&gt;もう素直に数字並べて足し算した方がマシなレベル。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181733.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] C99</title><link>http://blogs.wankuma.com/hirase/archive/2009/09/25/181619.aspx</link><pubDate>Fri, 25 Sep 2009 16:14:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/09/25/181619.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/181619.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/09/25/181619.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/181619.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/181619.aspx</trackback:ping><description>&lt;p&gt;もうすでに10年まえの話ですが、C言語の新しい規格「&lt;a href="http://ja.wikipedia.org/wiki/C99"&gt;C99&lt;/a&gt;」(ISO/IEC 9899:1999)が制定されました。&lt;/p&gt;
&lt;p&gt;それなのに、それなのに、いまだに、こんな（↓）文法を使ったことはない。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;static int hoge[100] = {[10]=100, [20]=200,}&lt;/pre&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;int ret = 0;
ret = foo();
int j = bar();&lt;/pre&gt;
&lt;p&gt;一つ目は、「Designated Initializer」という初期化方法。二つ目は変数宣言位置がブロック先頭になくてもいいという法。&lt;/p&gt;
&lt;p&gt;なぜ、使わないって、そりゃ、&lt;strong&gt;Visual C++ コンパイラでエラーになるから&lt;/strong&gt;ですよ。痛い。痛いです。某オープンソースプロジェクトでガンガン使われてる。痛い、痛いです。そろそろ宣言位置くらい許してくれません？　何か副作用あります？&lt;/p&gt;
&lt;p&gt;※注意：C++の話じゃないですよ。&lt;/p&gt;

&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/181619.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++] new &amp; delete 血の掟</title><link>http://blogs.wankuma.com/hirase/archive/2009/08/30/180648.aspx</link><pubDate>Sun, 30 Aug 2009 01:35:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/08/30/180648.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/180648.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/08/30/180648.aspx#Feedback</comments><slash:comments>1396</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/180648.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/180648.aspx</trackback:ping><description>&lt;p&gt;今日のって、もう昨日の横浜勉強会から時既に12時間ほどが経過していますが、忘れないうちにεπιστημηさんのセッションで出てきたnew / delete 血の掟を簡単にまとめておきます。最後のケース６は、勝手に追加。やっちゃダメですよね？？&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;class Hoge { public: void func(){} };

int main()
{
	{ // 正しい new/delete の使い方
		Hoge* p = new Hoge();
		p-&gt;func();
		delete p;
	}
	
	{ // 正しい new[]/delete[] の使い方
		Hoge* p = new Hoge[10];
		p[0].func();
		delete[] p;
	}
	
	{ // 間違いケース１：お別れの挨拶を
		Hoge* p = new Hoge();
		p-&gt;func();
	}
	
	{ // 間違いケース２：なりすましに注意
		Hoge* p = new Hoge();
		p-&gt;func();
		p = new Hoge();
		p-&gt;func();
		delete p;
	}
	
	{ // 間違いケース３：お別れし過ぎ
		Hoge* p = new Hoge();
		p-&gt;func();
		delete p;
		// ... いろいろあって ...
		delete p;
	}
	
	{ // 間違いケース４：未練を残すな
		Hoge* p = new Hoge();
		delete p;
		p-&gt;func();
	}
	
	{ // 間違いケース５：強欲
		Hoge* p = new Hoge[10];
		p[10].func();
		delete[] p;
	}
	
	{ // 間違いケース６：すべて清算せよ
		Hoge* p = new Hoge[10];
		delete p;
	}
	
	return 0;
}
&lt;/pre&gt;
&lt;p&gt;間違えたときは、核ミサイルが発射され、家賃の振込が物凄い額で振り込まれ、消したはずの恥ずかしいアレが消えなかったり、いやむしろ、まぁくんのお母さんに見つかる場所に自動で移動したり、もう何が起きても不思議ではありません。えぇ、ですから、掟をやぶったら、何がオキテもしょうがありません。えぇ、仕様がありませんから。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/180648.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>おやじデイ</title><link>http://blogs.wankuma.com/hirase/archive/2009/08/29/180632.aspx</link><pubDate>Sat, 29 Aug 2009 22:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/08/29/180632.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/180632.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/08/29/180632.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/180632.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/180632.aspx</trackback:ping><description>&lt;p&gt;おやじデイ、というわけで、Gears of War 2 バリにイカすオヤジさんたちがスピーカーのわんくま横浜勉強会に初乗り込みしてきました（←乗り込んだのは私ですよ。）。スピーカーの皆さん、スタッフの皆さんお疲れさまでした。カンパは気持ち程度しかできませんでしたけど、また横浜で勉強会＆お食事会があれば参加します・・・・って、年１回になりそう。。&lt;/p&gt;
&lt;p&gt;さっそく、うちに帰って、COMCOMとかOLEOLEしようとか思ったのですが、、、、、うち、メインマシンMacだった・・・・。や、Vistaマシンもあるにはあるんですが、最近起動してない・・・・。や、会社じゃちゃんとXP使って仕事してるんですけど、、うちMac。昨日発売されたばかりのSnowLeopard堪能中でした・・・・・。や、VirtualBoxすりゃいいんですけどね。や、XPのディスクどこいったんだっけ。。。&lt;/p&gt;
&lt;p&gt;ま、今流行のまあくんを堪能でもしておきますか。Objective-Cで。&lt;/p&gt;
&lt;p&gt;や、今日は、それより、Ninety Nine Nightsを完全実績解除するぞ。&lt;/p&gt;
&lt;p&gt;thanks!&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/180632.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[VC] デバッグあり実行で、コンソールウィンドウが勝手に閉じる件</title><link>http://blogs.wankuma.com/hirase/archive/2009/08/21/180377.aspx</link><pubDate>Fri, 21 Aug 2009 19:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/08/21/180377.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/180377.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/08/21/180377.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/180377.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/180377.aspx</trackback:ping><description>&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;windows.h&amp;gt;
int main()
{
  if ( IsDebuggerPresent() ) system("pause");
  return 0;
}&lt;/pre&gt;
&lt;p&gt;これで、デバッグ実行でも、デバッグなし実行でも、プログラム終了時に止まってくれる。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/180377.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C/C++/CLI/C#] 二値Enum型を作りたい。 </title><link>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx</link><pubDate>Thu, 30 Jul 2009 23:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/179566.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/179566.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/179566.aspx</trackback:ping><description>&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/hirase/archive/2009/07/17/177879.aspx"&gt;[C#] Enumを二値扱いたかったりする。&lt;/a&gt;&lt;p&gt;
&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/rti/archive/2009/07/27/179358.aspx"&gt;Enum で bool 型を使いたい時って？&lt;/a&gt; (R.Tanaka.Ichiro's Blog)&lt;p&gt;
&lt;p&gt;前回の記事があまりにひどいできだったので、やり直します。&lt;/p&gt;
&lt;h3&gt;戻り値はtrue/falseでいいですか？&lt;/h3&gt;
&lt;p&gt;たとえば、データの書き込み関数「&lt;code&gt;TryWritingBytes&lt;/code&gt;」を考えます。バッファリングやハードウェアの都合上、書き込みには失敗する可能性があります。&lt;/p&gt;
&lt;p&gt;以下に、&lt;code&gt;TryWritingBytes&lt;/code&gt;関数の使用例を示します。同関数の実装は省略。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;extern bool TryWritingBytes(void * data, size_t size);

int main()
{
	// something to do.
	
	if (TryWritingBytes(data, size)) {
		// 成功時の処理
	} else {
		// 失敗時の処理
	}
	
	// something to do.
}
&lt;/pre&gt;
&lt;p&gt;この&lt;code&gt;TryWritingBytes&lt;/code&gt;の戻り値は、書き込み成功時に&lt;code&gt;true&lt;/code&gt;を返す仕様になります。が、こういう「成功=Trueだな」みたいに、経験十分プログラマ的な感覚で決められた関数って、危ういと思います。みんながみんな経験十分プログラマとは限らないからです。&lt;/p&gt;
&lt;h3&gt;成功不成功という値を作るべし。&lt;/h3&gt;
&lt;p&gt;そんなわけで、trueがどっちを表すかなんて、不毛な議論やコメントを書くくらいなら、さっさと別の二値型を作って、読む人も書く人も間違えないようにすべきです。&lt;/p&gt;
&lt;p&gt;そんなこんなで、このコード：&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;enum IsSuccess : bool {
	Success,
	Failed
};

extern IsSuccess TryWritingBytes(void * data, size_t size);

int main()
{
	// something to do.
	
	if (TryWritingBytes(data, size) == Success) {
		// 成功時の処理
	} else {	// Failed
		// 失敗時の処理
	}
	
	// something to do.
}
&lt;/pre&gt;
&lt;p&gt;こんな言語仕様あった方がいいと思いません？&lt;/p&gt;
&lt;h3&gt;補足&lt;/h3&gt;
&lt;p&gt;先の記事で、私、「true/falseを別名で扱いたいだけです」と書いていますが、考え直したところ、全然ダメです。true/falseを別名で扱うこともやはり手段であって、目的ではないですし、仮にできたとしても、所詮別名、成功不成功を表す別名にtrue/falseを代入できてしまいますから。&lt;/p&gt;
&lt;p&gt;なので、やっぱり、二値Enum。&lt;/p&gt;
&lt;p&gt;また先の記事のコメントやトラックバックで、いくつか代替方法をいただきましたが、やはり私を含む経験不足プログラマが見てもわかりやすい方式（二値Enumに限らず）が言語仕様に組み込まれる方が良いと思います。&lt;/p&gt;
&lt;p&gt;ちなみに、別に今回の二値Enumがベストな解だとは思っていません。&lt;/p&gt;
&lt;p&gt;あとあと、最後に。他にも言語仕様に不満ってありません？　っていうか何でテキストエディタなんだよ？　とか。クラスのメソッドを編集するのに、どのファイルを開けばいいかなんて、覚えるのなんて意味ないよ？　とか。もっと自由にやらせろ、的な。&lt;/p&gt;

&lt;h3&gt;追記＠2009-07-30T23:40&lt;/h3&gt;
&lt;p&gt;Success/False以外の例をいくつか。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;
enum OpenClose : bool { Open, Close };
OpenClose CheckOpenClose();
OpenClose OpenTray();

enum YesNo : bool { Yes, No };
YesNo CheckResponse();
YesNo WaitResponse();

enum GoodBad : bool { Good, Bad };
GoodBad CheckFile(const char * file_name);

enum MaleFemale : bool { Male, Female };
MaleFemale CheckSexuality();
&lt;/pre&gt;
&lt;p&gt;などなど&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/179566.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C#] Enumを二値扱いたかったりする。</title><link>http://blogs.wankuma.com/hirase/archive/2009/07/17/177879.aspx</link><pubDate>Fri, 17 Jul 2009 11:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/07/17/177879.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/177879.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/07/17/177879.aspx#Feedback</comments><slash:comments>1923</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/177879.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/177879.aspx</trackback:ping><description>&lt;p&gt;以下、妄想コード。&lt;/p&gt;
&lt;pre class="csharp" xml:space="preserve" name="sourceCode"&gt;enum ProcResult : bool  /* 2値であることを宣言 */
{
    Success,
    Failure,
}

class Program
{
    static void Main(string[] args)
    {
        ProcResult v = ProcResult.Success;
        v = !v; /* 2値なんで、「!」演算したいよぅ。 */

        System.Console.WriteLine(v);
    }
}
&lt;/pre&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/177879.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>学生時代に学んでおきたいこと</title><link>http://blogs.wankuma.com/hirase/archive/2009/07/08/177208.aspx</link><pubDate>Wed, 08 Jul 2009 01:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/07/08/177208.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/177208.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/07/08/177208.aspx#Feedback</comments><slash:comments>167</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/177208.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/177208.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://gihyo.jp/magazine/wdpress/archive/2009/vol51/"&gt;WEB+DB PRESS vol.51&lt;/a&gt;で約４０ページにわたって、「巧いメソッド設計」という特集がくんであります。&lt;/p&gt;
&lt;p&gt;中身を見なくても、職業プログラマや、自分で開発してメンテナンスしたことがある人なら納得の内容ばかりです。&lt;/p&gt;
&lt;blockquote cite="http://gihyo.jp/magazine/wdpress/archive/2009/vol51/"&gt;
&lt;ul&gt;
&lt;li&gt;第1章：品質を実現する“巧い”プログラミング&lt;br /&gt;
	プログラミングこそ，真の設計&lt;/li&gt;
&lt;li&gt;第2章：クラス設計／パブリックメソッド設計の考え方&lt;br /&gt;
	処理分担をどう実現するか&lt;/li&gt;
&lt;li&gt;第3章：プログラムの意図を読み手にいかに伝えるか&lt;br /&gt;
	コメント，ネーミング，コーディング標準&lt;/li&gt;
&lt;li&gt;第4章：メソッド構造化の実践知識&lt;br /&gt;
	実装者が心得ておくべき品質向上のための手法&lt;/li&gt;
&lt;li&gt;第5章：メソッドの副作用を考える&lt;br /&gt;
	同じ引数で呼び出しても結果が違うメソッドの扱い方&lt;/li&gt;
&lt;li&gt;第6章：メソッドのエラー処理を考える&lt;br /&gt;
	「契約による設計」を使った潜在的バグへの対処&lt;/li&gt;
&lt;li&gt;第7章：Javadocをコード品質の向上に活用しよう&lt;br /&gt;
	ドキュメントツールJavadoc再入門&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;大学のとき、こういう授業ってなかったなぁと思います。またデバッグの授業とかもあればいいなと思います。&lt;/p&gt;
&lt;p&gt;どうやってバグを回避するか、バグが出たときにどう対処するか、それを学生さんに学んでほしいです。というか、自分が学びたかったです。&lt;/p&gt;
&lt;p&gt;学問としての面白みは皆無なような気も、のめり込めば、楽し過ぎる気もしますが、職業プログラマとしては必要なことなので、きっちり学んでから就職したいものです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/177208.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>