ShowWindow SW_HIDE SW_SHOW
ダイアログに「ピクチャーコントロール」を追加して,それの再描画.
以前よくやっていた方法.
void CFOutLineDlg::OnHeight()
{
if (m_CountSpin.m_hWnd == NULL) { return ; }
UpdateData(TRUE) ;
InvalidateRect(NULL) ;
}
これだと描画対象以外のコントロールも再描画するのでちらついてしまう.
一度 ShowWindow で SW_HIDE して SW_SHOW することで,対象がコントロールだけになる.
void CFOutLineDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_CountSpin.m_hWnd == NULL) { return ; }
::FitWindow(this,&m_Image,5,TRUE,FALSE) ;
m_Image.ShowWindow(SW_HIDE) ;
m_Image.ShowWindow(SW_SHOW) ;
}
error C2061 , C2091 , C2809 , C2556
1997/06 に作成したプロジェクトをビルドすると…
--------------------Configuration: FontFam - Win32 Release--------------------
FontFam.exe - 0 error(s), 0 warning(s)
--------------------Configuration: FontFam - Win32 Debug--------------------
Compiling...
FontFDlg.cpp
c:\program files (x86)\microsoft visual studio\vc98\include\new(35) : error C2061: syntax error : identifier 'THIS_FILE'
c:\program files (x86)\microsoft visual studio\vc98\include\new(35) : error C2091: function returns function
c:\program files (x86)\microsoft visual studio\vc98\include\new(35) : error C2809: 'operator new' has no formal parameters
c:\program files (x86)\microsoft visual studio\vc98\include\new(36) : error C2061: syntax error : identifier 'THIS_FILE'
c:\program files (x86)\microsoft visual studio\vc98\include\new(37) : error C2091: function returns function
c:\program files (x86)\microsoft visual studio\vc98\include\new(37) : error C2556: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,const struct std::nothrow_t &)' : overloaded function differs only by return type from 'void *(__cdecl *__cd
ecl operator new(void))(unsigned int)'
c:\program files (x86)\microsoft visual studio\vc98\include\new(35) : see declaration of 'new'
c:\program files (x86)\microsoft visual studio\vc98\include\new(41) : error C2061: syntax error : identifier 'THIS_FILE'
c:\program files (x86)\microsoft visual studio\vc98\include\new(42) : error C2091: function returns function
c:\program files (x86)\microsoft visual studio\vc98\include\new(42) : error C2556: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,void *)' : overloaded function differs only by return type from 'void *(__cdecl *__cdecl operator new(void))
(unsigned int)'
c:\program files (x86)\microsoft visual studio\vc98\include\new(35) : see declaration of 'new'
c:\program files (x86)\microsoft visual studio\vc98\include\new(42) : error C2809: 'operator new' has no formal parameters
c:\program files (x86)\microsoft visual studio\vc98\include\new(42) : error C2065: '_P' : undeclared identifier
Error executing cl.exe.
FontFam.exe - 11 error(s), 0 warning(s)
以前は <memory> の インクルードを追加 することで対応していた.
原因は,幾つかのインクルードが次のコードより後に存在しているため?
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
GetGlyphOutline ポリゴン化
まだまだだが…
文字ごとのポリラインを取得できる様になったので,穴の処理と組み合わせてポリゴン化.
文字によっては,穴の処理でクロスしてしまうことがある.
https://itl.mish.work/Iwao/Doc/algo/div_cnvx/div_23_4.html
https://itl.mish.work/Iwao/Doc/algo/div_cnvx/div_23_5.html
GetGlyphOutline ポリラインの配列に
「MS ゴシック」と「MS Pゴシック」などの幅が,思っていたものと違った.
v_PLF TTPOLYGON_to (LPTTPOLYGONHEADER buf,const DWORD rSize)
{
vv_LQC vv_lqc = ::to_LQC(buf,rSize) ; // buf を座標の配列に
v_PLF v_plf = ::LQC_to(vv_lqc) ; // ポリラインに変換
return v_plf ;
}
v_PLF GetTTOutline (HDC hDC,const UINT chr,GLYPHMETRICS* gm,const UINT format=GGO_NATIVE)
{
v_PLF v_plf ;
{
MAT2 mat2 = { {0, 1}, {0, 0}, {0, 0}, {0, 1} } ;
DWORD dwSize = ::GetGlyphOutline(hDC,chr, format, gm, 0, NULL, &mat2 ) ;
if (dwSize != GDI_ERROR) {
v_char buffer(dwSize) ;
GLYPHMETRICS gm2 = { 0 } ;
::GetGlyphOutline(hDC, chr, format, &gm2, buffer.size(), &buffer[0], &mat2) ;
v_plf = TTPOLYGON_to((LPTTPOLYGONHEADER)&buffer[0],dwSize) ;
}
}
return v_plf ;
}
vv_PLF GetTTOutline (HDC hDC,LPCTSTR str,const bool tate,const UINT format=GGO_NATIVE)
{
vv_PLF vv_plf ;
double lastX = 0 ; // left
double lastY = 0 ; // top tate
int ch = 0 ;
int cw = 0 ;
{ // chracter size
TEXTMETRIC tm = { 0 } ;
::GetTextMetrics(hDC,&tm) ;
ch = tm.tmHeight ;
cw = tm.tmAveCharWidth ;
}
#ifdef _UNICODE
LPCTSTR strP = str ;
#else
unsigned char* strP = (unsigned char*)str ;
#endif
for (size_t mbCount=0 ; mbCount<_tcsclen(str) && *strP!='\0' ; mbCount++) {
UINT chr = 0 ;
#ifdef _UNICODE
{
chr = UINT(*strP) ;
strP++ ;
}
#else
{
chr = _mbsnextc(strP) ;
strP= _mbsinc(strP) ;
}
#endif
if (chr == _T('\r')) { lastX = 0 ; continue ; }
if (chr == _T('\n')) { lastY-= ch ; continue ; }
if (chr == _T('\t')) { lastX+= cw ; continue ; }
{
GLYPHMETRICS gm = { 0 } ;
v_PLF v_plf = ::GetTTOutline(hDC,chr,&gm,format) ;
if (tate) { lastY -= (double(gm.gmBlackBoxY)+gm.gmCellIncX)/2 ; }
else { }
Vd2 last(lastX,lastY) ;
for (size_t index=0 ; index<v_plf.size() ; index++) {
PLF plf = v_plf[index] ;
Vd2A v2a = ::V2_Translate(::ToVd2A(::ToVd3A(plf)),last) ;
v_plf[index] = PLF(PLF::line,::ToVd4A(::ToVd3A(v2a))) ;
}
vv_plf.push_back(v_plf) ;
if (tate) { }
else { lastX += gm.gmCellIncX ; }
}
}
return vv_plf ;
}
Q243285 の動作の確認
先日からやっている GetGlyphOutline .その Q243285 の動作を確認方法.
Q243285: HOWTO: Draw TrueType Glyph Outlines
その中の ::DrawT2Outline の動作を確認しようとコンソール AP でやってみたが,うまく表示されない.
コードを見ればわかるが,::PolyBezier に与えられている pt の y がマイナスの範囲になっている.
以前書いたコードで emf に出力するものがある.また,それの HWND への再生も.
それで,HDC に対して直接出力するのではなく,一度 emf に出力して,それを表示することに.
#include <clocale>
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "Q243285.hxx"
#include "con_wnd.hxx"
#include "E_MF.hxx"
LOGFONT GetLogFont(
LPCTSTR faceName
, const bool tate
, const int ch
, const int cw = 0
, const double rx = 0
, const double ry = 0
, const int weight = FW_DONTCARE
)
{
LOGFONT lf = { 0 } ;
::GetObject(::GetStockObject(SYSTEM_FONT),sizeof(lf),&lf) ;
if (tate) { lf.lfHeight = (cw!=0)?cw:ch ; lf.lfWidth = ch/2 ; }
else { lf.lfHeight = ch ; lf.lfWidth = cw ; }
if (tate) { lf.lfEscapement = int((rx+ry-90)*10) ; lf.lfOrientation= int((ry-90)*10) ; }
else { lf.lfEscapement = int(rx*10) ; lf.lfOrientation= int(ry*10) ; }
lf.lfWeight = weight ;
::TcsCpy(lf.lfFaceName,LF_FACESIZE,tstring(faceName).substr(0,LF_FACESIZE-1).c_str()) ;
return lf ;
}
tstring Get_TMP_path (void)
{
tstring tmp_path ;
size_t size = MAX_PATH ;
tmp_path.resize(size,0) ;
::GetTempPath(DWORD(size),&tmp_path[0]) ;
tmp_path = tstring(tmp_path.c_str()) ;
return tmp_path ;
}
bool DrawOutline(HDC hDC,int xStart,int yStart,LPCTSTR str)
{
#ifdef _UNICODE
LPCTSTR strP = str ;
#else
unsigned char* strP = (unsigned char*)str ;
#endif
// tstring tmp_path = ::Get_i_Tools_tmp_date() ;
tstring tmp_path = ::Get_TMP_path() ;
tstring emf_name ;
for (size_t mbCount=0 ; mbCount<_tcsclen(str) && *strP!='\0' ; mbCount++) {
UINT chr = 0 ;
#ifdef _UNICODE
{
chr = UINT(*strP) ;
strP++ ;
}
#else
{
chr = _mbsnextc(strP) ;
strP = _mbsinc(strP) ;
}
#endif
{
tstring tcs ;
{
if (chr < 0xff) {
tcs += TCHAR(chr) ;
}
else {
tstring buf ; buf.resize(255,0) ;
::_itot(chr,&buf[0],16) ;
tcs = buf.c_str() ;
}
std::tout << tcs << std::endl ;
}
{
emf_name = tmp_path + tcs + _T(".emf") ;
}
}
{
E_MetaF em(emf_name.c_str()) ;
HDC eDC = em.Get_HDC() ;
{
MAT2 mat2 = { {0, 1}, {0, 0}, {0, 0}, {0, 1} };
GLYPHMETRICS gm = { 0 };
DWORD dwSize = ::GetGlyphOutline(hDC,chr, GGO_NATIVE, &gm, 0, NULL, &mat2);
if (dwSize != GDI_ERROR) {
std::vector<char> buffer(dwSize);
GLYPHMETRICS gm2 = { 0 };
::GetGlyphOutline(hDC, chr, GGO_NATIVE, &gm2, buffer.size(), &buffer[0], &mat2);
::DrawT2Outline (eDC,(LPTTPOLYGONHEADER)&buffer[0],dwSize) ;
}
}
}
{
E_MetaF::Play(::GetConsoleHwnd(),emf_name.c_str()) ;
}
}
::TextOut(hDC,xStart,yStart+150,str,_tcslen(str)) ;
return true ;
}
bool test (c_tstring& str)
{
std::terr << str << std::endl ;
{
HWND hWnd = ::GetConsoleHwnd () ;
{
HDC hDC = ::GetDC(hWnd) ;
{
#define face_A _T("Arial")
#define face_M _T("Meiryo UI")
#define face_W _T("Wingdings")
LOGFONT lf = ::GetLogFont(face_M,false,100) ;
HFONT hFont = ::CreateFontIndirect(&lf) ;
HFONT oFont = (HFONT)::SelectObject(hDC,hFont) ;
::DrawOutline(hDC,200,200,str.c_str()) ;
::SelectObject(hDC,oFont) ;
::DeleteObject(hFont) ;
}
::ReleaseDC(hWnd,hDC) ;
}
}
return true ;
}
GetGlyphOutline TTPOLYCURVE
TTPOLYCURVE の TT_PRIM_LINE と TT_PRIM_QSPLINE は昨日までのコードでできそう.
TT_PRIM_CSPLINE についてもコードはわかりそうだが,実際のデータがちょっとわからない.
Q243285 の ::DrawT2Outline では,処理はしていないみたい.
::MakeBezierFromQBSpline では Quadratic から Cubic にしている.
12: 2次ベジェ曲線を3次に変換する方法
2次ベジェ曲線から3次ベジェ曲線への変換
今まで使っていたコードの TT_PRIM_CSPLINE 部分も同様で,特に問題はなかったようにも思う.
曲線の種類と Vd2A(2D の double の配列)を持つ「LQC クラス」を用意するか.
その配列 v_LQC が 1つの TTPOLYGONHEADER となる?
‘1’,’2′,’3′ などは 1つの TTPOLYGONHEADER .’A’ や ‘b’ は 2つ,’B’ や ‘8’ は 3つとなる.
1つの文字を表現するために v_LQC の配列の vv_LQC を用意.
ここまでで ::GetGlyphOutline の出力を vv_LQC として変換できる.
この vv_LQC をポリラインに変換して,v_PLF(複数のポリラインなどを保持可能)に登録する.
これで文字列を vv_PLF(そのままでは輪郭,先日の穴の処理をしてポリゴンに)として保持できる.
2023/03/17
TT_PRIM_CSPLINE に関して
GetGlyphOutline で uFormat に GGO_NATIVE ではなく GGO_BEZIER を指定.
すると,制御点が 2 つのデータが返される.
ポリラインに変換するコードは次の様なもの?
Vd2A LQC_3_to (const LQC& lqc)
{
Vd2A pts ;
if (lqc.size() > 0) {
Vd2 q0(lqc[0]) ;
Vd2 q1(lqc[0]) ;
Vd2 q2(lqc[0]) ;
Vd2 q3(lqc[0]) ;
for (size_t index=0 ; index+3<lqc.size() ; index++) {
if (index == 0) { q0 = lqc[index+0] ; }
q1 = lqc[index+1] ;
q2 = lqc[index+2] ;
q3 = lqc[index+3] ;
Vd2A va = ::bezier(q0,q1,q2,q3) ;
pts.insert(pts.end(),va.begin(),va.end()) ;
q0 = q3 ;
}
}
return pts ;
}
GetGlyphOutline の続き
TTPOLYCURVE は,ポリラインはそのまま扱えるが,ベジェ曲線の場合はそれなりの処理が必要.
TT_PRIM_LINE , TT_PRIM_QSPLINE , TT_PRIM_CSPLINE
それで ChatGPT に Bezier と問合わせると,
2次ベジェ曲線
B(t) = (1-t)^2 * P0 + 2t(1-t) * P1 + t^2 * P2
3次ベジェ曲線
B(t) = (1-t)^3 * P0 + 3t(1-t)^2 * P1 + 3t^2(1-t) * P2 + t^3 * P3
w0 から w3 を求める部分の挿入位置が違っていたが,ほぼそのままのコード.
C++ でのコードは次の様なもの.5 年位前に作成した 3 次ベジェ曲線 に合わせたコード.
Vd3A bezier (const Vd3& q0,const Vd3& q1,const Vd3& q2,const long div_c)
{
Vd3A vd3a ;
for (long index=0 ; index<=div_c ; index++) {
double t = 1./div_c*index ;
double b0 = (1.-t)*(1.-t) ; // (1-t)^2
double b1 = 2.*t *(1.-t) ; // 2 * (1-t) * t
double b2 = t*t ; // t^2
double px = (b0*q0.x) + (b1*q1.x) + (b2*q2.x) ;
double py = (b0*q0.y) + (b1*q1.y) + (b2*q2.y) ;
double pz = (b0*q0.z) + (b1*q1.z) + (b2*q2.z) ;
vd3a.push_back(Vd3(px,py,pz)) ;
}
return vd3a ;
}
2023/03/14
最初,1 つの TT_PRIM_QSPLINE が次の様になっている場合の始点,終点と制御点の与え方がわからなかった.
(8,0) (5,0) (1,4) (1,8) … ‘O’ の左下,見やすい様に整数にしている.
::bezier を 2 回呼出す.それぞれの値は次の様に指定する.
(8,0) (5,0) (3,2)
(3,2) (1,4) (1,8)
(3,2) は (5,0) と (1,4) の中点.
まだうまくない部分はあるが,何とか.
GetGlyphOutline の再調査
今動作しているコードを見ると,20 年以上前に書き始めたもの.
UNICODE 対応などの変更はあるが,基本的な動作はほとんど変わっていない.
MFC や古い自前のコードに依存している部分があるので,書き直そうかと…
その当時,どこを参考にしたのかわからない.一番古い部分は 1998 になっている.
テスト用に作成したプロジェクトのスケルトンの作成も 1997/04 のものがある.
次の所を参考にしたものと思うが,内容がだいぶ変わっている.
Q243285: HOWTO: Draw TrueType Glyph Outlines
::GetGlyphOutline の呼び出し方はそれほど難しくないが,返された TTPOLYGONHEADER などが難解.
当時はあまり理解できず,単純にポリラインに変換(QSpline2Polyline)していた.
今回検索すると,TTPOLYGONHEADER と TTPOLYCURVE などが詳しく書かれている所があった.
GetGlyphOutlineからアウトラインデータをもらおう
文字アウトラインの取得
Q87115: HOWTO: GetGlyphOutline() Native Buffer Format
2023/03/13
ここ のコードの結果を,2D データとしてダンプ.
{
tstring tmp_path ;
{
size_t size = MAX_PATH ;
tmp_path.resize(size,0) ;
::GetTempPath(DWORD(size),&tmp_path[0]) ;
tmp_path = tstring(tmp_path.c_str()) ;
}
tstring out_ipl = tmp_path ;
{
// UINT chr = character ;
if (chr < 0xff) {
out_ipl += TCHAR(chr) ;
}
else {
tstring buf ; buf.resize(255,0) ;
::_itot(chr,&buf[0],16) ;
out_ipl += buf.c_str() ;
}
out_ipl += _T(".ipl") ;
}
std::tout << out_ipl << std::endl ;
std::ofstream ipl_file(out_ipl.c_str()) ;
for (size_t r_index=0 ; r_index<result.size() ; r_index++) {
std::vector <LINE> vd = result[r_index] ;
for (size_t v_index=0 ; v_index<vd.size() ; v_index++) {
LINE d = vd[v_index] ;
ipl_file << _T("L") << std::endl ;
for (size_t p_index=0 ; p_index<d.points.size() ; p_index++) {
Vec2 p = d.points[p_index] ;
ipl_file << p.x << _T(",") << p.y << std::endl ;
}
ipl_file << std::endl ;
}
}
ipl_file.close() ;
}
%TEMP%\A.ipl は次の様になる.
L
36.5313,22
26.3125,50.2344
16.125,22
L
44.4219,0
38.6875,16
13.9375,16
8.20313,0
1,0
22.0469,57
30.9844,57
52,0
ipl の形式 f_ipl.hxx
個人的に作成した次のツールで表示可能.
https://jml.mish.work/index.php/i-tools/i3dx.html
コンソール AP で DC の使用
ChatGPT で「Windows コンソールアプリで DC を使用する方法」と入力してみた.
すると,使えそうなコードが表示された.
#include <Windows.h>
#include "i_define.hxx"
#include "con_wnd.hxx"
int main() {
// 1. コンソールウィンドウのハンドルを取得する
HWND consoleWindow = ::GetConsoleWindow();
// 2. コンソールウィンドウのDCを取得する
HDC consoleDC = GetDC(consoleWindow);
// 3. DCを使用して描画する
TextOut(consoleDC, 10, 100, _T("Hello, World!"), _tcslen(_T("Hello, World!")));
// 4. DCを解放する
ReleaseDC(consoleWindow, consoleDC);
return 0;
}
そのままではエラーになる部分があったので,少し修正している.
コンソール AP のウィンドウで GDI が使えるのは知らなかった.
BMP を表示するコード.
{
// ...
tstring dib_name = file_name ;
if (::File_IsNothing(dib_name)) { return false ; }
i_DIB dib = ::DIB_Load(dib_name.c_str()) ;
{
HWND hWnd = ::GetConsoleWindow() ;
{
RECT rect = { 0 } ;
::GetWindowRect(hWnd,&rect) ;
HDC hDC = ::GetDC(hWnd) ;
::DrawDIB(hDC,rect,dib) ;
::ReleaseDC(hWnd,hDC) ;
}
}
// ...
}
{
HWND hWnd = ::GetConsoleHwnd () ;
D_I_E die ;
die.SetDocPath(dib_name.c_str()) ;
die.Draw(hWnd) ;
}
NAS の隠しフォルダ
EZ Sync と Win11
ASUSTOR NAS の EZ Sync を使ってみようかと思い,セットアップ.
Win10 環境ではそれなりに動作することは確認.
Win11 環境で ASUSTOR EZ Sync をインストールすると,環境によるのかもしれないが幾つか問題が…
この仮想環境では,表示が乱れることがあり,設定などがうまく進められない.
ホストの Win11 環境では,ASUSTOR EZ Sync の起動もうまくできない.
デスクトップの再描画を繰り返して,ほとんど何も操作できなくなる.PC の再起動でやっと落ち着く.
また explorer.exe との相性が悪いみたいで,エクスプローラを開こうとするとすぐに閉じてしまう.
イベントビューアを見るとアプリケーションエラーになっている.
結局,この環境では ASUSTOR EZ Sync をアンインストールすることに.
Synology File Station
Synlogy NAS で Web サーバを公開している人は少ないのかもしれないが…
保有している多くの NAS で,ブラウザやスマートフォンなどからファイルを操作できる様になっている.
Synology NAS の場合は,File Station と DS file .
ほとんどの場合,PC から「エクスプローラ」で直接操作している.
たまに,スマートフォンの DS file で見る程度.
いろいろと操作していて,//192.168.x.xxx/(File Station のエイリアス)/ で開けてしまうことに気づいた.
以前は //192.168.x.xxx:5000/ の様な,DSM にログインする時と同じ方法だったと思う.
外からは操作することはないので,ファイアウォールなどで…と思うが,うまい設定がわからない.
error C2678: 二項演算子 ‘=’ :
ある処理を関数にしてコンパイルすると,
--------------------構成: VFDiv_1 - Win32 Debug--------------------
コンパイル中...
VFDiv_1V.cpp
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(232) : error C2678: 二項演算子 '=' : 型 'const struct Vector2<double>' の左オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(228) : コンパイルされたクラスのテンプレートのインスタンス化 'void __cdecl std::_Iter_swap(const struct Vector2<double> *,const struct Vector2<double> *,struct Vector2<double> *)' の参照を確認してください
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(232) : error C2678: 二項演算子 '=' : 型 'const struct Vector2<double>' の左オペランドを扱う演算子は定義されていません。(または変換できません)(新しい動作; ヘルプを参照)
c:\program files (x86)\microsoft visual studio\vc98\include\algorithm(228) : コンパイルされたクラスのテンプレートのインスタンス化 'void __cdecl std::_Iter_swap(const struct Vector2<double> *,const struct Vector2<double> *,struct Vector2<double> *)' の参照を確認してください
cl.exe の実行エラー
VFDiv_1.exe - エラー 2、警告 0
対象が ‘const struct Vector2<double>’ となっているので,わかり辛かった.
次の関数の,’const Vd2A& v2a’ を std::reverse(v2a.begin(),v2a.end()) として使用しているのが原因.
PLF_face_l PLF_triangulation (const Vd2A& v2a)
{
// ...
std::reverse(v2a.begin(),v2a.end()) ;
// ...
}
HDL2-AAX8W 入手
以前から狙っていた HDL2-AAX8W を追加.
HDL2-AAX0/E に HDD を追加してと思っていたが,あまり変わらない価格帯でのものがあった.
最近は NAS キット ばかりだったが,用途が限定される NAS が欲しかった.
メインの用途はソースや PC データのバックアップ.
最初の設定 は HDL-AHW などと同様.
見た目は異なるが,ブラウザで IP を入力して設定画面に入って設定する.
内蔵されていた HDD は IronWolf だった.
DS220+ の IronWolf Pro 6TB は少し「カリカリ音」が気になるが,これは気にならない.
まだ LAN 環境が 1 Gbps なので,NAS の速度はこれで十分と思う.
Q’center Agent warning
先日から次の通知が届くようになった.
[Warning][Q’center Agent] Notification from your device: TS253D
NAS Name: TS253D
Severity: Warning
Date/Time: 2023/01/28 08:29:01
App Name: Q’center Agent
Category: Q’center Information
Message: [Q’center Agent] The connection between the NAS and Q’center is abnormal. NAS name: TS253D, Q’center server: 127.0.0.1.
©2023 QNAP Systems, Inc.
CPU の使用率が高くなっていたためと思われる.
CPU の負荷が高かったのは「Qsirch」のインデックス作成のため.
5 日程かかって終わった.
Mac からはいろいろとできそうだが,私の環境では,あまり期待した動作ではないか?
VS インストーラ 対象 OS
先日,.NET の ZipFile クラス を 使用した exe を作成した.
Win10 以降の環境では特に問題ないと思うが,テスト用に Win7 などでも同じ msi にしたかった.
「VS Installer target OS」で検索.
DOBON.NET 起動条件エディタの使い方
01264 : Windows Installer プロパティを使用した条件の設定
03192 : MSI で Windows 10 を判定する方法
Windows インストーラー
MDAC バージョンを確認する
調べるといろいろとできそうだが,今回は Win8 以前であれば iZIP.exe をインストールしない様に.
.NET Framework のバージョンおよび依存関係
exe のプロパティの「Condition」に「VersionNT>602」.
これで,Win7 には入らず,Win10 にはインストールされることを確認できた.
VirusTotal Phishing ?
2022/05 に mish.myds.me から ここ に移行した.
1ヶ月くらいで移行できたと思っていたが…
2022/10/20 頃からアクセス数が減ってきた.1 年前と比べると 1/3 程度に.
暫くわからなかったが,2022/12 に itl.mish.work にアクセスできない環境があった.
それで VirusTotal でチェックすると…
「Fortinet Phishing」などで検索して… やっと次の所にたどり着いた.
https://www.fortiguard.com/webfilter
2022/07/15 に「Phishing」になったのが原因?
https://www.virustotal.com/gui/domain/mish.work
Win7 Windows Update で 80072EFE
先日仮想マシンにセットアップした Win7 環境の Windows Update でエラー 80072EFE .
.NET Framework を使用しているものを実行すると,.NET … を要求され,そのセットアップに失敗してしまう.
「Win7 Windows Update 80072EFE」で検索すると…
Windows7 をインストール後、Windows Update が 80072EFE エラーでできない場合の対処方法
Windows Updateのエラー 8007000Eの対処はKB3138612で解決(Windows7)
2021年版:Windows 7 を久しぶりに更新する時の注意
KB3138612 を手動でインストールする必要があるみたい.
https://www.catalog.update.microsoft.com/Search.aspx?q=KB3138612
環境は x64 なので「Windows 7 for x64-Based Systems … (KB3138612)」をダウンロードしてインストール.
仮想マシンの再起動後 Windows Update に入ると,167 個の更新があった.
VirtualBox 7.0 に更新
Win10 と Win11 の ViurtalBox を 6.1.40 から 7.0.4 に更新した.
4K 環境になってから,いろいろと表示でうまくない部分があった.
Win10 環境は,Win11 の仮想マシンを除いては問題なさそう.
一度 Win11 仮想マシンを「除去」して,作成し直してみたが,うまく動作しない.
起動中の「お待ちください」の表示で止まってしまう.
仮想マシンの「設定」-「ディスプレイ」の「3Dアクセラレーションを有効化」にチェックして止まらなくなった.
どこかに設定があるものと思うが,OpenGL での表示がうまくされない.
Win11 環境は,LAN 関係のエラーでうまく起動しない.
6.1.40 に戻したがうまく起動しなくなってしまった.
「ネットワークアダプターを有効化」のチェックを外せば起動するが,これだとあまり使い物にならない.
ASUSTOR NAS でも同様のエラー になったことがあるので,設定ではないのか?
もう一度 7.0.4 にしてみたが,変わらず.
VM Name: Win10-VS6
Failed to open/create the internal network ‘HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter’ (VERR_SUPDRV_COMPONENT_NOT_FOUND).
Failed to attach the network LUN (VERR_SUPDRV_COMPONENT_NOT_FOUND).
Result Code:
E_FAIL (0X80004005)
Component:
ConsoleWrap
Interface:
IConsole {6ac83d89-6ee7-4e33-8ae6-b257b2e81be8}
アンインストールやデバイスの削除を行って,再度インストールしたら少し動作する様になった.
デバイスマネージャーで VirtualBox Host-Only Ethernet Adapter がうまくなかったので,そこが原因だったか?
まだうまく動作しない仮想マシンもあるが,あとは個別の設定なので何とかなるかな?
2023/06/05
Win11 環境で 7.0.8 にあげて,LAN 関係で同じ様な現象.
PC を再起動して,うまく動作する様になった.
Synology Chat
Synology NAS にある Chat 機能をインストールした.
Chat Server をインストールすると,LAN 内の NAS ユーザであれば次の様な指定でアクセスできる.
//192.168.1.xxx/chat/
//192.168.1.xxx/chat/ の様にアクセスするために「ログインポータル」の設定が必要.
「コントロールパネル」-「ログインポータル」-「アプリケーション」で「Synology Chat」を選択して「編集」.
「エイリアス」の所で指定したものが //192.168.1.xxx/(エイリアス)/ として使用される.
ここでは https://chat.(example.com) などの様にアクセスする設定も可能.
私の NAS 環境では,自分以外は「テスト用」などしか登録していない.
そのため Chat のためにユーザを追加登録するのはちょっと目的が違う.
「Synology Chat ゲスト」で検索して「ゲスト機能」があることはわかっていたので,その設定.
「Chat Admin Console」の「設定」で「ゲストユーザーを許可」にチェック.
それで,その後の設定がなかなかわからなかった.
「チャンネルの作成」で「プライベート チャンネル」と「パブリック チャンネル」がある.
「ゲスト」ユーザは「プライベート チャンネル」の方で招待できる.
「プライベート チャンネル」を作成して,右上の「メンバー」アイコンをクリック.
すると「ゲスト」タブが表示される.
「ゲスト」タブを選択して「追加」すると「ゲスト電子メール」などを指定して招待メールを送信できる.
あとは,メールを受け取った側が自分でログイン情報を入力して,Synology Chat を利用できる様になる.
2023/01/03
ゲストユーザは,NAS 上の Homes の下に guest_(ユーザ名) で追加される.
2023/01/06
不要になったゲストユーザは「コントロールパネル」-「ユーザーとグループ」で削除できる.
2023/03/14
何故かわからないが,チャットのゲストで登録したアカウントでログインできない.
NAS の登録ユーザであれば //(NAS)/chat/ から入ってログインできる.
スマートフォンの「Chat」からも問題ないが,ブラウザの時にうまくない様子.
どうも,招待メールにあるアドレスから入る必要があるみたい.
https://(NAS)/chat/guest/index.html#eyJ0eXAiOiJ…
更に試すと,次の様に # 以降はなくても大丈夫.
https://(NAS)/chat/guest/index.html
PPAP の代わりとしても使えると思う.