<   2013年 05月 ( 3 )   > この月の画像一覧
UTF8を表示するコマンドプロンプトを作ってみた
■目的
WindowsでPythonとかを使っているとUTF8の文字が化けて出力されて厳しいので、コマンドプロンプトの出力をUTF8に変換するコマンドプロンプトもどきをつくってみた。

ばけちゃっている日本語が・・・
b0232065_14551822.png


ちゃんと表示されるよ、ジョニー!
b0232065_14572678.png

上のほうのテキストボックスにコマンドプロンプトに発行したい命令を入力してEnterキーを押すと結果がかえってくる。

■ダウンロード
http://needtec.sakura.ne.jp/testprog/Utf8Cmd.zip
 Windows7 64bitの32bitアプリケーションで動作確認

■制限
 ・標準出力とエラー出力をUTF8にしているだけだから、普通のコマンドプロンプトで表示される日本語はばける
 ・標準入力をUTF8でやるのはむりでした。

■別解
 「コマンドプロンプト と UTF8」FineView Software Labs様より

More
[PR]
by mima_ita | 2013-05-30 15:13 | .NET
ExcelVBAのDoxygen出力
■目的
ExcelVBAのコードをDoxygenの文章として出力します

2014/07/04 以下に引っ越しました。
http://qiita.com/mima_ita/items/635d57cc277254900c6a

■前提条件
・マクロのセキュリティで [Visual Basic プロジェクトへのアクセスを信頼する]にチェックを付与する
Doxygenをインストールしてある

■仕組み
b0232065_3103513.png


ExcelからVBScriptを使用してCLSファイルとBASファイルを出力します。
この時、マクロのセキュリティで [Visual Basic プロジェクトへのアクセスを信頼する]にチェックを付与する必要があります

次にDoxygenファイルとVBFilterを利用してDoxygenを動作させます。
この過程でBASファイルやCLSファイルはC++のコードに変換されます。
VBFilterでは関数の中までは変換していないので、本来Doxygenで作成される関数のコールグラフなどは作成できません。
このことはデッドコードの検出には使用できないということを意味します。

作成したC++を元にHTMLを作成します。

VBFilterにはいくつか種類が存在しますが、今回は下記のものを使用しました
「だらろぐ」様 vbfilter.pyを改造してみた
http://r-satsuki.air-nifty.com/blog/2008/02/vbfilter_61f1.html


b0232065_3253581.png


■使い方
1.下記のファイルをダウンロードして任意のフォルダに展開してください
http://needtec.sakura.ne.jp/vba/VbaDoxygen.zip

2.ExcelVBADoxygenを実行することでDoxygen文章を作成します
第一引数:Excelのパス
第二引数:出力フォルダ
第三引数:doxygen.exeへのフルパス

例:
ExcelVBADoxygen "C:\dev\VbaDoxygen\Sample.xlsm" "C:\dev\VbaDoxygen\output" "C:\Program Files\doxygen\bin\doxygen.exe"

■ファイルの説明
Sample.xlsm テスト出力用のエクセルファイルです
output テスト出力の結果が格納されています
python27.dll     VBFilter.exeを動かすのに必要
w9xpopen.exe   VBFilter.exeを動かすのに必要
vbfilter.exe      VBFilter.pyをpy2exeでExe化したものです。
[PR]
by mima_ita | 2013-05-16 03:26 | VBA
VBAのIntやFixはバグっているのか?
Double型のデータをIntやFixで切り捨てた場合に誤差がでる
浮動小数点なので当然誤差はでるのであるが、次の例を見てみよう

イミデイトウィンドウで下記を実行してください。
?Fix(0.6# * 10 )
5
?Fix(CDbl(0.6# * 10))
6

誤差がでるのはいいとして、CDblで明示的に型変換をした場合としない場合で切捨て方法が異なる場合がある。
再現環境
 Office2010 32bit
 Windows7 64biy
 CPU Intel(R) Core(TM) i5 CPU M450 2.4GHz

これをVBAのバグという人がいるが、バグではなく、仕様だと思われる。

この原因だが、計算途中の浮動小数点の精度とDouble型の精度に違いがあるために発生する
浮動小数点の演算の途中経過が64ビットの仮数を持つ80ビットのレジスタで計算しているが、Dobule型は53ビットの仮数を持つ64bitの浮動小数点なのだ。

VB.NETとVB6やVBAで同じプログラムで浮動小数点の計算結果が異なるってのもこれが関係している。

計算途中の浮動小数点の精度は少なくともVBAからは設定も確認もできない。
だが、VC++ではリンクの設定や、コードでこの制御が可能になっている。
あるアプリケーションの現在のスレッドの浮動小数点の計算精度の_controlfp_sの関数を実行して調べることができる。
なお、VC++のデフォルでは、_MCW_PCの_PC_53がたっている状態であり、53ビットの仮数を持つ64bitの浮動小数点になっている。


VBA単独で計算途中の精度を確認する方法存在しない。しかし、DLL経由で_controlfp_sを実行することで、確認することができる。
この関数で取得した浮動小数点制御ワードの_MCW_PC (精度制御) 0x00030000 をみて、 _PC_53 (53 ビット) 0x00010000か、_PC_64 (64 ビット) 0x00000000 かしらべればいい。


以下のようなコードのVBADllが存在したとしよう。

#include <windows.h>
#include <float.h>
int __stdcall GetControlFP()
{
int err,sts;
err=_controlfp_s(&sts,0,0 );
return sts;
}
int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved)
{
return TRUE;
}


なお、VisualStdio2008SP1 で32bitでコンパイルした結果を下記に置く。
http://needtec.sakura.ne.jp/vba/checkfloat/VBADll.zip


もし、64bitのVBAを使用している場合、64bitでビルドして64bitのDLLを作成する必要がある。

VBA側のコードは次のようになる。

Option Explicit
' パスを修正すること
Declare Function GetControlFP Lib "C:\Users\xxxxx\Documents\Visual Studio 2008\Projects\VBADll\Release\VBADll.dll" () As Long

Public Sub TestCon()
'
' _MCW_PC (精度制御) 0x00030000
'
' _PC_24 (24 ビット) 0x00020000
' _PC_53 (53 ビット) 0x00010000
' _PC_64 (64 ビット) 0x00000000
Msgbox hex$(GetControlFP())
End Sub


ダウンロード
http://needtec.sakura.ne.jp/vba/checkfloat/CheckFloat.xlsm

上記の検証環境では「C001F」と表示されている。これは_PC_64ビットであり、浮動小数点の演算の途中経過が64ビットの仮数を持つ80ビットのレジスタで計算していることになる。
なお、これは参照しているCOMやDLLなどにより変更される可能性があるので、全ての環境で同じになるものではない。
たとえば、Jetを使うと途中の精度がかわったりするバグがあったりもした。
http://support.microsoft.com/kb/308702/ja




・・・そもそもIntやFixをやるときに浮動小数点を使用すれば誤差が出て当然なのでCDecや通貨型を使用すべき。


参考:
http://hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=3276&page=0#3276
[PR]
by mima_ita | 2013-05-15 18:20 | VBA



実験ですお
検索
カテゴリ
最新の記事
.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
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