2004-10-01(Fri) [長年日記]
_ [C/C++][programming]パスからファイル名を取得する
MFCの場合、適当にやるとこんな感じ
filename = path.Mid( path.ReverseFind( '\\' ) + 1 );
もっと正確にやる場合は_splitpath(or _tsplitpath)を使う。
_ [programming]INIファイルの保存ディレクトリを取得する
アプリケーションと同じディレクトリにiniファイルを作成したい場合、GetCurrentDirectory()を使うとカレントディレクトリが変更されたときにまずいことになってしまう。ので、実行中のアプリケーションと同じディレクトリを取得して、そこにINIファイルを作成したい。
を参考に作ってみたのが下のコード
CString appdir;
//splitpath用 TCHAR drive[ _MAX_DRIVE ]; TCHAR dir[ _MAX_DIR ]; TCHAR filename[ _MAX_FNAME ]; TCHAR ext[ _MAX_EXT ]; TCHAR path[ MAX_PATH ]; // 実行中のプロセスのフルパス名を取得する ::GetModuleFileName(NULL, path, sizeof path / sizeof path[0] ); // フルパス名を分割する _tsplitpath( path, drive, dir, filename, ext );
// アプリケーションディレクトリ文字列を作成 _tmakepath( appdir.GetBuffer( MAX_PATH ), drive, dir, "", "" ); appdir.ReleaseBuffer();
return appdir;
GetModuleFileName()の使い方を探していたときに見つけたページ
http://hp.vector.co.jp/authors/VA000092/win32/misc.html
正確なコードで参考になる。
http://www14.plala.or.jp/TMatTMnet/programming/tips.htm
明日から使えるTipsが現在12個。
- ファイル選択ダイアログ(複数選択)を表示
- フォルダ選択ダイアログを表示
- Esc、Enterキーで閉じなくするには
- 実行ファイル(自分自身)のフルパス取得
- ファイル・フォルダ検索関数
- ゴミ箱へ削除する関数
- ボタンを有効・無効にする
- ポップアップメニューを表示する
- UTF-8からShift_JISに変換する関数
- ファイルのプロパティダイアログを表示
- 特定のアプリケーションが起動中かどうか調べる関数
- ファイルサイズ数値を変換する関数
追記: http://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc04/にほぼ同じコードが載ってた。
2004-10-03(Sun) [長年日記]
_ MakeSureDirectoryPathExists関数のバグ
MSDNより
DirPath で指定されたすべてのディレクトリを作成します。ディレクトリの記述は、ルートから開始します。
この関数は自前で再帰的にディレクトリを作らなくても済むとっても便利な関数ではあるが気をつけなきゃいけないバグがあるらしい。
http://www.mtakahashi.com/old/10975.html
の10970あたり。
MakeSureDirectoryPathExistsで使用不可文字を使ったとき
2004 03/26 20:15 ofen
環境はWin2000、VC6SP5、MFC使用しています。 パス指定したフォルダを同時に作成する関数を調べていて、MakeSureDirectoryPathExists というAPIを見つけました。こちらの過去ログでも少し情報があり、便利そうでしたので 使ってみたところ、気になることがありますので質問します。 ファイル、フォルダに使えない文字を引数に指定したところ、そのフォルダ以外は作成 してしまいます。どういうことかというと、
C:\Test\one\two\ → C:\Test\one\twoを作成。返り値はTRUE C:\Test\one\*<>/\ → C:\Test\oneを作成。返り値はTRUE C:\Test\one\*<>/\two → C:\Test\one を作成。返り値はFALSEといった具合です。今回はどこか一箇所が作成できないときはFALSEが返ってきて、フォルダは 作成してほしくないのですが、そういった場合はCreateDirectry()でひとつづつ作成して いくしかないのでしょうか?(もしくは作成されたフォルダを下の階層から削除していく??)
他に簡単な方法やアイディアがありましたらご教授ください。
2004 03/26 20:17 ofen すみません、書き間違えました。
C:\Test\one\*<>/\ → C:\Test\oneを作成。返り値はTRUEこの場合、返り値はFALSEです。
2004 03/27 13:26 PHOENIX
PHOENIXです。 _tcschr関数か、_tcspbrk関数なりで使用できない文字が存在するか調べてから MakeSureDirectoryPathExists関数を呼び出せばいいかと思いますが。
....以下略
_ [xyzzy] リージョンをコメントアウト
http://diary.noasobi.net/0308a.html#diary_030809d
便利。でもそもそもリージョンとかセレクションを使ってなかったので、これを機にこちらも覚えることにした。
といってもそんなに構えるほどのものでもなく、
- リージョンはC-SPCでマークした行からカーソル行まで
- セレクションはF6を押した行からスタート
を選択するだけのものだった。かなり大雑把な理解だけど、とりあえずリージョンが使えればよし。
_ [todo]本棚の整理
昔Windowsプログラミングをやろうとして本だけを集めてた愚かしい時期があった。今実際にWindowsプログラミングをかじってみて、多分もう読まないと思う本が結構ある。(しかも結構値段が高い)
それに加えてWeb関係の本も結構並んでるけど今は優先度的に低い。というわけで優先度をつけて並べ替えよう。
_ 地図ビューアを作る講義のテキスト
東京大学情報基盤センター内 計算機プログラミングⅠのテキスト
_ フリーのメッシュデータ
上の地図ビューアで使うようなメッシュデータがどこかにないものかと調べてみたら、国土数値情報ダウンロードサービスというのを見つけた。
_ A9を使ってみた
ベータテストのとき(多分半年くらい前)に一度使ったときは興味なかったけど、今回正式版を使ってみて驚いた。インターフェースが面白い。検索結果にImage Resultというスクリーンショットがある。
Googleとは違った感じ。インターフェースはJavaScriptバリバリで重たいけど、これはこれでいい。シンプルなのがよければGoogle使うし。
ん、よく見たらサイトのスクリーンショットじゃなくてそのサイトで使ってる画像を並べてるだけっぽい。GoogleのImage検索と同じじゃん。
2004-10-06(Wed) [長年日記]
_ Sunbird プロジェクト
Mozilla Calendar から独立したプロジェクトらしい。単体のカレンダーが欲しいと思ってたから期待したい。
想定しているユーザは、Mozilla Firefox (または他のブラウザ) を自分のブラウザとして、 Mozilla Thunderbird (または他のメールクライアント) を自分のメールクライアントとして使っており、 Mozilla に基づいたカレンダーアプリケーションを欲しがっているような人です。
なんか昔のNetscape Communicatorみたい。なんでセットにしたがるんだろう。FirefoxやThunderbirdがいいとか悪いとかではなく、なんか依存しあってる印象がある。とはいえ
カレンダー単体に的を絞って、不必要なコンポーネントや chrome を取り除けば、カレンダーアプリケーションの全体的なフットプリントやパフォーマンスに、多少なりとも影響を及ぼせるのではないかと私たちは考えています。
とも書かれてるのでむしろこっちのほうに発展して欲しい。
_ SVGについて調査
数値データを画像として画面に表示しようと思ってどんな実装が簡単か考えてみた。
- VCなりVBなり使ってWindowsプログラムで画面に表示。
- 面倒、時間かかる、汎用性なし
- 勉強用としては悪くない。無駄にDirectX使ってみても良いし。
- 数値データからBMPなりJPEGへの書き出しツールを作る。
- 面倒、つまらん、汎用性はそこそこ。
どっちもいまいちだし何より手間をかけたくない。
というわけでSVGを使ってみるのはどうかと思った。SVGならテキストデータだからperlで組めば多分数十分かからずに形になるだろう。表示はプラグインが面倒見てくれるから楽。
MozillaのSVG部分取り出して画面に表示してみるのも面白そうだけど多分やらない。
2004-10-08(Fri) [長年日記]
_ INIファイルの保存ディレクトリを取得する(2)
http://techtips.belution.com/ja/vc/0027/より
_tsplitpathの引数で必要ないところはNULLにすればいいからfilenameとextは必要なかった。
CString appdir; //splitpath用 TCHAR drive[ _MAX_DRIVE ]; TCHAR dir[ _MAX_DIR ]; TCHAR path[ MAX_PATH ]; // 実行中のプロセスのフルパス名を取得する ::GetModuleFileName(NULL, path, sizeof path / sizeof path[0] ); // フルパス名を分割する _tsplitpath( path, drive, dir, NULL, NULL ); // アプリケーションディレクトリ文字列を作成 _tmakepath( appdir.GetBuffer( MAX_PATH ), drive, dir, NULL, NULL ); appdir.ReleaseBuffer(); return appdir;
_ PNGけっこういいかも
昨日のSVGの調査のメモに関して、libpngを使ってはどうかとツッコミをもらった。
libpngだとjpegとかgifとかと手間とか手順とか一緒かなー、と思ってて気づいたんだけど大事なことを書くのを忘れてた。「数値データ」は座標データのことで、本来の目的では画像にしたいというのはグラフ化したいのではなくて、実際に座標から点なり線を描画して視覚化したかったのである。
ツッコミの方の名前欄はGDだったのでおそらくグラフにすることを考えて、GDとlibpngを使ってはどうかということだと思う(違ったらごめんなさい)。ていうか昨日の書き方(数値データ)だとそう思うのが普通かも。
で、グラフについては考えてなかったんだけど、統計情報も取るのでグラフを出すのはそれはそれでやってみたい。グラフライブラリに関してもGDに限らず他にもありそう。
今かいてて思ったんだけど、座標データから点/線を描画してSVGなどのベクタ画像じゃなくてラスタ画像作るときのフォーマットとしてはjpegは妥当じゃないな。にじんだりするとまずいし。gifについても256色だと線に色とかつけてくとちょっと心許ない。pngなら劣化も無いしlibpngで手軽に扱えそうだし色も十分。アルファチャンネルも利用できるし、レイヤーの概念はあるんだっけ?SVGよりは枯れてるし案外良いのでは・・・。もちろん他にも山ほどラスタ画像フォーマットはあるけど、TIFFとか枯れすぎててつまらないし。WEB方面では性能を活かしきれてないPNGだけどゲームやらこういうときにはとても便利なフォーマットだ。Thanks gdさん。
相変わらず思考そのままメモってるから話がとびとびになってるけどそのまま発行。
_ TCHARはchar?
TCHARって_UNICODEを宣言してない限りcharだと思ってたんだけどどうもちがうっぽい動作が・・・。
_ CStringとマルチバイト
CStringについて今までかなり誤解していた。
- CString::GetLength()は文字数を取得する関数だと思っていたらバイト数を取得する関数だった。
- CString::GetAt()は1文字を取得する関数だと思っていたら1バイトのcharを返す関数だった。
- CString::Left()の引数は文字数だと思っていたらバイト数だった。
- CString::TrimRight()の引数にスペースを指定したら全角スペースのトリミングができると思っていたらできなかった。
うぉい!全然マルチバイト対応してないじゃん!ちなみにこれら1バイト(char)といってもTCHARなので_UNICODE指定すると2バイトになるんだろう。多分。っていっても単位が変わるだけだけど。
マルチバイト対応というより、文字エンコーディングか。マルチバイトに関してはTCHAR使うことで対応しているわけだし。
つまり、CStringはあたりまえのことだけど文字エンコーディングには一切関知しないクラスではないのだと今更ながらに気づいた。
_ 文字列操作
今日は一日文字の比較とかチェックのコードを書いていた。久々にビット演算とかがちょこちょこ。お、ポインタとかビット演算とかだいぶ慣れてきたんじゃないか?という感じでちょっとうれしい。
しかしCで文字列を操作するプログラム、というとよほど気をつけていてもバグが出そうというイメージがある。どっかに綺麗なコードがないかなー。今度PHPのマルチバイト文字列操作関数のコードを見てみよう。確かmbfilterだったけどライセンス関係でライブラリ化するとかしないとかMLで議論されてた気が。
mbfilterで検索していたらこんな記事発見。
http://www.textfield.net/gtext/archives/000004.html
PHP関数のmb_convert_kanaをJavaに移植したサンプルです。mb_系の関数群はC言語で記述されたUnicode対応の非常に賢いコード群で覗くと非常に参考になります。
良いコードに出会えました。
2004-10-11(Mon) [長年日記]
_ 世間は三連休らしいですが
月9も見ずに会社に居て、しかも午前様。ナチュラルハイになってきますた。
_ @Freed
ここ三ヶ月ほど使ってないから解約or従量プランに切り替えようと思ったけど、これから外に出る機会がでてきそうなのでこのままにしておくことにする。
_ 配列の拡張サイズ
reallocするときに確保するサイズ。あるいはCArrayのSetSizeの第2引数で指定するnGrowByの値。最適な拡張サイズは無いと思うけど、大体の状況でそこそこのパフォーマンスが出る増やし方を調べる。
ちなみにstd::vectorでは
vectorは領域の拡張が必要なとき、元の領域の2倍のメモリを確保する (実装によっては違うかもしれない)。
http://www.wakhok.ac.jp/~sumi/stl/header/vector.htmlより。
となっているらしい。ちょっと大雑把過ぎる気が・・・。
感覚的にはperlとかPHPの配列みたいに多少無茶してもそれなりのパフォーマンスが出る配列が使いたい。けど多分見てもわかないくらい複雑な実装なんだろうな〜。と思いつつPHPのソースからarrayを検索。
- Zend/zend_dynamic_array.c
- ext/standard/array.c
が臭い。と思ったらzend_dynamic_array.cは実質50行程度のソースだった。眠いので今日はここまで。
2004-10-14(Thu) [長年日記]
_ サーバダウン
今回は復旧が遅れてしまって、丸2日ほどダウン。いい加減このパソコン、というかHDDが限界かも。
一応熱を冷ましてから起動したら復活したので安心・・・はできないけどとりあえずOK。
今のところWebサービス自体は2台構成で、バックエンドのファイルサーバ(NFS)とフロントエンドのApacheサーバにわかれてるんだけども、フロントエンド側が熱を持ちやすいマシンなのでしょっちゅう落ちる。今回はディスプレイを閉めて木のラックに収めたのが原因。熱が逃げない上に木が保温性を発揮してフリーズ。
バックエンド側はRAID構成+UPSでほぼ常時稼動が可能だからこっち一本にしても良いかも。将来を見越してフロントエンド側をディスクレスマシンにしてもう1台追加しようと思ってたけど最近そんな余裕もないし。
_ 動的配列の実装あれこれ
C言語でint型の動的配列を作るとするとデータ構造は
int* array; // 配列先頭ポインタ int array_cnt; // 配列サイズ int array_max; // 配列確保数
こんな感じ。これだと管理しづらいので構造体にしてみたりする。
struct Array{
int* data;
int cnt;
int max;
};
これらに要素を追加するときはreallocする。
C++だとまずはclass化してみる。
class Array
{
public:
int* data;
int cnt;
int max;
};
必要なメソッドを追加してみる
class Array
{
private:
int* data;
int cnt;
int max;
public:
int GetSize() const;
bool SetSize(int);
int Get(int) const;
bool Add(int);
};
飲んでるのでこの辺で。テンプレート化とか実際のAddの方法とかAllocateはmalloc/reallocかnew/deleteかとかCArrayの実装がどうとか次回。(覚えてたら)
_ C/C++はconst/enumがいい
2004-10-16(Sat) [長年日記]
_ Google Desktop Search
最近流行っているらしいのでダウンロードしてインストール。最初はGoogle Deskbarのこと?と思ったけど全然違って、ローカルのファイルをGoogleの検索アルゴリズムで検索してくれるソフトだと思う(想像)。
インストールして長い時間かけて作るわけでもなく、すぐに検索していきなり正確な検索結果が出たことに驚き。さすがGoogle。毎度いい意味でこちらの予想を裏切ってくれます。
_ mylab Webサーバ
先日復旧(というかただリブートしただけ)のHDDはすこぶる調子が悪く、案の定sector errorでまくり。多分ログを書くタイミングごとにエラー出てるんだろう。
_ サーバ入れ替え
2004-10-17(Sun) [長年日記]
_ 白髪が増えた・・・
今日久しぶりに会った友人に「白髪があるぞ」と言われ、数えてもらったところ10本も!春にはなかったのに!!燃えつき始めてる!?
2004-10-18(Mon) [長年日記]
_ referer spam
今までもたまに来てたんだけど、今回のは大量すぎる。まだ続くようならいやな日記さんのスクリプトで掃除しようかな。
2004-10-23(Sat) [長年日記]
_ 福岡空港
福岡空港ではいつも手荷物検査でThinkPadがひっかかってたので、今回は出したら無事OK。名古屋空港ではとめられたことないんだけど。といっても、いつも出すべきなんだけどね。
_ 宮崎空港
宮崎空港は海が近くていいんだけど歩ける距離ではないんだよね。今回も時間が無くて海までいけない・・・。
2004-10-26(Tue) [長年日記]
_ サーバーダウン
原因不明でLinuxがフリーズ。やばげ。日曜日から丸一日ほどダウン。復旧時刻 10/26 01:15
ついでにapacheの自動起動の設定をしておく
ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache update-rc.d apache defaults
iptablesの設定も更新したので改めてセーブ
/etc/init.d/iptables save active
2004-10-30(Sat) [長年日記]
_ 巨大ファイルを扱えるバイナリエディタ
700MBくらいのファイルの中身を確認したくて、普段使ってるStirlingでは多分つらいだろうと思って(試してない)探してみた。
で、見つけたのがFile Mapping対応バイナリエディタ「bz」。700MBのファイルが一瞬で開けて中身を確認できました。すごい。
作者の方のサイト:c.mosのホームページ
ちなみに今回の700MBのファイルは一応テキストファイルなのでNT版UNIX-like toolsに含まれるtailコマンドでも確認。tailの使い方がLinuxのとちょっと違って戸惑ったのでメモ。ファイル末尾から100行を表示したい場合はハイフンに続けて行数を指定する。
tail -100 file.txt
linux(Debian Linux Woody)についてるtailだと
tail -n 100 file.txt
だと思ったんだけど上の渡し方でもいけるのかも?
_ [MFC] CListCtrlの仮想リスト
要調査。情報少なめ。
表示はClistCtrlにまかせてデータの管理をアプリケーションでしましょうという機能。リストに表示するデータが量が多いときに使うと効果的。
http://www.codeguru.com/Cpp/controls/listview/advanced/article.php/c4151/

ツッコミを含む