2020年5月31日日曜日

Dockerの勉強

AWS LambdaをいきなりCALLしてもらうのは、難しいかもしれないので、ローカルでデバッグできる環境を提供しようと思いました。必要なのは、C++lambdaが動かせること、ローカルでDynamodbにlambdaがW/Rできることです。

https://github.com/lambci/docker-lambda
https://aws.amazon.com/jp/serverless/sam/

を理解出来れば、そういったキットを提供できるかもしれません。いずれも、Dockerなる仮想化技術が使われているので、Dockerを勉強する必要があります。

本もいくつか買ってみたのですが、このサイトの記事が私的にはよさそうでした。

https://kirohi.com/docker_study_resources

2020年5月29日金曜日

C++11/C++17へ

AWS用の記述では、C++14 をベースとして、部分的にC++17を使用しています。例えば、WindowsとLinux、スレッド生成一つ取ってもC++11を使えば、共通のstd::thread が使えます。ファイルのアクセスについてもC++17では、filesystemがあり、便利に使えます。ということで、同じ事をやるのに書き換えてWindows/Linux共通で使えるようにした部分が多数あります。

恐らく現リリース最新版129CとAWS開発最新版では、1万行以上記述が変わっています。そのためRegression Testが必要となっています。

このテストが1週間、マニュアル更新に1週間、リリースは、6月中旬を予定しています。



2020年5月28日木曜日

Python Editor の改善

次期リリース予定版(現在開発中のAWS対応版)では、PythonEditor(scintilla)を少し改善しています。Python Editorは、二つのタブになりました。[ソース]と[ソース全体]です。[ソース]は今までのエディタに同じです。


[ソース全体]の方は、ReadOnlyなので書くことはできません。また、最初の状態では、何もありません。
 求解すると、以前の_property.py と現在のソースとが合体したソースを[ソース全体]タブ中に見ることができます。


ここで、故意にエラーを作ってみます。今月:の:を削除して求解してみます。



 当然エラーになります。
● 
行をダブルクリックすると当該行がピンクでハイライトされます。
 
 
 ソース全体は、ソルバーが内蔵しているpython interpreterが認識しているソース全体になります。
従い、今までと違い正しく当該行を表示することが出来ます。
また、pythonソースを記述するのに、外部エディタを参照しながら記述する面倒が少し改善されます。

内部動作として、~property.pyは、以前と同様に出力されています。GUIは、それを拾ってきて、[ソース全体]として表示しています。GUIは、python interpreterの出力する"<string>"をKeywordとして、findしたら、python editorにその後続の(行)を表示されています。

AWS版でも、同様ですが、ファイル出力というインタフェースは利用できません。代わりに
lambda call のresponce payload中にソース全体が返ります。また、求解状況は,ユーザアカウント上の指定する(lambdaがアクセス許可された)テーブル上のStatusに出力されます。Status
は、XXsecに一回更新されます。(streaming modeにしてすると、上記GUI画面の右ペイン相当を得ることが出来ます。) 従い、AWSユーザは、(やろうと思えば)上記GUI動作と同じ処理を行うことが出来ます。

2020年5月27日水曜日

AWS 構成変更

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html
によるとpayload sizeの上限は、リクエスト・レスポンスで、6MBになっています。勘違いしていたのですが、往復計で6MBではなく、リクエスト6MB、レスポンス6MBということみたいです。とすれば、レスポンスで、解とpython property fileを返しても問題ないので、そのように設計変更しました。(今までは、dynamodbに出力するようにしていました。)下図が、変更後の構成とシーケンス図になります。


下がレスポンスの結果でpythonチュートリアル1の求回数を2にしたときのログになります。
 
