杉山利幸の公開日誌 2020年3月分

2020年4月分

2020/03/25 新型コロナウイルス(COVID-19)についての雑感
2020/03/21 Before Power Off Ver. up to 2.13
2020/03/17 「C++最新文法で有用な記述へ変更(内部処理)」の成果
2020/03/12 私が新型コロナウイルス(COVID-19)にかかるなら
2020/03/07 XReg Processor Ver. up to 2.02
2020/03/03 C++ スマートポインターの実行例


2020/03/25 新型コロナウイルス(COVID-19)についての雑感

ヨーロッパやアメリカでは感染が拡大しパンデミックになっているが、
日本がさほどではないのは、日本人にはキスやハグの習慣がないことと
手洗いをまめにするようになったことが要因ではないかと思う。

その目的はあくまでピークシフトであり、
いずれは日本もパンデミックの状況は避けられないと思われる。

やはりドイツのように重症患者だけを対象に医療資源を投入するのがいいのではないか。

よって今すべきことは、酸素吸入の設備と人工呼吸器の用意だと思う。
景気対策を今やっても外出禁止では意味がない。
症状の緩和中に自己免疫力をたかめて死亡率を低く抑えるのである。

医者や看護師さんに関しては、少人数でいいと思う。
もちろん医療的判断が必要になる場合は必要だが、
治療薬がない今はやれることは限られている。

その代わり既に新型コロナウイルスにかかって回復した人に
病人の普段の世話をやってもらえばいいと思う。
免疫が十分あるのなら防護服は不要になる。

今私が新型コロナウイルスにかかるというのが結構ベターなシナリオだ
というのは
ここに述べた。

もしも今私が新型コロナウイルスにかかって回復したのなら
医療機関に高めの時給でアルバイトしたいと思う。

最終的には医者が防護服なしで新型コロナウイルスにかかった人を
診察するようにならなければならないと思う。
中国がどれくらいでそうなるのか楽しみだ。

今回の記述は、私は専門家でないので「思う」ばっかりだ。


2020/03/21 Before Power Off Ver. up to 2.13

今日付けで Before Power Off をバージョンアップしました。
バージョンアップ内容は以下の通りです。

Ver.2.13 2020/03/21

1番目の修正は、
ここの1番目の修正と同じです。

2番目の修正は、ここの4番目の修正と同じです。

3番目の修正は文字通りですが、細かいバグが2、3個ほど立て続けに見つかり、それをまじめに書くと記述量が多くなるので省略しました。

4番目の修正はいつもの通りここにあります。
ここに詳しい解説があります。


「C++最新文法で有用な記述へ変更(内部処理)」の成果

以下のネタ本をヒントに公開ソフトの中変更位をすることはここここの最後で述べました。

Effective C++、Scott Mayers 著、丸善出版株式会社
Effective modern C++、Scott Mayers 著、株式会社オライリージャパン
More Effective C++、Scott Mayers 著、丸善出版株式会社

各公開ソフトの変更内容で「C++最新文法で有用な記述へ変更(内部処理)」が入っているのは、そのためです。

内容については実は少しづつ解説しています。以下のところです。
2020/01/11 デストラクターの働く場所
2020/02/02 C++ のコピー、new、配列化禁止
2020/02/15 C++ スマートポインターについて
2020/03/03 C++ スマートポインターの実行例

今回はその総まとめ的な内容について述べます。

今回の一番の成果は、なんとなく決まっていた開発標準を文書化したことで、内容は以下です。
クラス名規則
・C*:ウインドウを作らない一般のクラス
・D*:CreateDialog または DialogBox がある
・F*:RegistarClass と定義したウインドウクラスを使った CreateWindowEx がある
・Tab*:タブ関連
・Wiz*:ウイザード関連
・P*:Partsの意味、ウインドウのコントロール
・M*.cpp, M*.h:クラスにしていない関数の集まり

ウインドウの作り方(ダイアログリソース1つに対して1クラスとする)
・static <クラス名>* thisinst という変数をクラスのメンバーとして作る
・コンストラクターで thisinst = this; とする
・WNDPROC, DLGPROC を static なメンバー関数として作る
・その中から static でないメンバーにアクセスするには thisinst->... とする

*.h のみ
・派生させないクラスは final を定義、同時にメンバー関数の virtual を削除
・基底クラスを置き換えるメンバー関数は override を付ける
・CWinLib からの継承は private、更に下位への継承がある場合は protected
・他のクラスからの継承は private を考えてみる
・クラスには COPYINHIBIT、NEWINHIBIT を入れてみて検討する

*.h *.cpp 共通
・enum は enum class を使う、ソフト固有の名前はソフトのアルファベットを頭に付ける
・メンバー関数の戻り値は関数名の直前に const を付ける、参照は型の前に、static も同様
 例外:void 及び WINAPI 関連は修正しない
・関数の引数:sizeof(Obj) <= sizeof(LPVOID):R:Obj、W:Obj*、RW:Obj&
・関数の引数:sizeof(Obj) >  sizeof(LPVOID):R:const Obj&、W:Obj*、
 RW:Obj& or Obj*(NULL の場合があるとき、テンプレートの時は特に)
・関数の引数:Obj[]:R:const Obj*、W:Obj*(内容定義) or Obj**(サイズも定義)、RW:同左
・const なメンバー関数はなるべく const を付ける
 例外:WINAPI 関連は修正しない
 多くの関数が const できる場合はメンバー変数に mutable を許す
・関数の型の typedef 定義は using を使う
・delete は CNewPtr()を使いなるべく削除
 デストラクター以外で行うときは原則事情をコメントすること
・delete[] は CArray()を使いなるべく削除
 デストラクター以外で行うときは原則事情をコメントすること
 例外:CString、コンテナ
