Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DOT_FONTNAME (Doxygen 1.5.6)

タグ: Doxygen

id 514810: Added DOT_FONTNAME and DOT_FONTPATH options which allow instructing dot to use a different font than FreeSans.ttf which doxygen put in the output directory.

dotのフォントが指定できるようになった。

デフォルトのフォント FreeSans には日本語文字が含まれていないので、そのままでは日本語を表示できない。

/// @defgroup parent 親グループ
//@{
/// @defgroup child 子グループ
//@}

FreeSans.png

Doxyfile を編集し、 DOT_FONTNAME に日本語文字を含むフォントファイルを指定することで、日本語を表示できるようになる。

DOT_FONTNAME = MSGOTHIC.TTC
DOT_FONTPATH = C:\WINDOWS\Fonts

MSGOTHIC.png

05月27日のココロ日記(BlogPet)

外国と開発の共通点って何でしょうね?

*このエントリは、ブログペットのココロが書いてます♪

料理は質よりバリエーション

いつの間にかブログ妖精ココロがバージョンアップしていた。
イベントが追加され、タイムスケジュールもところどころ変わっている。
最近、23?24時の就寝イベントを見られない(普通に起きている)と思ったら、その所為だったか。

頑張りの甲斐あり、料理のレパートリーもついに増加!

ココロの料理(マグマ)
マグマの包み焼き……?

ココロの料理(土偶)
土偶……?