Calling lambda..SC3_Lambda_Engine problem.json  clientConfig.requestTimeoutMs=900000sec
1:{
2: "peak_memory": "527.921875MB",
3: "result": "{\n  \"solution1.txt\":{\n    \"スタッフ名1\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名10\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名11\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名12\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名13\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名14\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名15\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名16\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名17\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名18\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"日勤\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名2\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名3\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名4\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名5\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名6\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名7\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名8\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名9\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"]\n  },\n  \"solution2.txt\":{\n    \"スタッフ名1\":[\"入り\",\"公休\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名10\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名11\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名12\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名13\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名14\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名15\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名16\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名17\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名18\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"日勤\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名2\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名3\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名4\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名5\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名6\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名7\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名8\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"],\n    \"スタッフ名9\":[\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\",\"入り\"]\n  }\n}\n",
4: "python": "#staffdef\nstaffdef=['スタッフ名1','スタッフ名2','スタッフ名3','スタッフ名4','スタッフ名5','スタッフ名6','スタッフ名7','スタッフ名8','スタッフ名9','スタッフ名10','スタッフ名11','スタッフ名12','スタッフ名13','スタッフ名14','スタッフ名15','スタッフ名16','スタッフ名17','スタッフ名18']\n#daydef\n制約開始日=5\n制約終了日=35\n表示開始日=0\ndaydef=['2016-07-27','2016-07-28','2016-07-29','2016-07-30','2016-07-31','2016-08-01','2016-08-02','2016-08-03','2016-08-04','2016-08-05','2016-08-06','2016-08-07','2016-08-08','2016-08-09','2016-08-10','2016-08-11','2016-08-12','2016-08-13','2016-08-14','2016-08-15','2016-08-16','2016-08-17','2016-08-18','2016-08-19','2016-08-20','2016-08-21','2016-08-22','2016-08-23','2016-08-24','2016-08-25','2016-08-26','2016-08-27','2016-08-28','2016-08-29','2016-08-30','2016-08-31']\n#staffcollection\n全スタッフ=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]\n入り=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]\n公休=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]\n日勤=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]\n明け=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]\nタスク1=[]\nタスク2=[]\nタスク3=[]\nNoTaskVar=[]\n\n#daycollection\n今月=[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n日=[4,11,18,25,32]\n月=[5,12,19,26,33]\n火=[6,13,20,27,34]\n水=[0,7,14,21,28,35]\n木=[1,8,15,22,29]\n金=[2,9,16,23,30]\n土=[3,10,17,24,31]\n全日=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n祝=[15]\n振=[]\n平日=[0,1,2,5,6,7,8,9,12,13,14,15,16,19,20,21,22,23,26,27,28,29,30,33,34,35]\n週末=[3,4,10,11,17,18,24,25,31,32]\n休日=[3,4,10,11,15,17,18,24,25,31,32]\n稼働日=[0,1,2,5,6,7,8,9,12,13,14,16,19,20,21,22,23,26,27,28,29,30,33,34,35]\n制約開始日一日前=[4]\n制約開始日二日前=[3]\n制約開始日三日前=[2]\n制約開始日四日前=[1]\n制約開始日五日前=[0]\n制約開始日六日前=[]\n制約開始日七日前=[]\n制約開始日P1=[6]\n制約開始日P2=[7]\n制約開始日P3=[8]\n制約開始日P4=[9]\n制約開始日P5=[10]\n制約開始日P6=[11]\n第一週=[5,6,7,8,9,10,11]\n第二週=[12,13,14,15,16,17,18]\n第三週=[19,20,21,22,23,24,25]\n第四週=[26,27,28,29,30,31,32]\n第五週=[33,34,35]\n第六週=[]\n四週間=[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]\n制約開始日1日前から=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n制約開始日2日前から=[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n制約開始日3日前から=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n制約開始日4日前から=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n制約開始日5日前から=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n制約開始日6日前から=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]\n制約終了日六日前=[29]\n制約終了日五日前=[30]\n制約終了日四日前=[31]\n制約終了日三日前=[32]\n制約終了日二日前=[33]\n制約終了日一日前=[34]\n金土日=[2,3,4,9,10,11,16,17,18,23,24,25,30,31,32]\n金土日月=[2,3,4,5,9,10,11,12,16,17,18,19,23,24,25,26,30,31,32,33]\n\n#shiftcollection\n\n#classcollection\n全スタッフ属性=[全スタッフ]\n\n#shiftdef\nshiftdef={'入り':入り,'公休':公休,'日勤':日勤,'明け':明け}\n#taskdef\ntaskdef={'タスク1':タスク1,'タスク2':タスク2,'タスク3':タスク3,'NoTaskVar':NoTaskVar}\n#non_auto_tasks\nnon_auto_tasks=[]\n#phase_list\n\n#task collections\n#digited group\n#column_constraints\n週末入り強制=(True,('週末',週末),'',入り,('',''),全スタッフ,2,-1,-1,-1.000000,-1.000000,0,0)\n列制約グループ1={'週末入り強制':週末入り強制}\n列制約グループ2={}\ncolumn_constraints={'列制約グループ1':列制約グループ1,'列制約グループ2':列制約グループ2}\n#shift schedules\nshift_schedules=[[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n,[('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0),('',0)]\n]\ntask_schedules=[[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n,[]\n]\n"
5:}
Elapsed time(C++):4947[ms]
 
大変に見にくいのは、ESCAPE シーケンスが挿入されてしまうためだと思われます。解は、peak_memory出力の後、solution1.json, (solution1_task.json),solution2.json,(solution2_task.json)...でJsonフォーマットで出力されます。taskは、フェーズモードでの記述があった場合のみ、出力されます。その後、python記述があれば、python_property.pyが出力されます。
 
レスポンスpayload生成部C++ソースを以下に示します。
 
 
 Aws::Utils::Json::JsonValue jsonPayload;
    string peak_memory=std::to_string(memUsedPeak())+"MB";
      
    jsonPayload.WithString("peak_memory", peak_memory);
    jsonPayload.WithString("result", json_solution);
    jsonPayload.WithString("python",python_property_src);
    string str= jsonPayload.View().WriteReadable();
  
  
    return aws::lambda_runtime::invocation_response::success(str,"application/json");

