2007年7月26日木曜日

実行ファイルパス取得(WIN32)

これも紹介しとこ。
WinMainからやと実行ファイルパスを取得する方法が
よくわからんかって調べたのでメモ。
※gccでコンパイルして試しました。

まずは main 関数と同じように引数で渡ってこないかを考え
CmdLine の中身を調べて見たが・・・
CmdLine の中にはコマンドライン引数しか入っていなかったのでこれはだめ。

で、MSDNを探して見つけた。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_getmodulefilename.asp
GetModuleFileName 関数
これで実行ファイルの絶対パスが取得できる。

__argv というグローバル変数もあるみたいで
これやと実行ファイル名が取得できた。

以下に使い方を示す。
--------
#include <stdio.h>
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
char buff[256] = {0};
printf("CmdLine = [%s]\n", CmdLine);
// この関数で buff に実行ファイルの絶対パスを取得できる。
GetModuleFileName(hInstance, buff, 256);
printf("[%s]\n",buff);

printf("[%s]\n",__argv[0]);
return 0;
}
--------

実行ファイルパスは取得できると何かと便利ですよね。
バックアップファイルの保存だの。
設定ファイルの読み込みだの。
使い方いろいろ!
変わった使い方してる人いないかな~?

.

2007年7月22日日曜日

vector class(メソッド)

いくつかメソッドを使ってみた

・assign
 vectorの内部メモリを全て解放して改めて確保しなおす。
 確保した各領域を引数で渡した値で初期化する関数
・begin
 iterator の先頭を返す
・end
 iterator の最後+1を返す
・push_back
 vectorの最後に値を追加する
・capacity
 内部で確保している領域を返す
・size
 現在使用している領域のサイズを返す(必ず size <= capacity となる)

msdnに詳しく書いてあります。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vcstdlib/html/vclrfvectormembers.asp


例:を示します。コメントは内部の値を表示
---------
#include <vector>
#include <cstdio>

int main(void) {
std::vector v(1); //v = {未確定}

v.push_back(10); // v = {未確定, 10}
v.push_back(20); // v = {未確定, 10, 20}

for (std::vector::iterator it = v.begin(); it != v.end(); ++it) {
printf("[%d]", *it); // 未確定 10 20 と順に表示される。
}

v.size(); // 3 を取得

return 0;
}

---------

こんな具合です。
上のソースコードコンパイルしてないから動かないかもしれません。

MSDNみれば大体の使い方がわかりますからメソッドはこんなもんで
次はアルゴリズムいってみよっと。
.

2007年7月19日木曜日

便利なwebサイト集

僕が普段使っている便利なサイトを紹介っと

■はてなブックマーク
 あっ!と思ったサイトはとりあえずブックマーク!
 仕事中に見つけて家で読む時などにかなり重宝してます。
 
■checkpad
 自分用のチェックリストを作成できる。
 メールでも登録できるためTODOリストとして活用。
 また毎朝通知するようにして毎日やらないといけない事を忘れないようにしてます。
 
■R*PAD
 スケジュール管理ツール
 日付でスケジュールを登録し、その日付にメールが飛んでくる。
 期限が決まっているものはとりあえず登録してます。
 旅行の前日にスケジュール入れといて忘れ物確認とかにも使えます

■iGoogle
 めちゃ便利。
 ガジェットも豊富やし自作も出来る。
 myポータルサイトみたいにして使っています
 GoogleReaderやGmailも便利サイトですね。

■英辞郎 on the web
 和英、英和はここを活用
 簡単な例文が多々表示されるので関数名や変数名つけるときに大活躍

■aguse
 URLからその際との情報を調査してくれる。
 このURL大丈夫かな?って思った時は
 とりあえずこのサイトで調査!


普段使ってる便利サイトでした。
これでちょこっと仕事の効率アップかな?
.

2007年7月18日水曜日

vector classを触ってみた。

vector class
動的に配列の大きさを変更できるクラス。
内部的では連続したメモリ領域を確保している

