C++N3242, 2011 (7)2.14.8 User-defined literals [lex.ext] p32.cpp

#はじめに(Introduction)
C++N3242, 2011, Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf

C++N3242は、ISO/IEC JTC1 SC22 WG21の作業文書(N number Document)です。
公式のISO/IEC 14882原本ではありません。

ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。

一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。

また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, TOPPERSカーネル、g++(GCC), clang++(LLVM）との関係を調査中です。

何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。

##作業方針(sequence)
下記4）までの過程はhosted環境で行います。
１）コンパイルエラーを収集する。
２）コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
３）リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
４）意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。
５hosted環境とfreestnding環境の違いによる影響、課題を洗い出し、freestanding環境での実行結果の作成を試みます。

１）だけのものから５）まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。

## C++N3242符号断片編纂一覧(example code compile list)
C++N3242, 2011, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318

### C++N4606符号断片編纂一覧(example code compile list)
C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

### C++N4741符号断片編纂一覧(example code compile list)
C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010


# (7)2.14.8 User-defined literals [lex.ext] p32.cpp
https://researchmap.jp/jov0o7b4c-1797580/#_1797580

## 編纂器(Compiler)
###clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-apple-darwin17.4.0

###g++-8 --version
g++-8 (Homebrew GCC 8.1.0) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.

##算譜(source code)

```c++:p32.cpp
// 1 filename:p32.cpp
// ver 0.1 June.10, 2014
// ver 0.2 June.25, 2018
// 2 original examples and/or notes:
// (c) ISO/IEC JTC1 SC22 WG21 N3242, April 12, 2011
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf
const char* msg= "C++N3242, 2011(7)2.14.8 User-defined literals [lex.ext] p32.cpp";
//
// 3 compile and output mechanism:
// (c) Ogawa Kiyoshi, kaizen @ wh.commufa.jp
//
// 4 compile errors and/or wornings:
// 4.1(c) Apple LLVM
// 4.1.1 ver.0.10
// version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
// Target: x86_64-apple-darwin13.2.0,  Thread model: posix
// Command/Options: c++ -std=c++11 -stdlib=libc++ -Wall cpp2011-2-5.cpp
// (c) LLVM 2003-2009 University of Illinois at Urbana-Champaign.
// 4.1.2 ver.0.20
// clang version 6.0.0 (tags/RELEASE_600/final)
// Target: x86_64-apple-darwin17.4.0
// 4.2. g++-4.9 (GCC) 4.9.0 20131229 (experimental)
// Copyright (C) 2013 Free Software Foundation, Inc.
// This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// http://gcc.gnu.org/onlinedocs/gcc/Standards.html
// 4.2.1 ver. 0.1
// Command/Options: g++-4.9  -std=c++11  -Wall cpp2011-2-5.cpp
// g++-4.9: error: unrecognized command line option '-stdlib=libc++'
// Configuration:brew install gcc49
// 4.2.2 ver. 0.2
// g++-8 (Homebrew GCC 8.1.0) 8.1.0
// Copyright (C) 2018 Free Software Foundation, Inc.
// 4.3. Visual Studio Express 2013,
// (c) Microsoft http://www.visualstudio.com/
// SPEC:
// Windows 7, .NET Framework
// (c) VMware, Inc.
// VMWare fusion 6
///
// 5. Hardware:  MacBook Pro,
// 5.1 ver. 0.10
//(c) Intel http://ark.intel.com/products/37006/
// Core 2 Duo 2.53GHz, 8GB, 1067MHz DDR3
// 5.2 ver. 0.20
// intel Corei5, 2.6GHz, 16GB, 166MHz DDR
//
// 6. Special Thanks: Upper organizatios and
// ITSCJ/IPSJ http://www.itscj.ipsj.or.jp/itscj_english/index.html
// NPO SESSAME project, http://www.sessame.jp/workinggroup/WorkingGroup3/
// Toyo Corporation, http://www.toyo.co.jp/English/
// Japan Standard Association, http://bit.ly/1lzykg1
// NPO TOPPERS project, https://www.toppers.jp/asp-d-download.html
// Daido Universcity, http://www.daido-it.ac.jp/gakubugakka/computer/index.html
// WITZ Co.Ltd., http://www.witz-inc.co.jp/products/solution/solution.html
// SevenWise.co., http://www.7ws.co.jp/index.html
// TOYOTA Motor Corporation, http://toyota.jp/
// IT planning Inc., http://www.itpl.co.jp/en/index.html
// DENSO Corporation, http://www.globaldenso.com/en/
// Aisin Seiki co. Ltd., http://www.aisin.com/
// Spancion Inc., http://www.spansion.com/
// Yazaki Corporation, http://www.yazaki-group.com/global/
// Pananosic Corporation, http://www.panasonic.net/
// SWEST: Summer Workshop on Embedded System Technologies , http://swest.toppers.jp
// CEST: Consortium for Embedded System Technology, http://www.ertl.jp/CEST/
// JUSE: Union of Japanese Scientists and Engineers, http://www.juse.or.jp/e/
// OSC:Open Source Conference, http://www.ospn.jp/

#include <iostream>
#include <cstdlib>
#include <string.h>
#include <cassert>

using namespace std;
const char x[] ="x";///p32.cpp:72:9: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]
#define x = "x"

long double operator "" w(long double d) {
  return d;
};
std::string operator "" w(const char16_t* t, size_t w) {
  string s;
  return s;
};
unsigned operator "" w(const char*) {
  unsigned u;
  return u;
};

int main() {
  1.2w; // calls operator "" w(1.2L)
///u"one"w; // calls operator "" w(u"one", 3)
///p32.cpp:83:7: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]
  12w; // calls operator "" w("12")
///"two"w; // error: no applicable literal operator
///p32.cpp:85:6: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]
//p32.cpp:76:13: error: read-only variable is not assignable
///L"A" "B" "C"x ; // OK: same as L"ABC"x
///p32.cpp:87:13: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]
///"P"x "Q" "R"y; // error: two different ud-suffixes
///p32.cpp:88:4: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]

  cout << msg <<endl;
  return EXIT_SUCCESS;
}

```
##編纂・実行結果(compile and go)

```shell_session:cppall.sh
$ ../cppall.sh p32
$ clang++ p32.cpp -std=c++03 -Wall
p32.cpp:77:22: error: expected a type
long double operator "" w(long double d){return d;};
                     ^
p32.cpp:78:22: error: expected a type
std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
                     ^
p32.cpp:79:19: error: expected a type
unsigned operator "" w(const char*){unsigned u; return u;};
                  ^
p32.cpp:82:4: error: invalid suffix 'w' on floating constant
1.2w; // calls operator "" w(1.2L)
   ^
p32.cpp:85:3: error: invalid suffix 'w' on integer constant
12w; // calls operator "" w("12")
  ^
5 errors generated.
$ clang++ p32.cpp -std=c++11 -Wall
p32.cpp:77:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
long double operator "" w(long double d){return d;};
            ^
p32.cpp:78:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
            ^
p32.cpp:79:10: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
unsigned operator "" w(const char*){unsigned u; return u;};
         ^
p32.cpp:79:56: warning: variable 'u' is uninitialized when used here
      [-Wuninitialized]
unsigned operator "" w(const char*){unsigned u; return u;};
                                                       ^
p32.cpp:79:47: note: initialize the variable 'u' to silence this warning
unsigned operator "" w(const char*){unsigned u; return u;};
                                              ^
                                               = 0
p32.cpp:82:4: error: invalid suffix 'w' on floating constant
1.2w; // calls operator "" w(1.2L)
   ^
p32.cpp:85:3: error: invalid suffix 'w' on integer constant
12w; // calls operator "" w("12")
  ^
4 warnings and 2 errors generated.
$ clang++ p32.cpp -std=c++14 -Wall
p32.cpp:77:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
long double operator "" w(long double d){return d;};
            ^
p32.cpp:78:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
            ^
p32.cpp:79:10: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
unsigned operator "" w(const char*){unsigned u; return u;};
         ^
p32.cpp:79:56: warning: variable 'u' is uninitialized when used here
      [-Wuninitialized]
unsigned operator "" w(const char*){unsigned u; return u;};
                                                       ^
p32.cpp:79:47: note: initialize the variable 'u' to silence this warning
unsigned operator "" w(const char*){unsigned u; return u;};
                                              ^
                                               = 0
p32.cpp:82:4: error: invalid suffix 'w' on floating constant
1.2w; // calls operator "" w(1.2L)
   ^
p32.cpp:85:3: error: invalid suffix 'w' on integer constant
12w; // calls operator "" w("12")
  ^
4 warnings and 2 errors generated.
$ clang++ p32.cpp -std=c++17 -Wall
p32.cpp:77:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
long double operator "" w(long double d){return d;};
            ^
p32.cpp:78:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
            ^
p32.cpp:79:10: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
unsigned operator "" w(const char*){unsigned u; return u;};
         ^
p32.cpp:79:56: warning: variable 'u' is uninitialized when used here
      [-Wuninitialized]
unsigned operator "" w(const char*){unsigned u; return u;};
                                                       ^
p32.cpp:79:47: note: initialize the variable 'u' to silence this warning
unsigned operator "" w(const char*){unsigned u; return u;};
                                              ^
                                               = 0
p32.cpp:82:4: error: invalid suffix 'w' on floating constant
1.2w; // calls operator "" w(1.2L)
   ^
p32.cpp:85:3: error: invalid suffix 'w' on integer constant
12w; // calls operator "" w("12")
  ^
4 warnings and 2 errors generated.
$ clang++ p32.cpp -std=c++2a -Wall
p32.cpp:77:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
long double operator "" w(long double d){return d;};
            ^
p32.cpp:78:13: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
            ^
p32.cpp:79:10: warning: user-defined literal suffixes not starting with '_' are
      reserved; no literal will invoke this operator [-Wuser-defined-literals]
unsigned operator "" w(const char*){unsigned u; return u;};
         ^
p32.cpp:79:56: warning: variable 'u' is uninitialized when used here
      [-Wuninitialized]
unsigned operator "" w(const char*){unsigned u; return u;};
                                                       ^
p32.cpp:79:47: note: initialize the variable 'u' to silence this warning
unsigned operator "" w(const char*){unsigned u; return u;};
                                              ^
                                               = 0
p32.cpp:82:4: error: invalid suffix 'w' on floating constant
1.2w; // calls operator "" w(1.2L)
   ^
p32.cpp:85:3: error: invalid suffix 'w' on integer constant
12w; // calls operator "" w("12")
  ^
4 warnings and 2 errors generated.

$ g++-8 p32.cpp -std=c++03  -Wall
p32.cpp:85:1: error: invalid suffix "w" on integer constant
 12w; // calls operator "" w("12")
 ^~~
p32.cpp:77:13: warning: user-defined literals only available with -std=c++11 or -std=gnu++11
 long double operator "" w(long double d){return d;};
             ^~~~~~~~
p32.cpp:77:13: warning: user-defined literals only available with -std=c++11 or -std=gnu++11
p32.cpp:77:40: warning: floating point suffix 'w' shadowed by implementation
 long double operator "" w(long double d){return d;};
                                        ^
p32.cpp:77:40: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
p32.cpp:78:13: warning: user-defined literals only available with -std=c++11 or -std=gnu++11
 std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
             ^~~~~~~~
p32.cpp:78:13: warning: user-defined literals only available with -std=c++11 or -std=gnu++11
p32.cpp:78:33: error: 'char16_t' does not name a type; did you mean 'wchar_t'?
 std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
                                 ^~~~~~~~
                                 wchar_t
p32.cpp:78:54: error: 'std::__cxx11::string operator""w(const int*, size_t)' has invalid argument list
 std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
                                                      ^
p32.cpp:79:10: warning: user-defined literals only available with -std=c++11 or -std=gnu++11
 unsigned operator "" w(const char*){unsigned u; return u;};
          ^~~~~~~~
p32.cpp:79:10: warning: user-defined literals only available with -std=c++11 or -std=gnu++11
p32.cpp:79:35: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                   ^
p32.cpp: In function 'int main()':
p32.cpp:82:5: warning: statement has no effect [-Wunused-value]
 1.2w; // calls operator "" w(1.2L)
     ^
$ g++-8 p32.cpp -std=c++11  -Wall
p32.cpp:77:40: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 long double operator "" w(long double d){return d;};
                                        ^
p32.cpp:78:54: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
                                                      ^
p32.cpp:79:35: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                   ^
p32.cpp: In function 'unsigned int operator""w(const char*)':
p32.cpp:79:56: warning: 'u' is used uninitialized in this function [-Wuninitialized]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                                        ^
C++N3242, 2011(7)2.14.8 User-defined literals [lex.ext] p32.cpp
$ g++-8 p32.cpp -std=c++14  -Wall
p32.cpp:77:40: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 long double operator "" w(long double d){return d;};
                                        ^
p32.cpp:78:54: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
                                                      ^
p32.cpp:79:35: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                   ^
p32.cpp: In function 'unsigned int operator""w(const char*)':
p32.cpp:79:56: warning: 'u' is used uninitialized in this function [-Wuninitialized]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                                        ^
C++N3242, 2011(7)2.14.8 User-defined literals [lex.ext] p32.cpp
$ g++-8 p32.cpp -std=c++17  -Wall
p32.cpp:77:40: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 long double operator "" w(long double d){return d;};
                                        ^
p32.cpp:78:54: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
                                                      ^
p32.cpp:79:35: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                   ^
p32.cpp: In function 'unsigned int operator""w(const char*)':
p32.cpp:79:56: warning: 'u' is used uninitialized in this function [-Wuninitialized]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                                        ^
C++N3242, 2011(7)2.14.8 User-defined literals [lex.ext] p32.cpp
$ g++-8 p32.cpp -std=c++2a  -Wall
p32.cpp:77:40: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 long double operator "" w(long double d){return d;};
                                        ^
p32.cpp:78:54: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 std::string operator "" w(const char16_t* t, size_t w){string s;return s;};
                                                      ^
p32.cpp:79:35: warning: literal operator suffixes not preceded by '_' are reserved for future standardization [-Wliteral-suffix]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                   ^
p32.cpp: In function 'unsigned int operator""w(const char*)':
p32.cpp:79:56: warning: 'u' is used uninitialized in this function [-Wuninitialized]
 unsigned operator "" w(const char*){unsigned u; return u;};
                                                        ^
C++N3242, 2011(7)2.14.8 User-defined literals [lex.ext] p32.cpp
```

#検討事項(agenda)
1.clang++はコンパイルエラー、g++はエラーなしの背景。
2. 役に立つまたは意味のある出力

#参考資料(reference)

###プログラミング言語教育のXYZ

https://qiita.com/kaizen_nagoya/items/1950c5810fb5c0b07be4
プログラミング言語教育のXYZ(youtube)
https://www.youtube.com/watch?v=He1_tg4px-w&t=486s
Autosar Guidelines C++14

###Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76
C++N4741 2018

###C++N4741
Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4741.pdf
C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010
C++N4606 2016

###C++N4606
Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
C++N4606, 2016符号断片編纂一覧(example code compile list)
Working Draft 2016, ISO/IEC 14882(1)
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1

### others
コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

MISRA C++ 5-0-16
https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74

C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp
https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed


ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

C言語（C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

'wchar.h' file not found で困った clang++ macOS
https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11

Open POSIX Test Suiteの使い方を調べはじめました
https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C まとめ #include <misra_c.h>
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

「C++完全理解ガイド」の同意できること上位10
https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671

#文書履歴(document history)
ver. 0.20 初稿 20180625