<   2013年 09月 ( 5 )   > この月の画像一覧
ExcelVBAでメモリの使用量を取得する
Excel2003までは以下の関数が存在します。
  • 関数名
  • 説明
  • Application.MemoryTotal
  • Excelが使用できるメモリ量
  • Application.MemoryUsed
  • Excelが使用しているメモリ量
  • Application.MemoryFree
  • Excelが使用できるメモリの空容量


Excel2007からは以上の関数は存在しません。



代替案としてどうするかというと、DLLを経由して行います。
カレントプロセスに対してGetProcessMemoryInfoを使用してPROCESS_MEMORY_COUNTERS_EXを取得します。

このPrivateUsageメンバーがコミットチャージにあたります。これは実行中のプロセスが必要としているメモリ量です。

コミットチャージを取得するDLL
http://needtec.sakura.ne.jp/vba/VBADll.zip
※このDLLは32ビットビルドです。Excelの64bitから使用したい場合は64ビットでコンパイルしてください。

DLL側のコード ※Psapi.Libをリンクする必要あり

#include <windows.h>
#include <float.h>
#include <psapi.h>
long __stdcall GetPrivateUsage()
{
PROCESS_MEMORY_COUNTERS_EX pmc;
pmc.cb = sizeof pmc;
DWORD processID = GetCurrentProcessId();
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
GetProcessMemoryInfo(hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof pmc);
CloseHandle( hProcess );
return pmc.PrivateUsage;
}



VBAからの実行例:

Declare Function GetPrivateUsage Lib "c:\hoge\VBADll.dll" () As Long
Dim a() As Long

Public Sub TestMem()
Debug.Print "前 " & GetPrivateUsage()
ReDim a(1000000) As Long
Debug.Print "確保" & GetPrivateUsage()
Erase a
Debug.Print "後 " & GetPrivateUsage()

End Sub




2013/11/27 追記
Microsoft WMI Scripting V1.2 Library を使用すれば、独自のDLLは不要です。

WMIはパフォーマンスデータやイベントログなどのシステム管理用の情報にアクセスするための管理基盤です。
http://msdn.microsoft.com/ja-jp/library/ms974579.aspx

これを用いることで、Win32APIを使用せずにシステムの情報にアクセスできます。

以下のいづれかの方法で独自のDLLを作成するのと同様にPrivate Usageにアクセスできます。

Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Function GetPrivatePageCount()

Dim objSWbemServices As Object
Set objSWbemServices = GetObject("winmgmts:")
GetPrivatePageCount = objSWbemServices.Get( _
"Win32_Process.Handle='" & _
GetCurrentProcessId & "'").PrivatePageCount

Set objSWbemServices = Nothing

End Function




Declare Function GetCurrentProcessId Lib "kernel32" () As Long
' Microsoft WMI Scripting V1.2 Libraryの参照設定が必要
Function GetMemUsage2()
Dim service As SWbemServicesEx
Set service = GetObject("winmgmts:")
Dim obj As SWbemObjectEx
Set obj = service.Get("Win32_Process.Handle='" & GetCurrentProcessId & "'")
'Dim p As SWbemProperty
'For Each p In obj.Properties_
' Debug.Print p.name & ":" & p.Value
'Next p
GetMemUsage2 = obj.PrivatePageCount
Set obj = Nothing
End Function

[PR]
by mima_ita | 2013-09-28 02:20 | VBA
C#のコードからドキュメントを生成する方法
C#のコードからドキュメントを作成する方法はいくつかある。
無料でできるほうほうとしては、以下の選択ができる。

Doxygen
・sandcastle
Sandcastle(XMLコメントからAPIヘルプ生成)


DoxygenはGraphVizと連携することでクラス図とコールグラフを作成できる。
mscgen記法でシーケンス図の記述することも可能である。
また、XMLコメントを解析してくれる

実行ファイルを解析しているわけではないので、コメントとかに誤りがあると正常に動作しない。

sandcastleはMSDN風のヘルプを作成してくれる。
実行ファイルを解析して継承関係などを調べているようだが、クラス図やコールグラフの自動生成は行なわない。

開発中のドキュメントとして使用する場合、Doxygenを使用したほうが使いやすそうだ。
[PR]
by mima_ita | 2013-09-19 21:26 | .NET
JQCloudを用いたTwitterの解析
JQTagCloudを用いるとタグクラウドの表現が楽。

以下はTwitterのつぶやきをタグクラウド化したもの
b0232065_1163899.png

http://needtec.sakura.ne.jp/serif/main.py?TwitterTagCloud

More
[PR]
by mima_ita | 2013-09-19 01:24 | 実験
Cygwin + gccの文字コードについて
Cygwinのgccを使用する際の文字コードについて説明する。

CP932のソースファイルをコンパイルする際は--input-charsetオプションを使用する

test.cがcp932で保存してある

gcc --input-charset=cp932 test.c


実行時の文字コードを変更する場合は--exec-charsetオプションを使用する
具体的な例を示す

unsigned char *s ="あ";
printf("%02x ", *s);
printf("%02x ", *(s+1));
printf("%02x \n", *(s+2));


exec-charsetを使用しないでコンパイルした場合以下のようになる。

e3 81 82


これはデフォルトのUTF-8の文字コードをあらわす
ではexec-charsetを使用してみよう。


gcc --input-charset=cp932 --exec-charset=cp932 test.c


この場合、CP932の文字コードとなる。

82 a0 00


コマンドライン引数のエンコード
環境変数のLANGが適切に指定されていないと、コマンドライン引数を正常に取得できない場合がある。
たとえばCygwinのgccで作成したアプリケーションがあったとする

これをコマンドプロンプトで以下のように実行したとしよう

a.exe "ああああ"


コマンドライン引数である、argv[1]の値はああああとならなければならない。
しかし、実際には"ああああ"となってしまう。
ほんらい排除されるダブルクォーテーションが混ざってしまうのだ。

これはコマンドライン引数が正常に解析できていないため発生する。

これを回避するにはLANGの環境変数を指定する必要がある。

set LANG=ja_JP.cp932


本来Windowsの環境変数は大文字小文字は関係ない。
しかし、Cygwinのgccでコンパイルしタ場合、LANGはすべて大文字でなければならない。
[PR]
by mima_ita | 2013-09-19 01:02
C# で外部プロセスを起動するときの注意。
・コマンドライン引数の文字コードは変更できない。
 たとえば、UTF-8をコマンドライン引数に受け取るプログラムを起動しようとした場合、正確に動作しない。
 

・起動するプロセスの環境変数を設定できる。ただしそれは全て小文字である。
 StartInfo.EnvironmentVariablesは環境変数をしていできる。
 しかしこれはStringDirectoryクラスであり、キーとなる環境変数は全て小文字になる。

 Windowsの環境変数は大文字、小文字を区別しないため、.NETフレームワーク同士のプロセスを起動するには問題にならない。
 しかし、Cygwinなどで作成したプロセスを起動使用とした場合、大文字の環境変数が絶対に渡せなくなることになる。
 なお、回避する方法として、以下のようなバッチファイルを作成してそれを実行することにした。

 参考:環境変数を指定して同じディレクトリのrcs.exeを起動するバッチファイル
 
@echo off
SET LANG=ja_JP.cp932
%~dp0\rcs.exe %*

[PR]
by mima_ita | 2013-09-19 00:34 | .NET



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