n = vectorのサイズ
・ランダムアクセスが可能。
・値の取得は O(1) の時間で取得できる。
・値の追加は O(1) なので速い、ただし vector のサイズを超える追加はメモリを確保し直すため遅くなる。
・値の挿入は 最大O(n) かかる。追加同様 vector のサイズを超える場合は遅くなる。
・値の削除は 最大O(n) かかる。

値の追加によって、メモリの再確保が起こる可能性があるため
あらかじめ大きさが解っている場合に使えそう。
値の取得も速いから使い勝手がよさそう。

とにかく使ってみる。
------------------------
#include <vector>
#include <cstdio>

int main (void) {
const int size = 10;
std::vector v(size); // 大きさ size の vector を作成
int i = 0;

// 値の設定
for (i = 0; i < size; ++i) {
v[i] = i;
}

// 値を出力
for (i = 0; i < size; ++i) {
printf("%d\n", v[i]);
}

}
------------------------

…と書いてみたが普通の配列やん!!!
いろいろメソッドもあるみたいやから
普通の配列よりは使い勝手がよいね。

・

2007年7月17日火曜日

STLをはじめる前に

忘れないうちにメモメモ。

STL(Standard Template Library)
まずこいつを学ぶにあたっての基礎知識をぶち込んだ

C言語には無かった、 template という概念
正直良くわからない。
ただ、今のところ型を不定にしてクラスや関数を宣言できると覚えておくことにする。

template関数

template<typename T>
T add(T a, T b) {
return a + b;
};

T という任意の型の和を計算して返す関数
関数の宣言時は型を意識していない
どの型が来ても +演算子が定義されていれば使えます

C言語やと下のように二つの関数を宣言しないといけなかった
-----------
int add_int(int a, int b) {
return a + b;
}

double add_double(double a, double b) {
return a + b;
}
-----------

それを一つの関数として宣言する事ができた。
なかなか優秀な奴や。

といってもプログラマが楽になるだけで、
コンパイル時に型にあわせて複数の関数を宣言しているので
バイナリサイズはほとんど変わらないみたい
使い方を間違うと大幅にサイズが増える事もあるようです

関数を複数定義しなくてよいのでソースコードの見た目もすっきりしますね。
(目が慣れるまでは気持悪いんですけど…)

実際にtemplate関数を使ってみよう
----
#include <cstdio>

template<typename T>
T add(T a, T b) {
return a + b;
};

int main(void) {
printf("%d\n", add((int)1, (int)3));
printf("%lf\n", add((double)1.5, (double)2.666));
return 0;
}
----
明示的にint型とdouble型にキャストして渡してみた
ちゃんとコンパイル通って実行できるはずです。

まだまだ便利さが良くわかりませんが…
次回は実際にvector classでも使ってみますかな。
.

2007年7月12日木曜日

CPRMに悩まされる

知り合いに保存したDVDが見れないといわれていってきた日のこと。
話を聞くと焼き等に問題もなく、何が問題かといろいろ調べてみたところ
CPRMというデジタルコンテンツ保護技術なるものがかかっていた。
これを再生するにはDVDドライブはもちろん、PCの場合も対応ソフトで
再生する必要がある。フリーで再生できるソフトは今のところ見つけられない。
あればご一報を。ちなみにWinDVDにはVUでCPRM Packがあるらしいが、
対応してるかは運次第

しかし、最近規制が厳しすぎだと思うふしがありますな~。
いくらデジタルは劣化しないからって、メディアは劣化するのに。
緩和しないとTVから人が離れていきそう。
http://www.intervideo.co.jp/download/updata/wd/wd5_HTCWD5.html
http://e-words.jp/w/CPRM.html

2007年7月11日水曜日

使っているフリーソフト

様々なフリーソフトがありますが
自分が良く使っているものでも書いておこうかなと
10コ紹介っと。どれも便利ですよお勧め!

