#pragma omp critical
共通のリソースに対してのコードを書いていて,ちょっと気になったので調べてみた.
テスト用に書いたのコードは次の様なもの.
#ifdef _OPENMP
#include <omp.h>
#endif
#include <clocale>
#include <iostream>
#ifdef _MSC_VER
#include <tchar.h>
#else
#define _T(x) x
typedef char TCHAR ;
#endif
#ifdef _UNICODE
#define _tmain wmain
#define tout wcout
#else
#define _tmain main
#define tout cout
#endif
bool test_n (const long n)
{
std::tout << _T("test_") << n << _T("\t") ;
{
for (long index=0 ; index<10 ; index++) {
#ifdef _OPENMP
// #pragma omp critical // (test) // --- (C)
#endif
{
std::tout << (n*10 + index+1) << _T("\t") ;
}
}
}
return true ;
}
bool test_ (void)
{
std::tout << _T("test_") << std::endl ;
{
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (long index=0 ; index<10 ; index++) {
#ifdef _OPENMP
#pragma omp critical // (test) // --- (P)
#endif
{
test_n(index) ;
std::tout << std::endl ;
}
}
}
return true ;
}
int _tmain (int argc,TCHAR* argv[])
{
{
::test_() ;
}
return 0 ;
}
ここで,関数 test_n() の次の行を有効にしてしまうと…
#pragma omp critical // (test) // — (C)
test_
test_0 致命的なユーザー エラー 1002: 同一名の 1 つで ‘#pragma omp critical’ が不適切に入れ子にされています
それぞれを異なる名称で指定する必要がある.
#pragma omp critical (test_n) // — (C)
#pragma omp critical (test_) // — (P)
VC リリース版ではうまく動作してしまうこともある?
Linux 環境でコンパイルした a.out を NAS 環境に持っていくと,DS220+ では実行できた.
-fopenmp を付けたコンパイルは不可.
TS253D では「libgomp.so がない」となって実行できない.
VERR_UNRESOLVED_ERROR
Win11 上の仮想マシン Mint を起動しようとすると,
VM Name: Mint
Unresolved (unknown) host platform error. (VERR_UNRESOLVED_ERROR).
Result Code:
E_FAIL (0X80004005)
Component:
ConsoleWrap
Interface:
IConsole {6ac83d89-6ee7-4e33-8ae6-b257b2e81be8}
検索しても該当しそうなものがわからない.
多く見つかるのは,Hyper-V などの無効化.
PC を再起動させよう思い,他の仮想マシンを「保存」して,試しに Mint を起動するとうまく起動した.
それで,「保存」した他の仮想マシンを起動しようとすると同様のエラーに.
こうなると,システムリソースの問題と思い,プロセッサ数を減らすが効果はない.
次にメモリ量を減らしてうまく起動した.
先日作成した WS 2019 のメモリ量を 6G から 4G にして運用することにした.
Mint 環境でコンパイルできる様に,共通のコードを参照するための mount .
/mnt/_.src を作成して,Fedora 環境にあった .sh をコピー.が,エラーとなる.
以前やった時を見直すと,IP で指定しないとうまくいかないことがあった.
.sh を書き換えてうまくいった.
C2440: ‘return’ : cannot convert …
以前,ini や レジストリ を操作する関数を作成した.
それで,少しずつ書き換えていると…
--------------------Configuration: PrtctT - Win32 Debug--------------------
Compiling...
PrtctT.cpp
t:\develop\_.src\__win\ri_reg.hxx(383) : error C2440: 'return' : cannot convert from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'int'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
l:\document\develop\tools\_yet\_other\key2013\prtctt\prtctt.cpp(162) : see reference to function template instantiation 'int __cdecl REG_get(struct HKEY__ *,const class std::basic_string<char,struct std::char_traits<char>,class std::allocato
r<char> > &,const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &,const int &)' being compiled
Error executing cl.exe.
PrtctT_d.exe - 1 error(s), 0 warning(s)
通常の関数であればうまく機能すると思うが…
関数 template は難しい.
コメントにしている部分で書き換えれば OK .
Windows C++ __argc __argv
MFC でコードを書いていて,コマンドライン引数を取りたくなった.
MFC では次の様にすれば取れるが,欲しいのは c の main に渡される argc と argv .
CString cmd_line = AfxGetApp()->m_lpCmdLine ;
検索すると次の所があった.欲しかった情報は __argc と __argv .
【 VC++ MFC 】MFC でコマンドライン引数を利用する方法
次の様なコードを書いて動作を確認.
#include <clocale>
#include <iostream>
#include <tchar.h>
#ifdef _UNICODE
#define tin wcin
#define tout wcout
#define terr wcerr
#define tlog wclog
#else
#define tin cin
#define tout cout
#define terr cerr
#define tlog clog
#endif
int _tmain (int ,TCHAR* )
{
_tsetlocale(LC_ALL,_T("")) ;
{
std::tout << __argc << std::endl ;
for (int index=0 ; index<__argc ; index++) {
std::tout << __targv[index] << std::endl ;
}
}
return 0 ;
}
_tmain が呼び出される前の mainCRTStartup の ::_setargv で設定されている.
LNK2001 _WinMain@16
VC 6 で,_MBCS から _UNICODE に変更すると,次のエラーになることがある.
--------------------Configuration: T_mtx_n - Win32 Release--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
T_mtx_n.cpp
T_mtx_nD.cpp
Generating Code...
Linking...
msvcrt.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
c:\Temp\Test_win\T_mtex\T_mtx_n\Release.060/T_mtx_n.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
T_mtx_n.exe - 2 error(s), 0 warning(s)
MailPlus Server 配信設定
以前 NAS にメールサーバをインストールして,受信まではできる様にしていたもの.
MailPlus で「作成」して「送信」すると,うまく送れない状態.
以前は気づかなかったが「connect to mx….jp[219……….2]:25: Connection timed out」となっている.
OP25B が影響しているみたいで「リレーサーバ」の設定が必要とのこと.
メールソフトの設定を参考にして,次の様に設定.
これで送信できる様になった.
WS 2019 ,IIS インストール
AS5202T 上の WS2022 が,最近不安定な気がする.
元々,WSS の代わりと,テスト環境の IIS を 24 時間動かせると思い設定したもの.
Windows Update などのためにデスクトップを表示すると,フリーズしてしまう.
ログインしない状態では特に問題ない.
今回 IIS(Classic ASP)のテストが必要になり,PC の仮想環境に WS 2019 をインストールすることにした.
使用した iso が 2021/04 にダウンロードしたものだったので,ブラウザの更新などがうまくできない.
Window Update である程度の所まで上げる必要があるのか?
Classic ASP のインストール.手順は WS 2022 と同様.
次のメッセージが表示される場合,ASP の設定が必要.
An error occurred on the server when processing the URL. Please contact the system administrator.
If you are the system administrator please click here to find out more about this error.
今回は,本番の環境で次のエラー.ログを表示するページのデータ量が 4 MB を超えたと思われる.
Response オブジェクト エラー ‘ASP 0251 : 80004005’
応答バッファー処理の制限の超過
/_CMN_/DrawLogAccess.asp, 行 0
ASP ページの拡張が原因で、応答バッファーが構成された制限を超過しました。
対応方法は次の所にある.
IIS で Response.BinaryWrite を使用しているときに HTTP 500 または応答バッファーの制限を超えた場合のエラー
「管理者として実行」したコマンドプロンプトから操作する必要があった.
また「ASP」-「動作」-「制限プロパティ」-「応答バッファー処理の制限」でも変更可能.
シン クラウド Free に WordPress
「サーバーパネル」の「WordPress簡単インストール」.
マニュアル 通り進めれば,それほど難しくはない.
この環境の「ファイルマネージャ」での //mish.cloudfree.jp/public_html/ には他の幾つかのファイルが存在する.
そのため,マニュアルと同様に …/public_html/wp とした.
この WordPress は,ここ のバックアップ用として利用予定.
QNAP NAS の MARS で定期的にバックアップしているものを,https://mish.cloudfree.jp/wp/ に復元.
MARS(Multi-Application Recovery Service)を使って WordPress サイトをバックアップ、リストアする方法
WordPress プラグインの「QNAP NAS Backup」をインストール.
MARS で「WordPressのサービスの作成」.
「復元ジョブの作成」で次の様に入力,
「今すぐ復元」.
エラーになってしまう.
「特定のバージョンを使用」で「2022-12-30 12:00:00」を選択して「今すぐ復元」ではうまくいった.
が,更にいろいろとやっていたら,まともに表示されず php のエラーが表示されるようになってしまった.
Jetpack でエラーになっている様だったので,「ファイルマネージャ」で「削除」.
何とか php のエラーはなくなった.
どこかの 1 GB の制限に引っ掛かっている様だが,対応方法がわからない.
2023/11/18
他の NAS の WordPress 環境に復元しようとすると,一番古いバックアップの 772 MB でもできない.
QNAP NAS Backup の「Maximum upload file size」が,32 MB となっていることに気づいた.
同様に mish.cloudfree.jp の方を見ると,1 GB となっている.
最初,…/wp/.htaccess を編集して php_value upload_max_filesize 2048M などを追加してみたが,500 エラー.
この方法は使えないみたいで,php.ini を編集する方法で行って,2 GB にはできた.
が,それで「復元」操作をしても,1 GB を超えるものはエラーになってしまう.
まだどこかの制限があるみたいだかわからない.
シン・クラウド for Free 申込み
以前から,テスト用に Xfree を利用してきた.
それで困っていたのが,https 化と WordPress が開けなくなったこと.
WordPress は DB の容量不足( 94 / 100 MB )と思われる.
1ヶ月位前,シン・アカウントへの統合と「シン・クラウド for Free」になるとメールが来ていた.
その時,アカウント情報は更新したが,既存の mish.*.xdomain.jp はそのままとしていた.
「シン・クラウド for Free お申し込みフォーム」から「ログイン」して申し込み.
無料レンタルサーバーの申し込み.
サーバーは 5 つまで 追加できる.
暫くすると,***.cloudfree.jp にアクセスできる様になった.
https://mish.cloudfree.jp/
アップロード用の php をコピーして動作することを確認.
https://jml.mish.work/index.php/i-tools/upload-htm-php.html
DSM 7.2 仮想ホストの設定
以前設定した時と変更されているみたいで,DSM 7.2 での設定手順.
「Web Station」を起動して「Web サービス」を選択して「作成」.
今回は静的なページのため「静的なウェブサイト」を選択して「次へ」.
「ドキュメント ルート」などを指定して「次へ」,「作成」.
「Web Station」の「Web ポータル」を選択して「作成」.
「サービス」は「Web サービス」で追加したものを選択.
サブドメインの設定がまだなので,ホスト名は仮の名称(ここでは image ).
//image/… でアクセスできる様になる.
あとはドメインの DNS レコードを設定して,ホスト名をサブドメインに設定.
C2039 , C3861 , C2665
個人的なメモです.
VC 6 プロジェクトを VC 7 以降にあげた時のエラー.
1>------ ビルド開始: プロジェクト: PLtoB, 構成: Debug Win32 ------
1>コンパイルしています...
1>PLtoBDlg.cpp
1> ...
1>t:\develop\_.src\__iwao\htmo_th.hxx(70) : error C2039: 'ToImage' : '`global namespace'' のメンバではありません。
1>t:\develop\_.src\__iwao\htmo_th.hxx(70) : error C3861: 'ToImage': 識別子が見つかりませんでした
1>t:\develop\_.src\__iwao\htmo_th.hxx(155) : error C2665: 'ToDIB' : 3 オーバーロードのどれも、すべての引数の型を変換できませんでした
1> t:\develop\_.src\__win\i_dib_fn.hxx(188): 'i_DIB ToDIB(const HBITMAP)' の可能性があります。
1> t:\develop\_.src\_afxw\i_dib_x.hxx(86): または 'i_DIB ToDIB(const MemoryDC &)'
1> 引数リスト '(Image)' を一致させようとしているとき
1> ...
1>PLtoB - エラー 3、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
Imgae.hxx を XxxDlg.h に追加.
次の場合は,MemoryDC.hxx を追加.
1>------ ビルド開始: プロジェクト: PLtoB, 構成: Debug Win32 ------
1>コンパイルしています...
1>PLtoBDlg.cpp
1> ...
1>t:\develop\_.src\__iwao\htmo_th.hxx(35) : error C2665: 'ToDIB' : 3 オーバーロードのどれも、すべての引数の型を変換できませんでした
1> t:\develop\_.src\__win\i_dib_fn.hxx(188): 'i_DIB ToDIB(const HBITMAP)' の可能性があります。
1> t:\develop\_.src\_afxw\i_dib_x.hxx(56): または 'i_DIB ToDIB(const Image &)'
1> 引数リスト '(MemoryDC)' を一致させようとしているとき
1> ...
1>PLtoB - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
::bezier(ps,p1,p2,pe)
::bezier に与えている分割数.
Vd2 ps(0.0,0) ;
Vd2 p1(0.0,1) ;
Vd2 p2(1.0,1) ;
Vd2 pe(1.0,0) ;
Vd2 pm = (p1+p2)/2 ;
vv_PLF vvplf ;
for (long dv=1 ; dv<10 ; dv++) {
v_PLF v_plf ;
Vd2A bz2 = ::bezier(ps, pm , pe,dv+1) ;
Vd2A bz3 = ::bezier(ps,p1,p2,pe,dv+1) ;
Vd3A b23 = ::ToVd3A(bz2) ;
Vd3A b33 = ::ToVd3A(bz3) ;
PLF plf_2(PLF::line,::ToVd4A(b23)) ;
PLF plf_3(PLF::line,::ToVd4A(b33)) ;
v_plf.push_back(plf_2) ;
v_plf.push_back(plf_3) ;
vvplf.push_back(v_plf) ;
}
@MS PGothic の高さ方向の間隔
以前から気になっていたことだが,文字列を縦書きにした時重なってしまうことがある.
文字ごとに ::GetGlyphOutline を呼出して,位置をずらしている( += gm.gmCellIncX ).
gmptGlyphOrigin を使えばよいのかもしれないが,テストした限りではうまくできなかった.
更にいろいろと試していると,LOGFONT の文字の高さを 23 より大きくするとうまくいく.
また,他のプロポーショナルフォントではうまくいくものもが多い.
::IsFontInstalled (LPCTSTR pszFace)
EnumFont… を調べていて,::IsFontInstalled を見つけた.
MFC 6 位に追加されたみたいだが,static 宣言されている.
VC 6 RTM では存在していなさそう.
正確なタイミングはわからないが,VC 6 SP6 には存在していて …\MFC\SRC\CCDATA.CPP にある,
フォントがインストールされているかのチェックに利用できそうなので,関数として定義予定.
CComboBox Get…Text() ?
CComboBox の選択項目の取得には GetLBText がある.
が,エディットボックス部分の取得方法がそこには書かれていない?
検索しても,あまりうまく引っかからない.
::GetWindowText(m_CtrlComboBox.GetSafeHwnd(),…) でいけそうなことは確認した.
Spy++ で見ると,エディットボックスの部分は「子ウィンドウ」になっている?
いろいろと調べると次の様なものもあり.
WindowsX.h
#define ComboBox_GetText(hwndCtl, lpch, cchMax) GetWindowText((hwndCtl), (lpch), (cchMax))
CComboBox の DDX_CBString を追加して,デバッガで追いかけると,::GetWindowText を呼出している.
MFC による Windows 95 プログラミングの 358 ページに次の様にあった.
コンボボックスの操作
… CWnd から継承している GetWindowText,SetWindowText 関数は,予想通り,エディットコントロール内のテキストを取得,設定する.
MFC だと次の様にできる.
CString str ;
m_CtrlComboBox.GetWindowText(str) ;
EnumFontFam…Proc
CALLBACK で呼び出されたものを FontType で分類して文字列の配列に登録.
#include <Windows.h>
class EnumFont {
public:
static int CALLBACK CB_EnumFontFam (const ENUMLOGFONT* lpelf_,const NEWTEXTMETRIC* lpntm_,DWORD font_type,LPARAM lparam) ;
static int CALLBACK CB_EnumFontFamEx (const ENUMLOGFONTEX* lpelfe,const NEWTEXTMETRICEX* lpntme,DWORD font_type,LPARAM lparam) ;
protected:
public:
v_tstring Font_________ ; // 0
v_tstring Font_raster__ ; // 1 RASTER_FONTTYPE
v_tstring Font_device__ ; // 2 DEVICE_FONTTYPE
v_tstring Font_truetype ; // 4 TRUETYPE_FONTTYPE
} ;
inline int CALLBACK EnumFont::CB_EnumFontFam (const ENUMLOGFONT* lpelf_,const NEWTEXTMETRIC* lpntm_,DWORD font_type,LPARAM p_this)
{
const LOGFONT& lf = lpelf_->elfLogFont ;
EnumFont* pthis = (EnumFont*)p_this ;
if (font_type & RASTER_FONTTYPE) { pthis->Font_raster__.push_back(lf.lfFaceName) ; }
else if (font_type & TRUETYPE_FONTTYPE) { pthis->Font_truetype.push_back(lf.lfFaceName) ; }
else if (font_type & DEVICE_FONTTYPE) { pthis->Font_device__.push_back(lf.lfFaceName) ; }
else { pthis->Font_________.push_back(lf.lfFaceName) ; }
return 1 ;
}
inline int CALLBACK EnumFont::CB_EnumFontFamEx (const ENUMLOGFONTEX* lpelfe,const NEWTEXTMETRICEX* lpntme,DWORD font_type,LPARAM p_this)
{
const LOGFONT& lf = lpelfe->elfLogFont ;
EnumFont* pthis = (EnumFont*)p_this ;
if (font_type & RASTER_FONTTYPE) { pthis->Font_raster__.push_back(lf.lfFaceName) ; }
else if (font_type & TRUETYPE_FONTTYPE) { pthis->Font_truetype.push_back(lf.lfFaceName) ; }
else if (font_type & DEVICE_FONTTYPE) { pthis->Font_device__.push_back(lf.lfFaceName) ; }
else { pthis->Font_________.push_back(lf.lfFaceName) ; }
return 1 ;
}
次の様に呼出し.
bool test (void)
{
HWND hWnd = ::GetConsoleWindow() ;
HDC hdc = ::GetDC(hWnd);
{
EnumFont ef_ ;
EnumFont efe ;
{
::EnumFontFamilies (hdc,NULL,(FONTENUMPROC)EnumFont::CB_EnumFontFam, (LPARAM)&ef_) ;
::EnumFontFamiliesEx(hdc,NULL,(FONTENUMPROC)EnumFont::CB_EnumFontFamEx,(LPARAM)&efe,0) ;
}
{
tstring tmp_path = ::Get_i_Tools_tmp_date() ;
tstring fet_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe_t.txt") ;
tstring fer_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe_r.txt") ;
tstring fed_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe_d.txt") ;
tstring fe__name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ffe__.txt") ;
tstring f_t_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff__t.txt") ;
tstring f_r_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff__r.txt") ;
tstring f_d_name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff__d.txt") ;
tstring f___name = ::Path_AddLastSP(tmp_path) + ::Now_Format(_T("%H%M%S")) + _T("_ff___.txt") ;
::SaveText(fet_name.c_str(),efe.Font_truetype) ;
::SaveText(fer_name.c_str(),efe.Font_raster__) ;
::SaveText(fed_name.c_str(),efe.Font_device__) ;
::SaveText(fe__name.c_str(),efe.Font_________) ;
::SaveText(f_t_name.c_str(),ef_.Font_truetype) ;
::SaveText(f_r_name.c_str(),ef_.Font_raster__) ;
::SaveText(f_d_name.c_str(),ef_.Font_device__) ;
::SaveText(f___name.c_str(),ef_.Font_________) ;
}
}
::ReleaseDC(NULL,hdc);
return true ;
}
::EnumFont…
幾つかの所で使用している ::EnumFont … と フォント 選択 .
最近追加したフォントでうまく列挙されないものがある.
先日試したコード では列挙されているので,コールバック関数の部分がうまくない.
フォントを列挙する部分は 20 年以上前に書いたコード.
間違ってはなさそうだが,MFC に依存しているので見直すことに.
プログラミング Windows 第5版 を見たが,1 ページ程度.
::EnumFonts , ::EnumFontFamilies , ::EnumFontFamiliesEx の違いなどが簡単に書かれている.
当時参考にしたのは,MFC による Windows 95 プログラミング だったみたい.ソースにコメントが残っていた.
コールバック関数の EnumFontFamExProc が呼ばれるのは,::EnumFontFamiliesEx が呼ばれた直後.
J2XML アンインストールでエラー
DS220 に J2XML 3.9 を入れて,更新したものを出力.
J2XML 3.9 にあげてある DS116 へのインポートは問題ないが,J2XML 3.7 では読み込めない..
それで,J2XML をアンインストールしようとするとエラー.
正しい対応方法がわからない.
joomla 以下の *j2xml*.* を検索して手動で削除.
どこかに情報が残っているみたいでうまくインストールできなかった.
インポートに必要な部分はそれなりに入っている様で,更新分の取り込みはできる様になった.
Joomla! を 4 に更新しなければならないのかもしれない.
Class “JPlatform” not found
Joomla! 4 にあげてうまく動作しなかった環境.
記事の一覧などに入ろうとすると
もう一つの Synology NAS で Joomla! 4 の環境が それなりに設定できた .
その時 j2xml が対応してなさそうだったので,それを無効に.
何とか記事の一覧などは表示できる様になった.
https://jml.mish.work/