Home > Tips Archive

Tips Archive

Visual Studio デバッグ中のウォッチウィンドウにおける配列ウォッチ方法の一検討

ということで、前にも書いたような気がするけど探せなかったのでメモします。
Visual Studioでデバッグ中、ウォッチウィンドウに配列の名前を入力するとその配列の中身が見えるんですが、ポインタの場合は見られない。ポインタの先が配列でもダメ。


int a[10];     // 「a」で見られる
int *b;
b = a;         // 「b」だとアドレスが見られるだけ

b[0]とかb[1]とかウォッチウインドウに入れればその値は見られるけど配列としてざーっとは見られない。
そんなときには以下です!


b,10

と入力すればサイズ10の配列と解釈して表示してくれるのです!!ばばーん!

というわけで他愛もないメモでした。

以上

センチメンタルインクリメンタル

どうしようもなく更新してないので、くだらないブックマークレットを作っておきました。
Inc Dec
URLの最後の数字をインクリメントして転送するだけという。

以上

phpとsqliteでバックアップ

小物ツールを作るとき、私はよくPHPとSQLiteを使います。PHPなら簡単にSQLite使えるし、バックアップが簡単なためです。
例えば名セリフDB(ほとんど使われていませんがw)では以下のような関数を作っていつでもバックアップと復元ができるようにしています。


define("DB_NAME", "hoge.db");
define("BACK_DIR", "./fuga");

function back_up() {
   $time = getdate();
   $date = sprintf("%04d%02d%02d-%02d%02d%02d"
         ,$time['year'],$time['mon'],$time['mday'],$time['hours'],$time['minutes'],$time['seconds']);
   
   $back_up_name = BACK_DIR . "/" . $date . ".db";
   if (copy(DB_NAME, $back_up_name)) {
      return "OK Back up $back_up_name";
   } else {
      return "NG Back up";
   }
}

function list_of_old() {
   $dh = opendir(BACK_DIR);
   $files = array();
   while (false !== ($file = readdir($dh))) {
      if ($file == '.' || $file == '..' || !strstr($file, '.db')) continue;
      $files[] = $file;
   }
   return $files;
}

function recover($date) {
   $file =  $date;      // list_of_oldで表示した日付
   if (!$file || $file == "") return;
   $file = BACK_DIR . "/" . $file;
   if (copy($file, DB_NAME)) {
      return "OK Recover From $file";
   } else {
      return "NG Recover";
   }
}

まあ、日付でDBファイルをコピーしてバックアップして、復元するときもバックアップファイルからコピーして置換するっていう。
こういう豪快なことができるのもシンプルDBであるSQLiteと、データサイズが小さくて済むユーザーレスサービスの強みですね。

以上

Windowsをマウスレスで使う5つの手段

最近、マウスを使わずにWindowsを使うことにチャレンジしている。その目的を達成するために私が用いているいくつかのテクニックを、ここに公開しておく。

1.ショートカットキーを使う
 まずは基本だ。キーボードショートカットを使うことによりマウス操作を省略する。以下によく使うショートカットキーを列挙する。とりあえずこれだけ覚えておけばいい。超基本的なものもあるがあしからず。

○Ctrl+S
ファイルの保存。
○Ctrl+C
選択領域をクリップボードにコピーする。
○Ctrl+V
クリップボードを貼り付ける。
○Ctrl+A
全部選択する。
○Alt+スペース
アプリケーションのシステムメニューを開く。このキーに関しては基本的に次のような流れで使う。
  ・Alt+スペース→C
   アプリケーションを終了する。
  ・Alt+スペース→M
   アプリケーションを移動する。
  ・Alt+スペース→X
   アプリケーションを最大化する。
○Alt+Tab
アクティブなアプリケーションを切り替える。
○Alt
Altだけを押すと基本的にメニューバー(「ファイル」とか「編集」とか)がアクティブになる。あとは矢印キーで選択するか、「ファイル(F)」とかならFキーを押せばその項目を選択できる。

2.「あふ」を使う
 エクスプローラーをやめて、2画面ファイラー「あふ」を使う。「あふ」はマウスを一切使わずにファイルやフォルダを操作できるソフトだ。慣れるまで時間がかかるが、慣れればもうエクスプローラーなんてめんどくさくて使ってられない。使い方はマニュアルページ(消えたみたいなのでWebArchive)を参考にするとよい。正直に告白すると私は慣れるまで半年かかった(一度挫けたので)。設定すればマウスもある程度利用でき、他のアプリケーションにドラッグ&ドロップってこともできるので安心(?)すべし。