■FireFox
 毎日使うブラウザ日々のネットサーフィンはこれがないと!
 拡張機能が沢山あって自分なりにカスタマイズできるのが便利
 ただし…使い慣れるまで時間がかかります
 僕は2ヶ月ほど試行錯誤しましたからね

■FreeMind
 マインドマップを作成するツール
 使うのにJavaをインストールしないといけませんが、
 自分のアイデアを出すのにはすごい便利!

■IdeaFragment2
 マインドマップとは異なり発散してアイデアを出すのに凄い向いてる。
 FreeMindと用途別で使い分けてます。

■bluewind
 コマンド式のランチャーです。
 初めはアイコンが出るタイプのを使っていたんやけど
 マウス使わんでいいからこっちの方が便利です

■TeraTermPro
 Linuxへの接続はこれ使ってます。

■FFFTP
 FTPを使ってのファイル転送はこれしかない!?
 非常に便利です。

■Paint.NET
 マイクロソフトのサポートを得て開発されているそうです。
 フリーでここまで出来るのかーと驚きましたわ
 画像編集、作成時は必ず使ってます

■ProcessExplorer
 Windows標準のタスクマネージャーと同じような機能を持ったソフト
 タスクマネージャーの基本的な機能は持ちつつ
 関連してるDLLとかも表示できてめちゃ便利
 仕事でも重宝してます

■JUDE/Community
 UML図を各ツール、たまにIdeaFlagmentのようにアイデア出しにも使います
 操作性、デザイン共に大好きです。

■WinShot
 パソコン画面のスクリーンショットを撮るのに凄い便利
 ウィンドウ単位での撮影や自分で範囲を選択して撮影が出来ます


他にもこんな便利なフリーソフトあるよーってのあれば教えてください!
.

2007年7月5日木曜日

オブジェクト指向でなぜつくるのか

「オブジェクト指向でなぜつくるのか」

ずっとC言語で構造化プログラミングしかしてなかった僕が
この本を読んでオブジェクト指向を勉強しました。

プログラムの歴史から書いてあり
なぜオブジェクト思考という考え方にいきついたのか?
という内容からはじまりUMLの基礎まで書いてありました。

かなりわかりやすく書いてあったので
これからオブジェクト指向を学んでいくという人にはお勧めです。

.

2007年7月3日火曜日

VC2005で作成したバイナリファイルのエラー

VC2005で作成したバイナリファイルを実行すると以下のエラーが出た。

「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」

へ?
.NETFrameWork2.0はインストールしても同じエラーが出る。
なんで??
調べてみると、どうやらライブラリを動的にリンクかけてるっぽい。
Visual C++ ライブラリのランタイム コンポーネントをインストールする必要があるみたい
ということで取得してインストールするとばっちし動いた!

ダウンロード先
http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ja

アンマネージコードやと
コンパイルオプションの「C/C++」「コード生成」で
/MD オプションを /MT に変更すると大丈夫っぽいけど

マネージコードやと解らんかった。
なんか方法ないもんやろか?

.

2007年7月2日月曜日

テストの異常系について

ちょうど自分が異常系の定義について考えていた時に
「悪態のプログラマ」にこんな投稿がありました
異常系とは何であるか考えよう

自分の中での異常系の定義とは
・警告のダイアログを表示する
・エラーメッセージを表示する
のことやと決め付けてた。

自己定義が原因でプロジェクト内で意見が食い違っていたことが多々あり、
これじゃまずい!と感じて、異常系の定義をプロジェクト内で話あって認識を合わせた
このことによってテストの異常系を記述する際に悩まなくなったし、
テストシナリオにも統一性がとれて読みやすくなった。

そんな後で「悪態のプログラマ」でのこの記事を見つけて
異常系の解釈の違いがあるのは仕方ないことなんやとホッとしました。
それに、テストを想定して異常系の処理をあらかじめ決めておくことは
すごい重要なんですね。
ここは今まであやふやにしてきたところもあったので
これを気にしっかり決めていくようにしよう!

.

ラベル