OSC Nagoya 2018, コーディング標準は誰のため？名古屋のIoTは名古屋のOSで

OSC Nagoya 2018, 【飲食OK】コーディング標準は誰のため？（発表はCおよびC++、質問は他の言語も可）の記録
https://www.ospn.jp/osc2018-nagoya/

 <この項は書きかけです。順次追記します。>
# 準備作業記録
## 前日、夕方
当日資料１:選択３時間
　Qiitaで掲載した資料から４つ選択(この頁の最後にコードを含めて記載)

当日資料２：印刷３時間、B4印刷がエラーになりA3印刷。出来上がりはA4
　OSC Oosakaでは、B4印刷したものをLTで朗読時に配布。
「ちょけねこ　おたんじょうびのおくりもの」80部印刷
https://bookmeter.com/books/9820154

## 当日、朝
### 提示原稿 ５時起き4時間作業
1. 朝６時、できたとこまでを0.1としてSlideshareに掲載。ver. 0.10
https://www.slideshare.net/kaizenjapan/who-enjoy-a-coding-standard
2. 朝８時、出かける前の版0.2をSlideshareに掲載。ver. 0.20
https://www.slideshare.net/kaizenjapan/who-enjoy-a-coding-standard-ver-020

「近日開催予定行事」６枚を１枚のPDFとして出力。

3. 移動時間中に文字の大きさを調整、必要事項追記

コンビニで印刷。

会場到着後、最後の資料改定ver. 0.30
https://www.slideshare.net/kaizenjapan/who-enjoy-a-coding-standard-ver-030

# 会場にて
昼食時のセッションが２つしかなかったこともあり
約５０名の方に参加いただけました。

# 質疑
## Q1 全てをツールで対応できないのか
A1 １年に１回しか出てこないような類型は、コーディング標準として決めてもツールで対応する手間、費用をかけられない。
　オープンソースで対応してくださる熱意のある方がお見えになれば実現するかもしれない。MISRA C/C++, CERT C/C++の規則のほとんどに対応した道具がオープンソースでないのは、自分の技術力不足と怠慢と反省中。

## Q2 逸脱の具体例は。
A2 Slide shareに掲載したスライドの後ろの方に掲載している。ただし、これは道具で自動化する前のもの。特定の註釈をつけて、逸脱道具の自動化は現在進行形。TOPPERSのオープンソースの案件では、当方が品証として参加し、逸脱の手続きをとったことがある。試験機関であることと、カーネルであることから、アセンブラでの確認を必須にしており、アプリなどの場合には、手続きとして重すぎるかもしれない。

## Q3 Javaだと命名規則を含めた規則がある。
他の言語でも命名規則も一体的にすれば。
A3 構造的な命名規則がうまくいくとは限らない。プログラミング言語によっては、画面の設計の構造を変えたら名前を全部変えなくてはいけなくなったこともある。
　植物のように従来の構造的な分類が、遺伝子解析でかなりの量の変更があったように、構造的な定義が万能ではない。

（事後補足）
２つの異なる情報源のライブラリを共用しようとすると、ラッパをかぶせたり、rename機構を作ったりして調整する。案件ごとに主要ライブラリを変更する場合には、命名規則の構造を持っていると合わせるのに手間がかかるかも。

## Q4 従来のコードを再利用せずに、全面的に書き換えることはしないのか

A4 モデルベースに移行する際に、全面的な書き換えをして成功した事例はお聞きしたことがある。
その場合には、試験とかも体系的に道具を作ったりするので試験の効率化が計ることができる。
そうでない場合には、従来のタイミングとのズレが生じると振る舞いが変わる可能性があり、膨大な試験を再度することになり現実的ではない。

## Q5 複数の会社へ納めている場合に、相手のコーディングルールに合わせるのは

A5 特定の会社のコーディングルールの目的と規則とがうまく合っていれば良い。検査の道具を指定していることがある。

（事後追記）
開発現場と、品証とが別の道具で検査すると、MISRAが推奨しているような複数の道具による検査が実現する。品証が手を動かすと良い。