・関数の内部で戻り値や引数に新たな領域を定義している(new[]を実行)の場合は、CArrayPtr()を使う 
 CString.str(true) は CArrayPtr<char> tempstr(...str(true)) とする
・コンストラクターでメンバー変数をなるべく初期化子で初期化する
 その中で、クラスとして変更しない変数は、メンバー変数として const する
・WM_INITDIALOG で定義したリソースは、デストラクターではなく WM_DESTROY で開放する
・D*.cpp で CreateDialog を使っている場合、なるべく事情をコメントしておく
・深いコピーが必要な struct はコピー禁止の意味で STRUCTCOPYINHIBIT() を入れておく

原則 *.cpp のみ
・try catch throw は基本的に削除、必要なところのみ
・cast は static_cast をやってみてダメだったら reinterpret_cast 更にダメだったら const_cast
 dynamic_cast はクラスの親子関係が明白なときのみ
・hInstance は CWinLib, CClassFactory, CArcFile, FMenuTTObj の static 変数に入れて使う

内容の全てを説明する気はないですが、「ウインドウの作り方」は次回辺りに解説します。

実は、修正自体はほぼ全てのソフトで終わっています。
ただ、他に変更項目があった方がいいのと、テストを最初からやる必要があるので少し時間がかかっています。


私が新型コロナウイルス(COVID-19)にかかるなら

新型コロナウイルス(COVID-19)の感染力は高いことはここで述べた。

そうと考える理由はいくつかあるが以下に列挙してみる。

よって SARS, MERS の時のように日本で一切の感染を防ぐという事はそもそもできなかったのではないか。

とすると致死率がどうであろうと私が一度はかかるとこを防げないと思う。

60代男性既往症もなくは無いので、致死率はものすごく低いわけでは無い。

問題はいつかかるかで、一番最悪なシナリオは日本の感染のピーク時にかかってしまう事である。
特効薬はないとはいえ、対処療法をしてくれればその間に抗体を作って生き伸びるかもしれない。
所が医療現場が崩壊しているとそれもできなくなる。

ピークの後に感染するというのがベストシナリオと思われる。
正確で簡便な検査法も確立し、特効薬もできている可能性があるからである。

ただ、今感染するというのも結構ベターなシナリオになりそうである。
まだ医療現場が崩壊しているわけではない。

ところで特効薬がプログラミングでできればフリーウエアで公開するつもりだがそのような事は無い。

そんなことを色々考えている。


2020/03/07 XReg Processor Ver. up to 2.02

今日付けで XReg Processor をバージョンアップしました。
バージョンアップ内容は以下の通りです。

Ver.2.02 2020/03/07

1番目から3番目の変更は全てバグ修正です。

1番目の修正で、今更 Vista を使っている人はほぼいないと思います。
XP を使っている方が多く、XPをサポート対象から外すときは Vista も外します。

2番目の変更は、RegCreateKeyEx 関数が上位のキーを
自動で作ることを考慮していなかったバグの修正です。

3番目の変更は、名前=hex: 型式に対する対応です。

4番目の変更はいつもの通りここにあります。

当ソフトは、ユーザが作成した *.xreg ファイルを公開するのも自由にしています。

また MakeReverse 機能は、単純に[]と<>を反転するのではなく
実行時のレジストリの状態を加味して作成しているので、
直後に実行すれば、本当に元の状態になります。
その点、凝って作ったソフトです。


2020/03/03 C++ スマートポインターの実行例

ここ ではスマートポインターのソースを公開したが、
使用例をここで公開する。

以下のソースを見てもらいたい。
//---------------------------------------------------------------------------
void SetIntArray(int* array, int n)
{
	for ( int i = 0 ; i < n ; i++ ) array[i] = i;
}
//---------------------------------------------------------------------------
int SetIntNewArray(int** array)
{
	*array = new int[10];
	for ( int i = 0 ; i < 10 ; i++ ) (*array)[i] = i;
	return 10;
}
//---------------------------------------------------------------------------
int* SetIntNewArray(void)
{
	int* array = new int[5];
	for ( int i = 0 ; i < 5 ; i++ ) array[i] = i;
	return array;
}
//---------------------------------------------------------------------------
class SubClass final : public CTest
{
	...
};
//---------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//
//	CArray のテスト
	Debug("CArray テスト結果");
	int n = 1234;
	CArray<BYTE> arr(n);
	LPBYTE lp = arr.pobj();
	Debug(arr.size());//1234
	CArray<int> arr2(7);
	SetIntArray(arr2.pobj(), arr2.size());
	arr2[3] = -1;
	arr2[5] = -2;
	for ( int i = 0 ; i < arr2.size() ; i++ ) Debug(arr2[i]);//0, 1, 2, -1, 4, -2, 6
//
//	CArrayPtr のテスト
	Debug("CArrayPtr テスト結果");
	CArrayPtr<int> arr3;
	int nn = SetIntNewArray(arr3.ppobj());
	Debug(nn);//10
	for ( int i = 0 ; i < nn ; i++ ) Debug(arr3[i]);//0, 1, 2, 3, 4, 5, 6, 7, 8, 9
//
	CArrayPtr<int> arr4;
	arr4 = SetIntNewArray();
	for ( int i = 0 ; i < 5 ; i++ ) Debug(arr4[i]);//0, 1, 2, 3, 4
//
//	CNewPtr のテスト
	CNewPtr<CTest> sub;//sub(new SubClass(1234))も可
	sub = new SubClass(123);
}
//---------------------------------------------------------------------------

Debug の説明は、ここ にあります。
出力される結果は上記のコメントで表示しています。

中身を見れば重要な機能はほぼ持っていて必要充分であることがわかると思います。


2020年2月分

戻る