子育てプログラマーの日常

とあるプログラマーの日常をだらだらとつづってます。
息子:2007年8月生まれ 娘:2011年12月生まれ

[memo]Windows 環境変数

Windowsで環境変数を変更した場合、ログインし直さないと有効にならない。

SETXコマンドを使用すると、その場から有効になる。
(VisualStadioなどは起動時に環境変数を読み込んでいるようで、再起動が必要)

[memo]picojson

JSONの読み込むために、picojsonというライブラリを使ってる。
ヘッダーファイル1つだけという超軽量ライブラリ。

ちょっとだけ手を加えて使用する必要があったので、その点だけメモ

・Unicode対応していない
日本語を扱いたい場合は、std::stringをstd::wstringへ全て置き換え
あと定数文字列をUnicodeに修正 ("null" → L"null")

・一箇所inlineを忘れている
bool operator==(const value& x, const value& y) {
となっている場所の行頭にinlineを追加
inline bool operator==(const value& x, const value& y) {
(複数ファイルから読み込む場合に、複数回定義されてエラーになる)

mapのキーだけ or 値だけ

仕事メモ

std::mapでキーだけ、または値だけでBOOST_FOREACHを使いたい事が、時々あるのだが、
どうやるのだったか忘れて、その度に探してしまうので、自分用のメモ

以下の情報はboostjpから


#include <iostream>
#include <map>
#include <string>
#include <boost/range/adaptor/map.hpp>
#include <boost/foreach.hpp>

int main()
{
std::map<int, std::string> m;
m[3] = "a";
m[1] = "b";
m[4] = "c";

// キーのみを抽出
BOOST_FOREACH (int key, m | boost::adaptors::map_keys) {
std::cout << key << ' ';
}
std::cout << std::endl;

// 値のみを抽出
BOOST_FOREACH (const std::string& value, m | boost::adaptors::map_values) {
std::cout << value << ' ';
}
}

[memo]Gdiplus::Bitmap::SetResolution

Windows7では動くコードがWindowsXPで動かなかったのでメモ

ファイルをロックしてしまうのを避けるため、
ストリーム経由で読み込んだBitmapに対して、
SetResolutionを使用して描画を行うと何も描画されない。
(例外も投げていない)

結局、新しいBitmapを作成して、読み込んだファイルの内容をコピーすると、
SetResolutionが使用できる模様

脳内再生

さあ、わが4人のしもべよ。

今こそ、お前たちの本当の力を見せる時だ!!!


(ええっ!!!4人が合体していく...)




















1/4

(要約)
グラフィックの負荷が高いプログラムのテストをするため、
通常4画面で使っているパソコンの画面を1つにして作業中。



そんなセリフを脳内再生しながら仕事するプログラマー

今年で36歳です。

[memo]Objective-C、XCode、Mac等のメモ

XcodeによるObjective-C入門を読了

うん、物足りない。
XCodeとInterfaceBuilderがまったく初めてだったので、最初にちょっと触れる程度には良いんだが、
言語の詳しい部分の説明が無いので(セレクタの説明が無かった)、消化不良
(C言語の内容もあるため、半分くらい読み飛ばした)

先にネットで見てたページの方が、内容的には充実してたりする


以下、自分用のメモ

・Mac環境では初期状態でカレントディレクトリがコマンドの検索パスに含まれない
 カレントにある実行ファイルの実行には"./"が必用
・「#import」インクルードファイルの二重インクルードなどを防いでくれる
 #define、#ifdefなどに展開されてるのかな?
・「#import」でインクルードするファイルが自作のファイルの場合は<>ではなく""を使う
 意味があるかはよくわからない
・C++スタイルの一行コメントは使用可能
・文字列には@をつけるとNSStringのインスタンスになる。
 これで使用できるのは7bitASCII文字のみ、日本語はサポート外
  →と書いてたけど、試してみたらビルドが通り、実行もできた。
   環境により駄目な場合があるのかな?
・"\"とバックスラッシュが別の文字コードが割り当てられてるようなので注意
・NSLogのprintfの違い
 行頭に、日付、プログラム名が入る
 自動的に改行が入る
 %@でオブジェクトの内容を出力できる(descriptionメソッドが呼ばれる)
 JavaのtoStringと似たような使い方
 コーディングルール的に、descriptionは常にオーバーライドした方が良いのかな?
・直接入力などの切り替えはコマンド+スペース
・++、--は使用可能、前置、後置の場合の扱いはC++と同じ
・XCodeではint hoge = 0.5;としても値が切り捨てられる警告が出ないので注意
・デバッグでの引数設定は、プロジェクト左側のツリー内の
 「実行可能ファイル」のコンテキストメニュー「情報をみる」
 で表示される「引数」のタブで設定する


・Objective-Cじゃないけど、XCodeの設定で
 Effective C++に対する違反を警告として表示する機能があった

MFCでStaticLinkの際に表示するメッセージが英語になる件の対応

仕事メモです

VC2005 SP1でStaticLinkすると、
標準のメッセージが英語になってしまう。

日本語化するには、リソースファイルを直接いじる必要あり

"#include ""afxres.rc"" // 標準コンポーネント\r\n"
"#include ""afxprint.rc"" // 印刷/印刷プレビュー リソース\r\n"
  ↓
"#include ""l.jpn\\afxres.rc"" // 標準コンポーネント\r\n"
"#include ""l.jpn\\afxprint.rc"" // 印刷/印刷プレビュー リソース\r\n"


リソースファイル内に2箇所あって、"\"を2つ重ねる必要がある部分とない部分があるので注意

マイクロソフトのページ

また騙された...

はい、日本に何人居るかわからないIllustratorSDK使用者のためのブログです。
その他、大多数の皆様、おやすみなさい

Illustrator内部には、ユニーク(一意)なID(AIUIDRef)があり、
それをArtに設定して使用することができます。

で、ですね、そのIDの参照(AIUIDREFRef)なんかも持つことが出来て、
例えば、
「プラグインで、2つのArtを関連付け、1つのArtが変更された、場合に他方のArtも変更する」
なんて事をしたい場合に、それぞれのArtにIDを設定します。
で、さらに、お互いのIDの参照をそれぞれに持たしておくわけですね。

あとは、kAIArtSelectionChangedNotifierが飛んできたときに、
選択Art内に、対象のArtがあった場合、自身に設定した参照から、
他方のArtを探して、そちらも変更するように実装すればよいと。

ちなみに、ちゃんとIDの参照からArtを探してくれるAPI
(AIUIDUtilsSuite::GetReferencedArt)も用意されてるわけですよ。
うわーーーー、なんて便利なんでしょう!!!





と、思ってはいけません...

このIDの参照ですが、対象のArtを移動、Undo、移動とやってると、
内部で、おかしくなるようで、AIUIDUtilsSuite::GetReferencedArtが正しく動かなくなります。

で、さらにですね。
AIUIDUtilsSuite::GetReferencedArtが使えないなら、
ツリー構造を辿って、自力でArtを探せばよいかと思ってたんですけど、
使って確認してると、IDの参照(AIUIDREFRef)が存在しないIDをさしてたりするんですね...

で、AIUIDRef、AIUIDREFRefを使って、Undoする動作を含め、
Illustratorを動作させ続けると、どうやっても、落ちます...



結論:
「AIUIDRef、AIUIDREFRefは使うな」

wofstream VC2005

仕事メモ
Unicode化の際の注意事項
wofstreamで日本語を出力する場合の設定
std::wofstream ofs;
ofs.open(L"C:\\temp\\test.txt", std::ios_base::out | std::ios_base::trunc);
ofs << L"test\n";
ofs << L"テスト\n";

と書くと、"テスト"の文字列が出力されない

プログラム内部でワイド文字列で扱っているが、
出力の際にマルチバイト文字になおす際の方法が指定されていないためと思われる。

↓でこうすると日本語文字列は正しく出力されるのだが、
std::wofstream ofs;
ofs.imbue(std::locale("Japanese", LC_ALL));
ofs.open(L"C:\\temp\\test.txt", std::ios_base::out | std::ios_base::trunc);
ofs << L"test\n";
ofs << L"テスト\n";
ofs << 1000 << L"\n";

数値の出力に","が入ってしまう。
(↓出力)
test
テスト
1,000

で、結局、こうした
_wsetlocale(LC_ALL, L"Japanese");
std::wofstream ofs;
ofs.imbue(std::locale("Japanese", LC_COLLATE));
ofs.imbue(std::locale("Japanese", LC_CTYPE));
ofs.open(L"C:\\temp\\test.txt", std::ios_base::out | std::ios_base::trunc);
ofs << L"test\n";
ofs << L"テスト\n";
ofs << 1000 << L"\n";

ロケールのカテゴリを指定して、文字列だけに日本語を設定するように変更

miyanoさんのブログで、ofstreamを使うときには、localeの設定がないと、
日本語ファイル名のファイルを正しく開けないことが書いあったが、
ファイル名に渡す文字列がワイド文字列であれば問題なし。(当たり前か)

けど、wofstream::openって、マルチバイトの文字列の引数を持つものも用意されているので、
何かの間違いで、マルチバイトの文字列渡しちゃうと動かなくなるので
localeの設定はしておいた方が安全かな?

ついでですが、_wsetlocale(LC_ALL, L"Japanese");を設定しておくことで、
TRACEにワイド文字列渡しても動くようになります

今日は

浜松に遊びに行ってきま〜〜〜
とりあえず、天錦で昼飯の予定
1/5 >>