## Q6 昔書いたコードを、最近見る機会があった。
何人かの手が加えられていて、いろいろ考えることがあった。

A6 適用言語規格の変更、コンパイラの版の変更など、いろいろな要素がある。

## Q7 自動車分野以外だけどMISRA Cを適用しようと思うけど、どうすればいい？

A7 日本規格協会から発行されている解説書を見ていただければ、事務機会分野でもMISRA を適用されていることがわかるかも。動的メモリ確保を利用していない場合ならMISRA C/C++を先に適用し、そのあとCERT C/C++を適用しても良い。
動的メモリ確保が、デバイスドライバなどで起動時に１度だけの処理であれば、同じようにMISRA C/C++が先で良い。
動的メモリ確保を頻繁に行っているようであれば、CERT C/C++を先に適用すると良い。
現在、動的メモリ確保を頻繁に行っているプログラムで、起動時に１度だけの処理にならないかを見直してから適用すると良い。

### 行事予定表
５つの行事を最後に追記。
![スライド158.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/123da49b-f732-ac9d-89ac-615d601d3112.jpeg)

#### ホップ、ステップ、HAZOP 
2018/06/08（金） 午前9時、午前11時　二度開催予定、無料
会場：名古屋市熱田区六番三丁目四番４１号
名古屋市工業研究所　電子技術総合センター５階コンピュータ研修室
![スライド159.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/e3ea441b-0e8d-e717-6d75-67a2cdaf9372.jpeg)

#### 名古屋のIoTは名古屋のOSで　
2018/06/21（木） 無料、定員10人。
会場：同上
Raspberry Pi持参の方定員越え受付
![スライド160.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/c8cf9402-0e29-ec4f-a3b7-e279fe64f508.jpeg)

