Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

2008年9月29日 #

ある法則

有名な法則があります。

まず、「時は金なり」より、「時間=金」であります。
次に、「知識は力なり」より、「知識=力」が成り立ちます。
最後に、物理学の基礎ですが、「仕事=力×時間」であります。
この三つの式は、その簡素さながら、驚くほどに豊かな示唆を含んでいます。

最後の式を変形すると「時間=仕事÷力」となり、この「時間」と「力」に、前述の式の「金」と「知識」を代入すると、「金=仕事÷知識」となります。
ここから、「同じ仕事をするのなら、知識が少ない方が、得られる金は多くなる」ことが導かれます。

また、この法則は、別の事実も示します。
第三の式を「知識=仕事÷時間」という形に直してみましょう。
この式は、「仕事を短時間で片付けるほど、得られる知識は多くなる」ことを表します。
すなわち、「社員教育と称して、給料をもらいながら勉強させてもらえるのならこれに勝ることはないけれど、そんなことをしてくれる会社は極めて希有なので、とっとと仕事を終わらせて余った時間で勉強した方が、より多くの知識を得られる」ということになります。
加えて、「時間=仕事÷知識」ですから、「知識が増えるほどに、仕事にかかる時間は減り、それによってより多くの知識を得られる」という好循環が待っています。

しかし、忘れてはなりません。
時間と金はイコールであり、従って、時間が半分になれば金もまた半分になるのです。
ここからは、「仕事を短時間で片付けるなんてもってのほか、時間をかければかけるだけ金は儲かる」という事実も浮かび上がってきます。
要するに、余暇を捨てて時間を残業につぎ込むことが、金を稼ぐ道だということです。

「仕事=知識×金」なのですから、仕事の総量が同じなら、知識と金はトレードオフの関係にあるのです。
繰り返しになりますが、「金=仕事÷知識」から、前述の好循環には、「知識が増えるほどに、得られる金は減る」という裏側があることがわかります。
知識をとれば貧乏になり、金をとれば馬鹿になります。
世の中、知識では食っていけないということです。知的労働って何でしょうね?
まぁ少なくとも、会社からこんなエントリを書いている俺は、明らかに拝金主義の「痴的労働者」だということは明らかなようですが。

posted @ 18:25 | Feedback (4)

連載:メッセージ リソース(2)

ちょっと間が空いてしまいましたが、連載第2回です。
今回は、前回作ったメッセージ リソースを使うコードを紹介します。
前回までで、以下のようなプロジェクトができているはずです。

image

これに、ソース ファイルを追加しましょう。
ファイル名は MsgRes.cpp とでもしておきます。

で、いきなりですが中身を公開します。

#include <windows.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>

#include "MsgRes.h"

int _tmain()
{
	setlocale( LC_CTYPE, "japanese" );

	LPTSTR msg = NULL;
	DWORD result = FormatMessage(
		FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL, MSGID_SAMPLE_0001, MAKELANGID( LANG_JAPANESE, SUBLANG_DEFAULT ),
		reinterpret_cast< LPTSTR >( &msg ), 0, NULL );

	if( result != 0 )
	{
		_putts( msg );
		LocalFree( msg );
	}

	setlocale( LC_CTYPE, "english" );

	result = FormatMessage(
		FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL, MSGID_SAMPLE_0001, MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT ),
		reinterpret_cast< LPTSTR >( &msg ), 0, NULL );

	if( result != 0 )
	{
		_putts( msg );
		LocalFree( msg );
	}

	return 0;
}

はい。みんな大好き FormatMessage です。
GetLastError が返すエラーコードを文字列化するのにしか使ったことがない方も少なくないと思います。
今回は、第一引数に FORMAT_MESSAGE_FROM_HMODULE を指定し、第二引数に NULL を指定しています。
この場合、呼び出し側プロセスの EXE モジュールのハンドルを指定したのと同じことになります。

MSGID_SAMPLE_0001 は、前回 MsgRes.mc で定義し、メッセージ コンパイラによって MsgRes.h に書かれているメッセージ識別子です。
続いて言語識別子を指定しています。これは MsgRes.mc の LanguageNames で指定した値です。
言語識別子を変えることで、同じメッセージ識別子でも違うメッセージが取得できているのが分かると思います。

本題は以上です。以下、ちょっとしたオマケ。

メッセージ コンパイラが生成した MsgRes.rc を開いてみると、以下のような、なんともそっけないコードになっています。

LANGUAGE 0x11,0x1
1 11 "MSG_JA.bin"
LANGUAGE 0x9,0x1
1 11 "MSG_EN.bin"

これでは何だかわからん! という方のために、もう少し読みやすく書き換えてみます。
ただし、このファイルはもう一度メッセージ コンパイラを実行すれば上書きされてしまうので、別のリソース ファイルを作りましょう。
MsgRes.rc を一旦プロジェクトから除外し、新しいリソース スクリプトを MsgRes2.rc とでも名づけて作成しましょう。
そうしたら、リソース ビューで MsgRes2.rc を右クリックして「リソース ファイルのインクルード」を選択します。

image

出てきたダイアログに、以下のように入力しましょう。

image

 

LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
1 MESSAGETABLE "MSG_JA.bin"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
1 MESSAGETABLE "MSG_EN.bin"

これで、言語も、メッセージ リソースだということもわかりやすくなりますね。

ただし、リソース コンパイラは MESSAGETABLE というキーワードを理解しますが、Visual C++ のリソースエディタは理解しません。
というかそれ以前に、このダイアログで入力した内容は、リソース ビューに表示されません。
このダイアログを使わずに、MsgRes2.rc を直接書き換えても、リソースの種類は "11" と表示されるだけです。ちょっとさみしいですね。

次回は、挿入シーケンスの使い方と、エラー コードに対するメッセージを定義する方法を解説します。

posted @ 12:39 | Feedback (982)