3.「KeyPointer」を使う
 「KeyPointer」はキーボードでマウス操作をエミュレートするという、標記の件に関して言わばリーサルウェポンだ。同様の機能を持つソフトは他にもいくつかあるし、Windows標準でも付いている。しかし斜め移動できなかったり、キーのアサインができなかったり、マウスの速度を変更できなかったり。というわけで個人的にはこれが一番使いやすい。が、いくつか不満な点があったので勝手に修正しておいた。改良(?)版
オリジナルからの変更点は配布ページを参照のこと。
Windows Vistaのユーザーアカウント制御ダイアログでKeyPointerが動作しない問題というのがあるらしいので注意。ただし、私に言わせればVistaのUACなんてうざいから切ってしまえばいい。そしたらVistaとてXPと対して変わらない操作性が得られるだろう。

4.「マウスバック」を使う
 KeyPointerでだいたいやりたいことはできてしまうが、やはりマウスによる操作に比べるとポインタの移動に手間がかかる。そういうわけで、アクティブなウィンドウにぱっとポインタをもってくるためにTTBaseとそのプラグイン「マウスバック」を使う。なんだ、また宣伝か。でも地味に便利なんだ。

5.Firefox+「Mouseless Browsing」を使う
 最後はブラウジング。KeyPointerを使ってもリンクにマウスポインタを合わせるのはちょっと面倒だ。そういうわけで、「Mouseless Browsing」を使う。これはFirefoxの拡張機能だが、リンクにショートカット用の番号が振られて、それを入力するとリンク先に飛べるというものだ。詳しくはこの辺見たらいいと思う。
 あと、Firefoxで有用なショートカットキーを以下に挙げる。

○Ctrl+L
アドレスバーにカーソルを合わせる。
○Ctrl+K
検索窓にカーソルを合わせる。

————————————————–
というわけで、いくつか宣伝みたいなのも混じっているが、最近の私はこんな感じです。

以上

VS2008のコード定義ウィンドウの色

VS2008にはコード定義ウィンドウという便利なのがある。ソース内の選択した変数とか関数の定義箇所を部分的に表示してくれる。だがしかし!ソースのエディタの文字色を白とかにしていると見えなくなる。コード定義ウィンドウの文字色はソースエディタの色と同期されるのに背景は白いままだからだ。
で、この設定を変えるにはどうしたらいいのかと探し回ったが、コード定義ウィンドウ用の設定項目がなかなか見つからなかった。結論から言うと、なんと、ソースのテキストエディタの設定項目の一つとして「定義ウィンドウ」というのがあり、こんな中途半端なところで設定せねばならないのだ!
ツール→オプション→環境→フォントおよび色→設定の表示「テキストエディタ」→表示項目「定義ウィンドウの背景」

・・・たいした話じゃないですね。

以上

バッチファイルの関数もどきを外から呼び出す的な。

  • 2009-01-30 (金)
  • Tips

バッチファイルスゲーよ。
gotoとかcallって引数にラベル渡すけど、これ変数でもいいみたい。

test1.bat


@echo off
goto :%1
echo hoge
exit /b

:FUGA
echo FUGA
exit /b

実行結果


>test1.bat FUGA
FUGA

>

test2.bat


@echo off
call :%1
call :%2
exit /b

:HOGE
echo hoge
exit /b

:FUGA
echo fuga
exit /b

:PIYO
echo piyo
exit /b

実行結果


>test2.bat FUGA HOGE
fuga
hoge

>

というわけで、例えば下のような形式にすればバッチファイルライブラリを作れるということか。


@echo off
setlocal
call :%1 %*
endlocal
exit /b

:HOGE
shift
rem 処理
exit /b

:FUGA
shift
rem 処理
exit /b

:PIYO
shift
rem 処理
exit /b

以上

最大スタックを調べる

自分のプログラムがどれくらいスタックを使っているのか。なかなか見積もりにくい。もう実測するしかねえ!と思いつつ、C言語でどうしたらいいのか。プロファイラーとか使えばできるのかもしれないけど、持ってないし。というわけで、簡単にやるには次のような関数を作っとく。