#### ゼロから作るDeep Learning ❷ ―自然言語処理編 読書会
2018/07/19(木）午後１時から午後５時　無料
会場：同上

![スライド161.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/498fdc88-71e5-d9d2-ba63-4a40ec30c717.jpeg)

#### 確率論及統計論輪講　
および　Automotive SPICE,実アセスメント　
毎月第二金曜日　無料　要事前連絡
![スライド162.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/2216eb4c-3d0a-5e5e-061e-ed086ac66230.jpeg)

#### SWEST 
2018, 8/30（木）-8/31(金) 
下呂水明館　有料
http://swest.toppers.jp

![スライド163.jpg](https://qiita-image-store.s3.amazonaws.com/0/51423/1aa54f89-40a5-4e09-68c8-9adfea1d751b.jpeg)
http://swest.toppers.jp

## 資料１
### 課題１　次のコンパイルエラーをなくしてください。

```shell-session
$ clang++ p35-3.cpp  -std=c++2a -Wall
p35-3.cpp:15:9: warning: unused variable 'i' [-Wunused-variable]
    int i = f(a); // f is the typedef, not the friend function: equivalent to int(a)
        ^
p35-3.cpp:25:9: error: fields must have a constant size: 'variable length array in
      structure' extension will never be supported
    int a[i];
        ^
p35-3.cpp:25:9: warning: private field 'a' is not used [-Wunused-private-field]
2 warnings and 1 error generated.
```
C++N4741,2018 (12)6.4.1 Unqualified name lookup [basic.lookup.unqual]p35
https://qiita.com/kaizen_nagoya/items/4b0aabd7e70d81f5f268
####対象算譜(code)は下記

```c++:p35-3
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
#define msg "C++N4741(12)6.4.1 Unqualified name lookup [basic.lookup.unqual]p35-3.cpp"
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
using namespace std;
int i = 2;
typedef int f;
namespace N {
struct A {
  friend void f(A &);
  operator int();
  void g(A a) {
    int i = f(a); // f is the typedef, not the friend function: equivalent to int(a)
  }
};
}
namespace M {
class B { };
}
namespace N {
class Y : public M::B {
  class X {
    int a[i];
  };
};
}
int main() {
  cout<< msg << endl;
  return EXIT_SUCCESS;
}
```
### 課題2　次のコンパイルエラーをなくしてください。

```shell-session
$ clang++ p105-2.cpp  -std=c++2a -Wall
p105-2.cpp:11:1: error: unknown type name 'T'
T* p1 = new T;
^
p105-2.cpp:11:13: error: unknown type name 'T'
T* p1 = new T;
            ^
p105-2.cpp:12:7: error: unknown type name 'T'
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
      ^
p105-2.cpp:12:33: error: unknown type name 'T'
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
                                ^
4 errors generated.
```
C++N4741 (50)8.5.1.9 Static cast [expr.static.cast]p105
https://qiita.com/kaizen_nagoya/items/e76c21417f6e21c1485e
#### 対象算譜(code)は下記。（yumetodo さんからのご指導
https://teratail.com/questions/126548#reply-192709 で解決済）

```c++:p105-2.cpp
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
const char* msg= "C++N4741(50)8.5.1.9 Static cast [expr.static.cast]p105-2.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>
#include <cstdlib>

using namespace std;

T* p1 = new T;
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
bool b = p1 == p2; // b will have the value true.

int main() {
  cout<< msg << endl;
  return EXIT_SUCCESS;
}
```
### 課題3　次のリンクエラーをなくしてください

```shell-session
$ clang++ p45.cpp -std=c++2a -Wall Undefined symbols for architecture x86_64:   "M::N::A::operator A<A>()", referenced from:       _main in p45-8b7ccd.o ld: symbol(s) not found for architecture x86_64 clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation) 
```
C++N4741,2018(18)6.4.5 Class member access [basic.lookup.classref]p45
https://qiita.com/kaizen_nagoya/items/8a189bc088cb94e5f265
#### 対象算譜(code)は下記

```C++:p45.cpp
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
#define msg "C++N4741(18)6.4.5 Class member access [basic.lookup.classref]p45.cpp"
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>
#include <cstdlib>

using namespace std;

struct A { };
struct B {
struct A { };
void f(::A* a);
};
void B::f(::A* a) {
a->~A(); // OK: lookup in *a finds the injected-class-name
}

struct A { };
namespace N {
struct A {
void g() { }
template <class T> operator T();
};
}
int main() {
N::A a;
a.operator A(); // calls N::A::operator N::A
  cout<< msg << endl;
  return EXIT_SUCCESS;
}}
```
### 課題4：次の実行時エラーをなくしてください

```shell-session
Abort trap: 6    
```
C++N4741(47)8.5.1.2 Function call [expr.call]p100
https://qiita.com/kaizen_nagoya/items/1db7cadf2c155b9addb5
#### 対象算譜(code)は下記

```c++p100a.cpp
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
const char* msg= "C++N4741(47)8.5.1.2 Function call [expr.call]p100a.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>
#include <cstdlib>
#include <cassert>

using namespace std;

void f() {
  std::string s = "but I have heard it works even if you don’t believe in it";
  s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don’t"), 6, "");
  assert(s == "I have heard it works only if you believe in it"); // OK
}

struct S {
  S(int);
};
int operator<<(S, int);
int i, j;
int operator<<(S, int i) {
  return i;
}
int x = S(i=1) << (i=2);
int y = operator<<(S(j=1), j=2);

S::S(int j) {
  j++;
}

int main() {
  f();
  cout << "x="<<x <<" y="<<y<<endl;
  cout<< msg << endl;
  return EXIT_SUCCESS;
}
```

# 課題
現在、astyleで整形している。~~namaspaceがうまく整形できていない。~~
-Nをつければnamespaceを整形できた。
Qiita掲載用利用記述は下記

```
#!/bin/bash
astyle -s2 -c -N< $1.cpp > $1s2.cpp
cat $1s2.cpp
```

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.10 初稿 20180519
ver. 0.11 Q&A追記 20180520
ver. 0.12 課題(astyle)追記 20180522
ver. 0.13 astyle -N追記 20180524
ver. 0.14 ありがとう追記　20230413
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.