ココロの料理(カレー
ぱんぱかぱーん

ココロの料理(カレー・大)

本日見かけた酷いコード10

タグ: C++ 酷いコード

バグ探しを手伝って欲しいと言われた。
色々調べて落ちる場所の特定まではできた(デバッグ実行もバックトレースも不可らしい)が、その原因がどうしても分からないのだという。
さっそく、その落ちる場所とやらを見せてもらう。

  1. printf (落ちる位置を特定するために追加)
  2. ローカル変数 hoge.m_type に定数(4)を代入
  3. printf (落ちる位置を特定するために追加)

最初の printf の出力は表示されるが、後ろの printf の出力は表示されず、「アドレス 0x00000004 で Access Violation」という例外が発生する。
だから怪しいのはこの2つの printf の間にある処理。

確かにその説はごもっとも。
だがそこにある処理は、どう考えても Access Violation するようなものではない。

hoge.m_type = 4;

hoge が参照だったり、非PODだったりしたら分かるが、これは間違いなくPODのスタック変数。
ただの代入文で落ちるはずはない。

0x00000004 という微妙なアドレスも気になる。
NULL + vfptr ……はPODだからないか。
NULL + メンバ変数アドレス ……も、メンバ変数が構造体の先頭メンバだから、 0x00000000 になるはず。

結論:代入文では落ちない

と、なると。
私は後ろの printf を見る。

printf("[Debug] type:%s", hoge.m_type);

%sに hoge.m_type (=0x00000004) か……
そりゃあ、落ちるよね!(・∀・)

でもまあ、こういうのはよくある。
printf の引数を間違えることも、デバッグ用のコードが悪さをすることも。
ついこの前も、デバッグメッセージを表示する関数が、 WaitForSingleObject 中のスレッドに SendMessage してデッドロックを引き起こしているのを見つけたし。
でもって、こういうのはなかなか対策できないんだよねぇ……

MSXMLでSAX

タグ: C++ VS2005

VC++でSAXを使いたくなった。
パーサはなんでもいいのだが、まあとりあえず手近なMSXMLで。
MSXMLはDOMは使ったことがあるが、SAXはない。
でもまあ、MSDNのサンプルを見る限り、なんとかなるだろう。

まずはDOMの時同様、MSXMLのDLLを #import する。

#import <msxml6.dll>

でもって ISAXContentHandler を実装……ってあれ?
#import によって生成された msxml6.tlh の ISAXContentHandler の文字列引数がみんな unsigned short* だ。

struct __declspec(uuid("1545cdfa-9e4e-4497-a8a4-2bf7d0112c44"))
ISAXContentHandler : IUnknown
{
    //
    // Wrapper methods for error-handling
    //

    HRESULT putDocumentLocator (
        struct ISAXLocator * pLocator );
    HRESULT startDocument ( );
    HRESULT endDocument ( );
    HRESULT startPrefixMapping (
        unsigned short * pwchPrefix,
        int cchPrefix,
        unsigned short * pwchUri,
        int cchUri );

VC6ならともかく、VC8は既定では unsigned short と wchar_t を区別するから、この引数を文字列として扱うには reinterpret_cast しなきゃいけない。
それは気分的に嫌なので、仕方ないから方針変更。
atlsoap.h を #include する。
このヘッダには、 ISAXContentHandler を空実装する ISAXContentHandlerImpl が含まれるので、それを継承すれば、ただ S_OK を返すだけの実装はいちいち書かなくて済む。

#include <atlsoap.h>

class MyContentHandlerBase :
	public ISAXContentHandlerImpl,
	public CComObjectRoot
{
public:
BEGIN_COM_MAP(MyContentHandlerBase)
	COM_INTERFACE_ENTRY(ISAXContentHandler)
END_COM_MAP()

	STDMETHOD(startElement)( 
		const wchar_t  * /*wszNamespaceUri*/,
		int /*cchNamespaceUri*/,
		const wchar_t  * wszLocalName,
		int cchLocalName,
		const wchar_t  * /*wszQName*/,
		int /*cchQName*/,
		ISAXAttributes  * /*pAttributes*/
	);

	STDMETHOD(endElement)( 
		const wchar_t  * /*wszNamespaceUri*/,
		int /*cchNamespaceUri*/,
		const wchar_t  * wszLocalName,
		int cchLocalName,
		const wchar_t  * /*wszQName*/,
		int /*cchQName*/
	);

	STDMETHOD(characters)(
		 const wchar_t  * wszChars,
		 int cchChars
	);

	STDMETHOD(startDocument)();
};

typedef CComObject<MyContentHandlerBase>  MyContentHandler;

さっきは「仕方ない」とか言ったが、むしろこれとか msxml.h を #include して使うのが、MSXMLに関しては正道なのかもしれない。
私としては、 high-level properties and methods が定義される #import の方が好きなのだが。

ISAXContentHandler を実装したら、あとはそれを ISAXXMLReader に渡してパース開始。
エラー処理は面倒だから、今回はいいや。

void parse(const _TCHAR* url)
{
	CComPtr<ISAXXMLReader> ipSAXXMLReader;

	::CoCreateInstance(
		__uuidof(SAXXMLReader), 
		NULL, 
		CLSCTX_ALL, 
		__uuidof(ISAXXMLReader), 
		reinterpret_cast<void**>(&ipSAXXMLReader)
	);

	CComPtr<ISAXContentHandler> ipContentHandler;
	{
		MyContentHandler* pMyContentHandler;
		MyContentHandler::CreateInstance(&pMyContentHandler);
		ipContentHandler = pMyContentHandler;
	}

	ipSAXXMLReader->putContentHandler(ipContentHandler);
	ipSAXXMLReader->parseURL(CComBSTR(url));
}

がくっぽいど

Gacktの声で歌うソフト VOCALOID「がくっぽいど」6月発売 - ITmedia News

……

\(^o^)/

UnicodeとUTF-8とASCIIと

ウェブで利用される文字コード、UnicodeがASCIIを上回る--グーグルが明らかに - CNET Japan

ASCIIと比べたときのUnicodeの短所としては、ローマ字を格納するのに2倍のメモリ容量を必要とする点が上げられる。これはUnicodeがより多くの文字記号に対応するため、文字をより多くのバイト数で表現するためである。

「Webで利用される」UnicodeはUTF-8が主流なのだからローマ字に2倍のメモリは必要ないだろうと元記事を開いてみたら、そっちも同じ内容で、コメントで突っ込まれていた。

もともとASCII文字しか使っていないページは、単に文字セットをUTF-8にするだけでそのまま動くのだから楽なもの。
でもって「Unicodeにしたよ:^)」と息巻いてるコンテンツでマルチバイト文字を使うと、「5文字で区切る」つもりであろうところが「5バイトで区切れ」て、日本語が泣き別れたりするんだよね。

『エンデの遺言』

OGC2008現地レポート - GAME Watch
「『ニコニコ動画』が登場したことによって、動画を公開するために必要なカロリー量が劇的に減りました。公開し、共有し、それが流通することによって社会の富は確実に増加しているのですが、しかし、それはGDPに現われていません。従来の経済指標では計測できないのです」

この文章を読んで、ふと「ボランティア経済」という単語が頭に浮かび(ボランティア活動はGDPに計上されない)、そこから「エコマネー」やら「地域通貨」などの単語を経て、この本を読むに至った。

「エコ」な「マネー」ってなんだ(字面だけ見ると胡散臭いぞ)とか、それと「地域通貨」という(単語から連想すると)商店街のポイントみたいなものとどういう関係があるのかとか、字面から適当に想像していたのだが、この本を読み、さらに『Civilization4』をプレイしたことで、とりわけ「エコマネー」という名称に合点がいった。

現在の金融に於ける「利子」のシステムは、「未来の社会に貸しを作る(個人に貸したとしても、結局は社会に分散される)」行為。
未来に対し、成長の義務を押しつけているわけだ。
当然ながら、成長できなければ利子は払えず、社会は崩壊する。

それに対し、一部の地域通貨には「マイナス利子」のシステムが導入されている。
マイナス利子というのは、その名の通り「長く持っていれば持っているほど貨幣価値が下がっていく」というもの。
これは言わば「未来に向かう我々が利子を支払う」ということであり、つまり現在の資源は「未来の社会から借りている」と考えるわけだ。

Civilizatio4で「エコロジー」の技術を獲得した時、画面にはこのような格言が映し出される。

『この大地は先祖からもらったのではなく、子孫からの借りもの』 - アメリカインディアンの歌

「時と共に減価する貨幣」は、まさにこの格言に則った「エコロジー」な「マネー」なのである。

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。