ホーム » メモ (ページ 17)
「メモ」カテゴリーアーカイブ
VC 6 Release inline
次の様な呼出しで,Release ビルドでうまく動作しないことがあった.
…\PntFnc\TCrossL\TCrossLD.cpp 2 円の交点のエラー時の動作
Vd2 cp1 = ::get_point_on_line (l1c,l2c,l1r) ;
デバッグ版では意図した動作となる.
inline Vd2 get_point_on_line ( const Vd2& ls, const Vd2& le, const double d )
{
if (ls == le) { return ls ; }
Vd2 unit = (le-ls).Normalized() ;
Vd2 pos = ls + unit * d ;
return pos ;
}
ls と le を比較している部分で抜けてしまっている?
VC 7 では OK.
よくわからないので,間接的に呼出す様に変更.
inline Vd2 get_point_on_line(const Vd2& ls,const Vd2& le,const double d) { return get_point_on_line_(ls,le,d); }
内積で誤差?
以前書いたコードで次の様にしていた.
デバッグ版では単位ベクトルにすると誤差が大きい様に感じたが,リリース版ではそれ程でもない?
double Naiseki (const P3& p1,const P3& p2) { // → → → → // a・b=|a||b|cosθ // a.x*b.x+a.y*b.y+a.z*b.z=sqrt(ax*ax+ay*ay+az*az)*sqrt(bx*bx+by*by+bz*bz)*cosθ // ... a,bのベクトルが単位ベクトルの時 // sqrt(ax...) と sqrt(bx...) は 1 // a.x*b.x+a.y*b.y+a.z*b.z=1*1*cosθ // a.x*b.x+a.y*b.y+a.z*b.z=cosθ // → → // a・b=ax*bx+ay*by+az*bz P3 p1u = p1.Uni() ; P3 p2u = p2.Uni() ; // return (p1u.x*p2u.x+p1u.y*p2u.y+p1u.z*p2u.z) ; // 誤差の補正 double dp = p1u.x*p2u.x+p1u.y*p2u.y+p1u.z*p2u.z ; if (dp<-1 || 1<dp) { if (dp < -1.) { dp = -1. ; } if (dp > 1.) { dp = 1. ; } } return dp ; } P3 Gaiseki (const P3& p1,const P3& p2) { // → → → → // a×b=|a||b|sinθ・c // → → // a×b=(ay*bz-az*by,az*bx-ax*bz,ax*by-ay*bx) P3 pt ; pt.x = p1.y * p2.z - p1.z * p2.y ; pt.y = p1.z * p2.x - p1.x * p2.z ; pt.z = p1.x * p2.y - p1.y * p2.x ; return pt ; }
WD Cloud に Joomla
WD Cloud に Joomla を追加しようとして,データベースの設定でつまずいていた.
ユーザ名がわからず,検索していたら phpMyAdmin を設定すればよさそうとわかった(pdf の 150 ページ辺り).
これで,ユーザ名に admin を指定して設定できた.
Win 10 10586
ドロップダウン付のツールバーで,ボタンが切れる現象は直った?
VS 2005 で作成した「Web セットアップ プロジェクト」のインストールはまだできない?
2015/12/10
ドロップダウン付のツールバーのサイズが正しくない現象が XP でも発生.
初期の Win 10 で現象が発生しやすかったことは確かだが,もっと他にも条件がありそう.
MFC 8 やフラットかどうかなど.
XP で発生した時,MFC 6 の exe は問題なかった.
いつも使用している環境では,フラットにしていないことが多い.
vector -> tstring
以前 MFC を使用した StringArrayToString を変更したが,今回は STL 版.
tstring String_Join (const std::vector<tstring>& srcAry,LPCTSTR sp)
{
tstring str ;
for (size_t index= 0 ; index<srcAry.size() ; index++) {
str += srcAry[index] ;
if (index+1 == srcAry.size()) { continue ; }
str += sp ;
}
return str ;
}
MFC 版は VC 6 までだったが,STL 版では VC 7 も遅い.
tstring String_Join (const std::vector<tstring>& srcAry,LPCTSTR sp)
{
tstring str ;
v_tstring tmpSA ;
tstring tmpStr ;
for (size_t index= 0 ; index<srcAry.size() ; index++) {
tmpStr += srcAry[index] ;
if (index+1 == srcAry.size()) { continue ; }
if ((index%128) == 100) {
tmpSA.push_back(tmpStr) ;
tmpStr.erase() ;
continue ;
}
tmpStr += sp ;
}
if (!tmpStr.empty()) {
tmpSA.push_back(tmpStr) ;
}
if (tmpSA.size() > 1) {
str = ::String_Join(tmpSA,sp) ;
}
else if (tmpSA.size() == 1) {
str = tmpSA[0] ;
}
return str ;
}
Shell Extension のデバッグ
Shell Extension で,縮小版の背景に GDI+ を使用して,どうも動作が安定しなくなった.
現象としては,環境によるが explorer.exe が「応答なし」に.
GDI+ の GdiplusShutdown の呼び方が悪かったみたいで,DllCanUnloadNow で終わらせる様にした.
また,今回デバッグ用にダンプする様にしていて,そのファイルをエクスプローラで選択しようとするとフリーズ.
これは,デフォルトでは出力しないことで回避.
今回これらをやっていて,以前から面倒と思っていた ShellExt.dll のデバッグ.
デバッグ版.dll が呼ばれる様に設定して,普通の exe で「開く」ダイアログで dll 内をデバッグできる.
VC include lib のパス
VC 6
HKCU\Software\Microsoft\DevStudio\6.0\Build System\Components\Platforms\Win32 (x86)\Directories
VC 7 , 7.1 , 8 , 9
C:\Users\Iwao\AppData\Local\Microsoft\VisualStudio\…\VCComponents.dat
VC 10 , 11 , 12
C:\Users\Iwao\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp. … .user.props
フォルダ以下の同期
先日追加した WD Cloud にソースなどをバックアップしたいと思い探していたら,robocopy.exe を見つけた.
まだ,単純にバックアップをとっているだけ.
robocopy \\DevXP\C_Drive\Temp\ \\WDCloud\Backup\Develop\DevXP\Temp\ /mir
UNICODE のフォルダやファイル名も,コピー中の表示は ‘?’ となるが問題なさそう.
GUI 版の RichCopy があるみたいだが,こっちはまだ未確認.
FTP もいける?
Win 8.1 –> Win 10 ?
勝手に Win 8 から 8.1 に更新された仮想マシン.
VirtualBox が 4.3.30 だったので,5.0.8 に.
しかし,変わらず.
「Win10_Japanese_x32.iso」を使用してインストールしてみた.
* すぐ上の Win 10 ダウンロードのリンク先は,利用 OS ? により異なる様です.この記事は mac を想定しています.
何とか環境を引継ぎインストールできたみたい.
うまく起動しない…
「知人から譲り受けた Win 7 のノート PC の起動が遅い」と言うことで調べてみると,
確かに,起動時のロゴが出て HDD のランプが点きっぱなし,1 時間程そのままにしておいたら起動していた.
怪しいのは HDD .
イベントビューアで確認しようとしたが,起動はするがデータが開けない.
ChkDsk で修復すると,
起動は通常の時間になったと思うが,動作が安定しない.
リカバリメディアの作成
PCG-71712N で実際必要だったメディア数は DVD で 5 枚,DL で 2 枚となっていた.
VPCCB38FJ が正しいモデル名?
ずっと PC についてはいなかったが,それぞれ 20 ~ 30 分程度.
4 枚目が少しかかっていたように思う.HDD の不良セクタの影響?
先ず,リカバリ領域からのリカバリ.2 時間程度.
ちょっと拝借,AP をインストールして今日ビルドした exe をテスト.
今度はリカバリメディアの DVD から
読込?に 1 時間程度(ディスク 5 枚).
さらに 2 時間弱.
Window Update で,170 個程を 6 時間位.
~iwao.n にアップしたものが動かない
//DevXP/Test/T_bxSldr/ を ~iwao.n/T_bxSldr にアップしたら動かない.
js の参照の関係とは思っていたが,少し時間がかかったのでメモ.
js を参照している部分のファイル名に大文字が混在していた.
WD Cloud を使ってみて…
いろいろなサイズのファイルのバックアップを取っていて,
VHD など大きなファイルのコピーで,ローカルの外付け HDD (USB 2 接続)より速そう.
それで簡単に計測してみた.
3 GB のファイルをコピー.
C , D は内蔵 HD .H は USB 2 接続.S は WSS .W は WD Cloud .
秒 | MB/s | |
---|---|---|
C->C | 583 | 5 |
C->D | 573 | 5 |
C->H | 384 | 8 |
C->S | 381 | 8 |
C->W | 389 | 8 |
H->C | 161 | 19 |
H->D | 111 | 29 |
H->S | 109 | 29 |
H->W | 110 | 29 |
S->D | 46 | 70 |
S->H | 133 | 30 |
W->D | 60 | 55 |
W->H | 134 | 30 |
動作を見ていると,内蔵 HDD からの読込で最初のうちは速いがある所を過ぎると 5 MB/s 程度に落ちてしまう.
NAS から内蔵 HDD の時も同様.ファイルサイズが 500 MB 程度なら速いと思う.
上と同じ条件のすべてでは計測はしてないが,10 秒以内.
2015/10/29
ソースなどをバックアップしていて,
時々,コピーが完了する前に何もなかったかの様に終わってしまう.
プロジェクトのバックアップの時は,1 プロジェクトだけコピーして終わっていた.
熱のせい?少し間を置くとコピーできる.すぐだと操作を間違えたかの様.
WD Cloud 追加
スマートフォンと PC のバックアップに使えそうだったので購入.
ユーザーマニュアルを見ながら進めていて,
セットアップアシスタントでの設定の最後の方でエラー?に.
メールアドレスの入力で何か間違えたみたい?
もう一度やり直そうとしても,「このドライブは既にセットアップ済みです」となる.
そのすぐ下のリンクをクリックしてもパスワードが入らず進められない.
結局は,「デバイスの設定に移動」で //wdcloud にアクセスする様になるが,この時のパスワードが違っていた.
「ユーザー」はいつものでパスワードもいつものを入れたつもりが,うまく登録されていなくて空の状態だった.
「ファイルに移動」の方は,上にも書いたが設定されてなかった.
ここでの入力は,メールアドレスとパスワードで,Web 経由の WD Cloud へのアクセスになるみたい.
最初から wdcloud にアクセスする方がわかりやすい様に感じた.
107SH と iPod touch に「WD Cloud モバイルアプリ」をインストール.
Android 版では思った様にバックアップできたが,iOS 版ではバックアップがうまくされてない.
Win 10 IE , Edge
Win 10 の IE や Edge からの User agent を調べていて,
Edge は “Edge/12.10240” が後ろの方にあるのでこれで判断できる.
他に AppleWebKit Chrome Safari などが前にあるので,Edge と限定するためにはコードの変更(判断順の変更)が必要.
IE では “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Trident/8.0; .NET4.0C; .NET4.0E)” となっている.
イントラネット環境で IE 11 とするには,「互換表示設定」の変更が必要.
Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko
MSDN ユーザー エージェント文字列の変更
Win 10 での デスクトップ AP の実行で,
ドロップダウン付のツールバーの表示がおかしくなる現象は,まだ残っているみたい.
ただ,以前の様に簡単には現象を再現できない.
タスクトレイのチップが 64 …
XP 環境で,タスクトレイのチップが 64 文字で切れてしまっている.
VC8.exe は 64 で切られることはないが,VC 9 以降だとうまくない?
Win 7 環境での動作は問題ない.
まだ詳しく調べられてないが,とりあえずメモ.
2015/09/08
どうも _WIN32_WINNT によるみたい.
Win | UNICODE | MBCS | NOTIFYICONDATA | |
VC 6 | 400 | 152 | 88 | szTip[64] |
VC 7 | 501 | 936 | 488 | dwInfoFlag |
VC 8 | 502 | 936 | 488 | |
VC 9 | 600 | 956 | 508 | hBallonIcon |
VC10 | 601 | 956 | 508 | |
VC11 | 601 | 956 | 508 | |
VC12 | 601 | 956 |
Win は _WIN32_WINNT .
cbSize を NOTYFYICONDATA_V3_SIZE と指定すれば良いのか?
今回は,意図せず 64 文字で切れていたことを避けたかっただけなので,次の様に変更.
NOTIFYICONDATA nid ; ::ZeroMemory(&nid,sizeof(NOTIFYICONDATA)) ;
long maxLenTip = countof(nid.szTip)-1 ;
#if (_MSC_VER >= 1500) // VC 9 ~
if (::GetWindowsVersion() < 6) {
maxLenTip = 64-1 ;
}
#endif
if (::GetWindowsVersion() > maxLenTip) {
…
}
NotifyIcon クラスの使用
ダイアログまたは相当のクラスのヘッダに,NotifyIcon の変数を確保.
タスクトレイにアイコンを表示したい時は,NotifyIcon::Add または Mod を呼出す.
タスクトレイのアイコンを消したい時は,NotifyIcon::Del .
アニメーションの場合,NotifyIcon::StartAnimate とタイマで NotifyIcon::AnimateIcon .
アニメーションアイコンの登録は,NotifyIcon::AddIconA .登録されてない場合は,exe のアイコンと表示なしのトグル.
CAppDlg::OnInitDailog で StartAnimate ,CAppDlg::OnTimer で AnimateIcon だけで,exe アイコンが点滅する.
チップの設定は,NotifyIcon::SetTip .
最小化されたときに表示
void CXxxxDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
::FitWindow(this,&m_Image,0) ;
if (nType == SIZE_MINIMIZED) {
ShowWindow(SW_HIDE) ;
NotifyI.Mod() ;
}
}
ヘッダとソースへの MESSAGE MAP の追加
afx_msg LRESULT OnTrayCallback (WPARAM wParam,LPARAM lParam);
ON_MESSAGE (WM_TRAY_CALLBACK, OnTrayCallback)
マウスのクリックによる動作
LRESULT CXxxxDlg::OnTrayCallback (WPARAM wParam,LPARAM lParam)
{
UINT uID = (UINT)wParam;
UINT uMouseMsg = (UINT)lParam;
if (uMouseMsg == WM_LBUTTONDOWN) {
AfxGetMainWnd()->ShowWindow(SW_SHOW) ;
AfxGetMainWnd()->ShowWindow(SW_SHOWNORMAL) ;
}
if (uMouseMsg == WM_RBUTTONUP) {
CPoint curPos ; ::GetCursorPos(&curPos) ;
PopupMenu (NULL,IDR_POP_MENU,curPos,ID_XXXX) ;
}
return 0 ;
}
WM_TRAY_CALLBACK は,NotifyI.hxx に定義済.
2015/09/03
メニュー表示後,デスクトップなどのクリックでメニューが消えなかったので検索すると,
SetForegroundWindow を呼べば良いとのこと.
if (uMouseMsg == WM_RBUTTONUP) {
CPoint curPos ; ::GetCursorPos(&curPos) ;
SetForegroundWindow() ;
PopupMenu (NULL,IDR_POP_MENU,curPos,ID_XXXX) ;
}
メモリのオーバーフロー
次の様なコードで,実行時にエラー.
i_DIB DIB_FlipVertical (const i_DIB& dib_)
{
i_DIB dib = dib_ ;
if (dib_.GetWidth () == 0) { return dib ; }
if (dib_.GetHeight() == 0) { return dib ; }
u_32* bits = (u_32*)dib.GetP_Bits() ;
for ( int y=0 ; y<dib.GetHeight()/2 ; y++) {
for (int x=0 ; x<dib.GetWidth() ; x++) {
u_32 sPos = x+dib.GetWidth()*( y) ;
u_32 dPos = x+dib.GetWidth()*(dib.GetHeight()- y) ;
u_32 tmp = *(bits+(dPos)) ;
*(bits+(dPos)) = *(bits+(sPos)) ;
*(bits+(sPos)) = tmp ;
}
}
return dib ;
}
原因は最初の dPos が画像の範囲を超えていること.これはすぐにわかったが,
デバッガで追いかけてもこのループは何もなかったかの様に通り,この関数を抜ける時にエラーとなる.
たまたまと言うこともあると思うが,MFC の配列を使用していればアクセスした段階で ASSERT されるのでは?
i_dib_f.hxx
error LNK2005 LNK2001
プロジェクト生成時に「MFC を使用しない」としたコンソール AP で Afx.h をインクルードした場合
リンク中…
nafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) はすでに LIBCD.lib(new.obj) で定義されています
nafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) はすでに LIBCD.lib(dbgdel.obj) で定義されています
や
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル “__endthreadex” は未解決です
nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル “__beginthreadex” は未解決です
プロジェクトの設定で「共有 DLL で MFC を使う」などに変更.
ファイル数
あるフォルダに,ユーザが作成した 3D データを,自動でファイル名を振って保存する様にしている.
但しファイル名の一部はユーザ指定.
ロジック上は,36^4 で 1,679,616 管理できるはず.
これがいっぱいになったと言われて…
通常の運用であれば,1 日に 100 個はかなりきつい.
それでも 16,000 日かかる.
そんなことがあり,ファイル名の空きを検出するツールを作成中.
かなり前の事だが,iRMX の FD のフォーマット?で,指定しないと 200 個位がデフォルトだったと記憶している.
NTFS ではその様なことはないと思ってたが,はっきりした情報があったのでメモ.
TechNet – ファイル システム