unsigned int minsp = 0xffffffff;
unsigned int max_stack(void)
{
    unsigned int sp;
    sp = (unsigned int)&sp;
    minsp = min(sp, minsp);
    return minsp;
}

で、どれくらいスタックを使っているのか知りたい場所でこれを呼ぶようにする。一番呼び出し階層が深そうなところとか。そうすると、max_stack関数内の自動変数spのアドレスが変わる。関数が呼ばれたときのスタックのトップ(あたり)にspが積まれるので、呼び出される度に最小のスタック位置を覚えておく。下記のように使う。


unsigned int minsp = 0xffffffff;
unsigned int max_stack(void)
{
    unsigned int sp;
    sp = (unsigned int)&sp;
    minsp = min(sp, minsp);
    return minsp;
}

void hoge(int a) {
   max_statck();
}

int main(int argc, char *argv[]) {
   unsigned int start;
   unsinged int end;
   minsp = 0xffffffff;
   start = max_stack();
   hoge();    // スタックを計りたい処理
   end = max_stack();
   printf("%d\n", (int)(start - end);
   return 0;
}

まあ、厳密じゃない気がするけど、目安にはなるんじゃないかな。

以上

バッチファイル トリビアルメモ2(置換)

本当にメモ。
例えばバッチファイルの引数にファイルパスを渡して、ファイル名の末尾に拡張子を追加して新しいファイルを作成したいとき、という限定的なシチュエーション。
引数で渡したいファイルパスはc:\document and setting\temp\とかでスペースを含んでいるっていうさらに限定的なシチュエーション。
バッチファイルをhoge.batとすると、パスを引数で渡すときは


hoge.bat "c:\document and setting\temp\fuga.txt"

って感じでダブルクオーテーションで囲む。じゃないとスペースのところで引数が二つに分かれてしまう。
つまりバッチファイルで受け取るとき、


set newfile=%1

ってしたときにnewfile=c:\documentになってしまうため。で、これに拡張子を追加しようとすると


set newfile=%1.ext

としたいが、これだと%1にダブルクオーテーションが含まれてしまっているので大変だ!ってことになるので以下のようにする。


set newfile="%~1.ext"

まあ要はこういうページをちゃんと見ろって言う、ここまで引っ張ってつまらない話。備忘録。あとで使えるようにダブルクオーテーションで囲んでおく。まあ、このへんははまらないようにするための備忘録。あとはコマンドプロンプトで「help set」って打てば環境変数の文字列置換のことも書いてある。

以上

コードプリンター dp.SyntaxHighliter版 バグ修正

コードプリンター dp.SyntaxHighliter版のバグを修正した。
印刷すると改ページできずに1ページ目しか印刷できなかった。
どうやらスタイルシートの
 overflow:auto
がまずかったらしい。


 @media print { .dp-highlighter{ overflow: visible; } }

をcssの末尾に追加したら直った。
下記URL参考
overflow:auto;と印刷用CSS

以上

VC++でデバッグ出力してソースの特定行へ飛ぶ

VCでコンパイルエラーになると出力ウィンドウにメッセージが表示されて、そこをマウスでダブルクリックすると対応行へ飛ぶことができる。
これを自分でもやりたいときどうしたらいいのかと少し悩んだが、エラーメッセージの書式を同じにしたらできた。
OutputDebugString()で以下のような書式で出力すればよい。


ソースファイルパス(行番号) : メッセージ

つまり以下のような感じ。


#include <windows.h>
void myOutputDebugString(LPCTSTR format, ...)
{
    TCHAR errorMsg[1024];

    va_list vargs;
    va_start(vargs, format);
    wvsprintf(errorMsg, format, vargs);
    OutputDebugString(errorMsg);
    va_end(vargs);
}

#define JumpMessage(x) myOutputDebugString(_T("%s(%d) : %s\n"), _T(__FILE__) , __LINE__, (x))

int main(int argc, char *argv[]) {
   JumpMessage(_T("test"));
   return 0;
}

VC6とVC2008ではちゃんと動くことを確認した。デバッグにちょっと便利かも。

以上

Home > Tips Archive

Search
Feeds
Meta
 合計:023358
 今日:0098 昨日:0127

Return to page top