2020年5月26日火曜日

AWS Lambda-メモリリーク対策C++

設計を大幅に変更しました。行数にして数千行程度、Editしたと思います。

サーバアプリでは、基本的にメモリリークは許されません。が、Lambdaは、毎回HotStartする訳でもないので、目標として、一回のメモリリークは、100KB程度以下としました。(1000回連続HotStartされても100MBの増加に留まる、としました。) 1000回連続で来ることはないという想定です。これが崩れることがあるとするなら、同じLambdaを複数用意すれば事足ります。

<メモリリーク対策の為の設計変更>
次の対策方法を検討しました。

A)shared_ptrの使用
shared_ptrの場合、unionで、ptrを複数定義している部分の回避が面倒。(一応C+11なら書けそうですが..) さらに、performanceの劣化、メモリ増大が懸念されます。さらに、困難なのは変更Edit量が半端ないことです。

B)独自アロケータの使用
shared_ptr使用の場合に比べて、全ての面で優れています。union ptrの変更の必要はありませんし、変更Edit量も最小で済みます。
関連するクラス(ptr参照しているクラス)は、10種以下なので、それら全てを独自アロケータを使って処理します。つまり、delete処理は、最後の一回のみです。ptrを辿ってdeleteしていくことはしません。ですのでクラスのnew ptrは、管理しません。その結果、クラス内のstd::vectorにも細工が必要になります。幸い、std::vectorは、アロケータインタフェースが定義されているので、それらを含めて関連クラスのdelete処理を一気に行う処理が書けます。shared_ptrで、ちまちま参照カウントする方式に比べて速度で10倍くらい違う気がします。(しかし、ここは、ボトルネックではないので、体感では変わりません。)

 


<メモリリーク対策検証>
1)VisualC++内蔵ヒープチェック
メモリリークをEnableします。_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); また、リンカーのDebugを 共有と公開用に最適化されたデバッグ情報の生成 (/DEBUG:FULL)に設定します。(なぜか、デバッグ出力が全くされなかったのでが、VisualStudioの修復 を行ったらデバッグ出力が出るようになりました。)

2)VisualLeakDetectorの活用
1)では、ソース行が殆ど表示されないので分かりずらいです。格段に遅くはなりますが、デバッグ初期は、VisualLeakDetectorを使いました。スタックトレースまで表示されるので、場所の特定は容易です。しかし、ある程度以上の規模になると原因不明のエラーが出ることがありました。そのときは、VisualC++のヒープチェックに頼ることになります。

3)検証
■Windows: VisualC++/Visual Leak Detectorによる検証
■Linux:         g++ -fsanitize=leak による検証
■mainを何回か廻して、取得メモリ量に変化ないことを確認(ptrのリセット処理等検証)

4)メモリリーク箇所
■旧言語制約は、deprecatedで基本使用禁止とします。なので放置です。
■algorithm4 これもAWSではサポートしません。なので放置です。
■python インタフェース: 最新版で少し改善しましたが、僅かに未だ残っているようです。こちらは、改版に期待ということで、放置しています。
■Error 解がなかった場合、原因解析処理でメモリリークします。課題です。
■未検証 TASK周り

5)Tips
 ■Windowsは、OKで、LinuxでNGな箇所がありました。g++ stringstream.str()に要注意です。
 ■new vector<...> を vector<> 形式にして、出来る限りスタック上で自動deleteとするように書き換えました。地道な作業ですが、普段から、明示deleteしなくてもよい書き方を意識して書くべきだったと、反省しています。

<結論>
■従い、Algorithm1で、pythonを使わずに,解があるのであれば、メモリリークはありません。
■pythonを使った場合、記述量に関係なく、constantに1KB以下程度がリークします。1000回呼んで1MB以下です。しかし、解がなかったときの原因解析でリークが発生します。この部分が課題です。
■大幅にいじってしまったので、regression test が必要です。







2020年5月18日月曜日

Zoom オンラインコンサルティングを始めました。

娘が、大学のオンライン授業で使っていて、「知らないの? 遅れているね!」と言われてしまいました。中々良さそうなので、使ってみることにしました。

ついでに、有料でオンラインコンサルティングを始めることにしました。予約制で、単発~1時間5000円です。これまで、ありそうでなかったコンサルティングです。

勤務表の自動勤務表化に関わるコンサルティングです。所属を伏せて顔なしでも可能です。画面共有で、スケジュールナースの操作方法等も直接に指導可能です。勤務の制度設計、工場の変則勤務等、自動勤務化に関わるあらゆるご相談に応じます。 スケジュールナースの使い方レッスンも可能です。