ASUSTOR NAS Mail Server – 2
先日から幾つかの所の設定を変更してやっていたが,うまくできないでいた.
今日も設定を確認していて,気づいた所があり.
「設定」-「ADMディフェンダー」-「ファイアウォール」で 80 以外が許可されていなかった.
「app#mail-server」を「許可」する様に.
これで少し進展.エラーが Mail Server から返る様になった.
あとは,メールアカウントの追加か?
これをやっていた時の,Let’s Encrypt での証明書の取得.
*.mish.work はうまく取得できるが,*.myasustor.com はうまくない.
設定を適用できません。 再試行してください。 (Ref. 5401)
ルータの設定を一時的に変更して,80 と 443 を NAS に設定したら「成功」した.
2022/02
うまく動作させることができなかったので,Synology NAS を使用 することに.
「ダイアログ バー」の追加
Win10 環境で VC 6 を使えるようにはなったが,「コンポーネントギャラリ」はうまく機能しないみたい.
今回利用しようとしたのは「ダイアログ バー」.ヘルプの内容は次の様なもの.
ダイアログ バー コンポーネント : 挿入結果
ダイアログ バー コンポーネントを挿入すると、プロジェクト コードに次の変更が加えられます。
- プロジェクトのリソース スクリプトにダイアログ テンプレート リソースが追加されます。このダイアログ テンプレートにコントロールを追加するには、Visual C++ のダイアログ エディタを使用できます。
- 指定したフレーム ウィンドウ クラスに、CDialogBar 型のメンバ変数の宣言が追加されます。デフォルトの変数名 m_wndMyDialogBar は変更できます。ダイアログ バーの初期プロパティ (標準では可視、ドッキング可能など) も指定できます。
- フレーム ウィンドウの OnCreate メンバ関数に初期化コードが追加されます。この初期化コードは、CDialogBar::Create を呼び出して、ダイアログ バーのドッキング オプションを設定します。また、ダイアログ バーの表示/非表示に関する初期化もここで行います。
- ダイアログ バーの表示/非表示に関するメニュー項目のサポートが追加されます。
ダイアログ バー コンポーネントを挿入しても、ダイアログ バーの表示/非表示を切り替えるためのメニュー項目はメニュー リソースに追加されません。このメニュー項目はメニュー エディタを使用して手作業で追加する必要があります。コンポーネントは、メニュー項目の追加手順を記述した “TODO” コメントを追加します。このコメントは、ダイアログ バーを追加したフレーム クラスの OnCreate 関数に挿入できます。
- 2 つの関数のハンドラがフレーム ウィンドウ クラスのメッセージ マップに追加されます。
- OnUpdateXXX 関数はメニュー項目の状態を随時更新します。
- 次に、OnBarCheck 関数は、メニュー項目のチェックマークのオン/オフどおりに、ダイアログ バーが表示/非表示になっているかどうかを調べます。
メニュー項目のプロンプト文字列がプロジェクトのストリング テーブル リソースに追加されます。コマンド ハンドラをインプリメントするには、ClassWizard を使用して、次の手順に従います。
- ResourceView で、ダイアログ バーのダイアログ テンプレートを開きます。
- Ctrl キーを押しながら W キーを押して ClassWizard を開きます。[クラスの追加] ダイアログ ボックスが表示されます。
- [クラスを選択] をクリックして、[OK] をクリックします。[クラスの選択] ダイアログ ボックスが表示されます。
- ダイアログ バー コンポーネントを挿入したときに指定したフレーム ウィンドウ クラスの名前をクリックして、[選択] をクリックします。このクラスとダイアログ リソースを関連付けるかどうかを確認するメッセージ ボックスが表示されます。
- [はい] をクリックします。[MFC ClassWizard] ダイアログ ボックスの [メッセージ マップ] タブの [オブジェクト ID] ボックスの一覧に、ダイアログ バーのコントロールの ID が表示されます。
- 通常の方法で、コントロールにコマンド ハンドラを割り当てます。
メモ ActiveX コントロールをダイアログ バーに追加する場合は、プロジェクトが ActiveX コントロール コンテナ機能をサポートしている必要があります。AppWizard でプロジェクトのスケルトンを生成したときに [ActiveX コントロール] オプションを選択していた場合は、ActiveX コントロール コンテナ機能のサポートがプロジェクトに含まれています。サポートがない場合は、[Gallery] の [Visual C++ Components] フォルダから [ActiveX コントロール コンテナ コンポーネント] を選択してプロジェクトに挿入する必要があります。
実際のコードなどの編集は次の様な手順.
ダイアログリソースの追加.
「スタイル」を「チャイルド」に.
「境界線」を「しない」に.
「タイトルバー」のチェックを外す.
CMainFrame に変数を追加.
CDialogBar m_wndDlgBar ;
CMainFrame::OnCreate に追加.
{
if (!m_wndDlgBar.Create(this, IDD_DIALOG_BAR,
CBRS_RIGHT | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
ID_DIALOG_BAR))
{
TRACE0("Failed to create dialog bar m_wndDlgBar\n");
return -1; // fail to create
}
// m_wndDlgBar.EnableDocking(CBRS_ALIGN_RIGHT | CBRS_ALIGN_LEFT);
// EnableDocking(CBRS_ALIGN_ANY);
// DockControlBar(&m_wndDlgBar);
}
Resource.h に ID_DIALOG_BAR を追加.
ダイアログバー上のコントロールに対しての操作は次の様な感じ.
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
if (m_wndDlgBar.GetSafeHwnd() == NULL) { return ; }
CListBox* listBI = (CListBox*)m_wndDlgBar.GetDlgItem(IDC_LIST_BI) ;
FitWindow(&m_wndDlgBar,listBI,3, FALSE, FALSE, FALSE, FALSE) ;
}
ASUSTOR NAS Mail Server
VNC 接続が安定しない?
最近は使う頻度が減ってきたが…
QNAP NAS の Virtualization Station の Win10 x86 への VNC 接続が安定しない.
他にも幾つか登録しているが,うまく開けないものが多い.
また Android からは,いつからかわからないが開けなくなってしまっている.
Virtualization Station へはブラウザからも接続できて操作はできるが,ちょっと反応が悪い.
VNC のクライアントは VNC Viewer ,サーバは UltraVNC を使用している.
ハッキリわからないが,Win10 などのバージョンが上がった関係か?
先ず VNC Viewer を Windows 版 6.21.1109 に更新.Android 版は最新版になっていた.
予想通りだが,特に変わらず.
サーバ側の UltraVNC は 1.2.24 や 1.2.40 が入っていた.これを 1.3.60 に更新.
インストール後,再起動が要求されるが,試しに Android から接続するとうまくいった.
どうも UltraVNC が古いことがまずかったと思われる.
IShellLink::SetShowCmd
ツールなどのスタートアップへの登録.
スタートアップのパスの取得は次の様な感じ.
LPITEMIDLIST pidl = 0 ;
::SHGetSpecialFolderLocation(NULL,CSIDL_STARTUP,&pidl) ;
tstring start_path = ::SH_GetPathFromIDList(pidl) ;
lnk の作成は,以前にツールを作成してその時のものを利用.
http://mish.work/joomla/index.php/i-tools/create-l.html
https://mish.myds.me/wordpress/dev/2020/01/11/msdn-createlink/
lnk のスタートアップへの登録は次の様にできる.
tstring start_lnk = ::Path_AddLastSP(start_path) + ::Path_GetTitle(file_path) + _T(".lnk") ;
tstring descript = _T("コメント") ;
::Create_lnk(file_path.c_str(),start_lnk.c_str(),descript.c_str()) ;
今回は,robocopy のコマンドを BAT ファイルとして生成し,それをスタートアップへ登録したかった.
http://mish.work/joomla/index.php/i-tools/cl-copy.html
動作としてはうまく機能するが,BAT ファイルを使用しているためコマンドプロンプトが表示されてしまう.
最小化された状態で起動する方が動作はスマート?
lnk 作成時に指定できるだろうと思い 検索 するとあった.
シェルリンク
IShellLink::SetShowCmd を使えば良さそう.
SW_SHOWMINIMIZED を指定してもうまく動作しない.SW_SHOWMAXIMIZED はうまく動作する.
SW_SHOWMINIMIZED ではなく SW_SHOWMINNOACTIVE を使うみたい.
::Create_lnk(file_path.c_str(),start_lnk.c_str(),descript.c_str(),work_dir.c_str(),SW_SHOWMINNOACTIVE) ;
::CreateLink している所を変更してうまくいった.
S_lnk.hxx
WS2022 IIS 環境に PHP インストール
先日作成した Windows Server 2022 の IIS 環境 に PHP をインストール.
先ず,CGI を追加.
Web PI のインストール.
Web Platform Installer で PHP 8 のインストール.
次の内容の php を開き,うまく動作していることを確認.
<?php phpinfo(); ?>
Edge で WebGL が表示できない?
Edge で three.js を利用したデータが表示できなかった.
WebGL で表示可能な形式に変換
https://itl.mish.work/i_Tools/to_wgl/
デバッガで追いかけると,WebGL を利用できない様なエラー.
Edge を再起動すると,うまく表示できるようになった.
何だったのだろう?
2023/01/17
Win8.1 環境の Edge で「使用可能な場合はハードウェア …」を OFF にする必要があった.
2024/07/18
仮想マシンの Win11 Edge で表示できなくなっていたので,その設定.
Edge の「設定」-「システムとパフォーマンス」で
「使用可能な場合はグラフィック アクセラレータを使用する」を「OFF」にして「再起動」.
2024/07/24
環境や 3D データなどによると思いますが,
「…グラフィック アクセラレータを…」を「OFF」にすると表示が遅くなったり,表示されなくなることもあります.
::CreateMutex の名称
以前作成した W_mutex を利用.
同じドキュメントを開かない様なガードに使えると思い,単体テスト用のコードを書いた.
#include "messbar.hxx"
#include "itls_tmp.hxx"
#include "cmd_line.hxx"
#include "S_Exec.hxx"
#include "W_mutex.hxx"
tstring make_mutex_name (const tstring& doc_name)
{
tstring mutex_name ;
v_tstring argv = ::get_arg() ;
if (argv.size() > 0) {
mutex_name += argv[0] ;
mutex_name += _T(" ") ;
}
mutex_name += doc_name ;
///////////////////////////////////////////////////////////////
// mutex_name = ::Path_Normalize(mutex_name,_T('/')) ;
///////////////////////////////////////////////////////////////
std::terr << mutex_name << std::endl ;
return mutex_name ;
}
bool t_wait (const tstring& doc_name)
{
tstring mutex_n = ::make_mutex_name(doc_name) ;
size_t bar_max = 1000 ;
MessageBar bar(_T("wait"),bar_max) ;
for (size_t index=0 ; index<bar_max ; index++) {
::Sleep(100) ;
W_mutex mutex(mutex_n.c_str()) ;
bar.SetBarInc() ;
if (mutex.Is_exist()) {
}
else {
break ;
}
}
return true ;
}
bool t_loop (const tstring& doc_name)
{
tstring mutex_n = ::make_mutex_name(doc_name) ;
W_mutex mutex(mutex_n.c_str()) ;
size_t bar_max = 100 ;
MessageBar bar(_T("loop"),bar_max) ;
for (size_t index=0 ; index<bar_max ; index++) {
bar.SetBarInc() ;
::Sleep(30) ;
}
::Sleep(2000) ;
return true ;
}
bool test (const tstring& doc_name)
{
::t_wait(doc_name) ;
::t_loop(doc_name) ;
return true ;
}
int _tmain (int argc,TCHAR* argv[])
{
_tsetlocale(LC_ALL,_T("")) ;
::reg_argv(argc,argv) ;
if (argc > 1) {
test(argv[1]) ;
}
else {
time_t now = ::time(NULL) ;
size_t count = 5 ;
tstring test_cmd ;
S_Exec se ;
{
tstring exe_name ;
tstring tmp_name ;
{
exe_name = argv[0] ;
}
{
tstring temp_dir = ::Get_i_Tools_tmp() ;
tstring time_str = ::Now_Format(_T("%H%M%S")) ;
tmp_name = ::Path_AddLastSP(temp_dir) + time_str + _T(".tmp") ;
}
{
test_cmd = exe_name + _T(" ") + tmp_name ;
}
{
se.SetFile (exe_name.c_str()) ;
se.SetParamaters(tmp_name.c_str()) ;
}
{
for (size_t index=0 ; index<count ; index++) {
std::terr << test_cmd << std::endl ;
se.Execute() ;
::Sleep(2000) ;
}
}
{
::Sleep(1000) ;
tstring mutex_n = ::make_mutex_name(tmp_name.c_str()) ;
size_t bar_max = 1000 ;
MessageBar bar(_T("test wait "),bar_max) ;
for (size_t index=0 ; index<bar_max ; index++) {
W_mutex mutex(mutex_n.c_str()) ;
if (mutex.Is_exist()) {
bar.SetBarInc() ;
::Sleep(100) ;
}
else {
break ;
}
}
}
}
}
return 0 ;
}
#include "messbar.cxx"
Mutex の名称としては,exe 名とドキュメント名を連結したものとした.
最初,実行させるとうまく動作しない(Mutex オブジェクトが存在するはずなのに抜ける).
::CreateMutex に与えている名称がうまくなかった.’\’ が使えない.
パスの区切りを ‘/’ に変更してうまくいった.
次の様なコードをアプリケーションクラスの InitInstance に追加.
{
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen) {
tstring doc_name = cmdInfo.m_strFileName ;
tstring exe_name = ::Get_module_name() ;
tstring mtx_name = exe_name + _T(" ") + doc_name ;
mtx_name = ::Path_Normalize(mtx_name,_T('/')) ;
static W_mutex mutex(mtx_name.c_str()) ;
if (mutex.Is_exist()) {
return FALSE ;
}
}
}