echo出力について~コマンドプロンプト(Windows、DOS窓、command)~

echo出力について~コマンドプロンプト(WindowsDOS窓、command)~

経緯

今回ハマったのはMD5を実装するに当たって、動作確認のためにコマンドプロンプト上でMD5動作チェックを行っているとき起きた。

>echo hello world |openssl md5
(stdin)= d1b9c5009a6ddd7dacb45eddb78fa23a

hello world の 文字列をMD5ハッシュ表示したものである。

作った関数を使用すると5eb63bbbe01eeed093cb22bb8f5acdc3となる。 はて?どうなっていうんだとデバックに励むのだが一向に解決しない。

スペースか!

>echo hello world| openssl md5
(stdin)= a0f2a3c1dcd5b1cac71bf0c03f2ff1bd

いや、テキストファイルを使って実行

>type hw
hello world
>openssl md5 hw
MD5(hw)= 5eb63bbbe01eeed093cb22bb8f5acdc3

えーーー、ということでecho -nを思い出したのでbash

$echo -n hello world | openssl md5
(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3
$echo -n hello world| openssl md5
(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3

bashでは、パイプの前のスペースは無効化されるらしい。

>type hw |openssl md5
(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3

結論:echoコマンドは、画面表示用のコマンドでるので改行コードが追加される。文字入力してそれをパイプで使うためのものではない

今回の記事はコマンドプロンプトでの入力文字列について扱う

cmd.exe echoのヘルプ

>echo /?
メッセージを表示したり、コマンド エコーの ON と OFF を切り替えます。

  ECHO [ON | OFF]
  ECHO [メッセージ]

現在のエコー設定を表示するには、パラメーターを指定せずに ECHO と入力してください。

bash echoのヘルプ

$help echo
echo: echo [-neE] [arg ...]
    Write arguments to the standard output.

    Display the ARGs, separated by a single space character and followed by a
    newline, on the standard output.

    Options:
      -n        do not append a newline
      -e        enable interpretation of the following backslash escapes
      -E        explicitly suppress interpretation of backslash escapes

    `echo' interprets the following backslash-escaped characters:
      \a        alert (bell)
      \b        backspace
      \c        suppress further output
      \e        escape character
      \E        escape character
      \f        form feed
      \n        new line
      \r        carriage return
      \t        horizontal tab
      \v        vertical tab
      \\        backslash
      \0nnn     the character whose ASCII code is NNN (octal).  NNN can be
                0 to 3 octal digits
      \xHH      the eight-bit character whose value is HH (hexadecimal).  HH
                can be one or two hex digits

    Exit Status:
    Returns success unless a write error occurs.

WindowsCertUtil -dumpコマンドを使ってみる

最近のWindowsには、ファイル中身(ダンプリスト)を見るコマンドがないのでCertUtilコマンドで代用する。 CertUtilコマンド自体は、デジタル証明書等のツールで色々できる。

>echo hello world > hw2
>certutil -dump hw2
    85 e9 65 a3 0a 2b 95                               ..e..+.
CertUtil: -dump コマンドは正常に完了しました。

>echo hello world > hw3
>certutil -dump hw3
    85 e9 65 a3 0a 2b 95                               ..e..+.
CertUtil: -dump コマンドは正常に完了しました。

>dir
2020/12/18  10:25                11 hw
2020/12/18  10:58                14 hw2
2020/12/18  10:58                13 hw3

一部省略するけど

はい、使い物になりませんでした。また、罠にかかるところだったよ!

>certutil -dump -?
使用法:
  CertUtil [オプション] [-dump]
  CertUtil [オプション] [-dump] [ファイル]
  構成情報またはファイルをダンプします

オプション:
  -f                -- 強制的に上書きします
  -user             -- HKEY_CURRENT_USER キーまたは証明書ストアを使用します
  -Unicode          -- リダイレクトされた出力を Unicode として書き込む
  -gmt              -- 時刻を GMT で表示します
  -seconds          -- 時間を秒とミリ秒で表示します
  -Silent           -- (-q) サイレント フラグを使って暗号コンテキストを取得します
  -split            -- 埋め込まれた ASN.1 要素を分割し、ファイルに保存します
  -v                -- メッセージを詳細に表示します
  -privatekey       -- パスワードと秘密キーのデータを表示します
  -pin PIN                  -- スマート カードの PIN
  -p パスワード             -- パスワード
  -t タイムアウト           -- URL のフェッチのタイムアウト (ミリ秒)
  -sid WELL_KNOWN_SID_TYPE  -- 数値 SID
            22 -- ローカル システム
            23 -- ローカル サービス
            24 -- ネットワーク サービス

CertUtil -?              -- 動詞の一覧 (コマンドの一覧) を表示します
CertUtil -dump -?        -- "dump" 動詞のヘルプ テキストを表示します
CertUtil -v -?           -- すべての動詞のヘルプ テキストをすべて表示します

"構成情報またはファイルをダンプします" つまりこれは、構成情報が出力されていてファイルをダンプしてないわけだ。使えない。というかオプションで選べるようにしておけよ!

CertUtilを調べているうちにMD5も表示できることが分かった

CertUtil を使って MD5を表示する

MD5ハッシュで表示したいファイルを用意して

>type hw
hello world
>certutil -hashfile  hw MD5
MD5 ハッシュ (対象 hw):
5eb63bbbe01eeed093cb22bb8f5acdc3
CertUtil: -hashfile コマンドは正常に完了しました。

opensslのMD5と同じ結果になります。

CertUtil を使って ダンプリストを表示する

まあ、上で使えないー。と言っていたんだが、色々と調べてみると隠しコマンドcertutil -uSAGEで使えることが分かったので

>certutil -encodehex -?
使用法:
  CertUtil [オプション] -encodehex InFile OutFile [type]
  ファイルを 16 進数でエンコードします

オプション:
  -f                -- 強制的に上書きします
  -Unicode          -- リダイレクトされた出力を Unicode として書き込む
  -UnicodeText      -- 出力ファイルを Unicode で書き込む
  -gmt              -- 時刻を GMT で表示します
  -seconds          -- 時間を秒とミリ秒で表示します
  -v                -- メッセージを詳細に表示します
  -privatekey       -- パスワードと秘密キーのデータを表示します
  -pin PIN                  -- スマート カードの PIN
  -sid WELL_KNOWN_SID_TYPE  -- 数値 SID
            22 -- ローカル システム
            23 -- ローカル サービス
            24 -- ネットワーク サービス

CertUtil -?              -- 動詞の一覧 (コマンドの一覧) を表示します
CertUtil -encodehex -?   -- "encodehex" 動詞のヘルプ テキストを表示します
CertUtil -v -?           -- すべての動詞のヘルプ テキストをすべて表示します

このコマンドダンプリストをファイル化することはできるが表示は直接できないっぽいのでいったんファイルにしたものを表示させるとこうなる。

>echo hello world>temp

>CertUtil -encodehex temp temp.txt
入力長 = 13
出力長 = 71
CertUtil: -encodehex コマンドは正常に完了しました。

>type temp.txt
0000    68 65 6c 6c 6f 20 77 6f  72 6c 64 0d 0a            hello world..

>del temp temp.txt

>

ということになります。つまり、echoコマンドは、メッセージを追加したあとに0x0d,0x0aの改行コードを追加して吐き出していたということになります。UNIX系のshellコマンドのechoには-nオプションがあって改行なしになるのですがWindowsのechoにはこのオプションがないのでパイプを使った入力は出来ません。

>CertUtil -encodehex hw hw.txt
入力長 = 11
出力長 = 69
CertUtil: -encodehex コマンドは正常に完了しました。

>CertUtil -encodehex hw2 hw2.txt
入力長 = 14
出力長 = 72
CertUtil: -encodehex コマンドは正常に完了しました。

>CertUtil -encodehex hw3 hw3.txt
入力長 = 13
出力長 = 71
CertUtil: -encodehex コマンドは正常に完了しました。

>type hw.txt
0000    68 65 6c 6c 6f 20 77 6f  72 6c 64                  hello world

>type hw2.txt
0000    68 65 6c 6c 6f 20 77 6f  72 6c 64 20 0d 0a         hello world ..

>type hw3.txt
0000    68 65 6c 6c 6f 20 77 6f  72 6c 64 0d 0a            hello world..

hwは改行なし
hw2は、echo hello world >hw2でリダイレクトやパイプの前にスペースが入っている場合。
hw3は、echo hello world>hw3でリダイレクトやパイプの前にスペースが無い場合。
となります。

echo(bash)の動作

$echo hello world|od -tx1c
0000000  68  65  6c  6c  6f  20  77  6f  72  6c  64  0a
          h   e   l   l   o       w   o   r   l   d  \n
0000014
$echo -n hello world|od -tx1c
0000000  68  65  6c  6c  6f  20  77  6f  72  6c  64
          h   e   l   l   o       w   o   r   l   d
0000013
$echo -n hello world |od -tx1c
0000000  68  65  6c  6c  6f  20  77  6f  72  6c  64
          h   e   l   l   o       w   o   r   l   d
0000013
$echo '  hello world ' |od -tx1c
0000000  20  20  68  65  6c  6c  6f  20  77  6f  72  6c  64  20  0a
                  h   e   l   l   o       w   o   r   l   d      \n
0000017
$echo "  hello world " |od -tx1c
0000000  20  20  68  65  6c  6c  6f  20  77  6f  72  6c  64  20  0a
                  h   e   l   l   o       w   o   r   l   d      \n
0000017
$

echoコマンドは、文字で始まって文字で終わる文字列の頭と終わりのスペースは削除される。文字列の終わりに0x0a改行コードを追加される。'~'シングルクォーテーションで囲むとその間の文字列が表示される。これによって、頭と終わりにスペースをいくつでも追加できる。"~"ダブルクォーテーションは、ダブルクォーテーションも出力される。

echo(cmd.exe)の動作

"~"で囲んだ場合そのままという感じになるかといって特別意味がない文字という扱いでもないみたいで、"""と奇数の扱いにすると|(パイプ)処理が無効になるので特殊処理のキャンセルとしては動作しているみたい。

>echo "hello world" | od -t x1c
0000000  22  68  65  6c  6c  6f  20  77  6f  72  6c  64  22  20  0d  0a
          "   h   e   l   l   o       w   o   r   l   d   "      \r  \n
0000020

>echo   " " " "  | od -t x1c
0000000  20  20  22  20  22  20  22  20  22  20  20  0d  0a
                  "       "       "       "          \r  \n
0000015

>echo   " " "  | od -t x1c
  " " "  | od -t x1c

>

また、echoの後記号等をいれると無効になり表示状は改行のみ表示された形になる。 これは、batchファイルとうでechoを複数行にわたって使う場の改行のみの行に使用されることがあるみたいだ。

>echo. | od -t x1c
0000000  20  0d  0a
             \r  \n
0000003

>echo/ | od -t x1c
0000000  20  0d  0a
             \r  \n
0000003

>echo\ | od -t x1c
0000000  20  0d  0a
             \r  \n
0000003

>echo.| od -t x1c
0000000  0d  0a
         \r  \n
0000002

echo改行なし

コマンドプロンプトechoコマンドを使っては、出来ないので変わりの方法?
まあ、テキストエディタを使って入力文章を作りtype filename|openssl md5とかで行うかもしくは、 openssl md5 filenameパラメータでファイルを指定する方法がある。他にもSET /Pを使う方法が知られている

>set /?
cmd.exe 環境変数を表示、設定、または削除します。

SET [変数名=[文字列]]

  変数名   環境変数名を指定します。
  文字列   変数に割り当てる文字列を指定します。

現在の環境変数を表示するには、パラメーターを指定せずに SET と入力してください。

コマンド拡張機能を有効にすると、SET は、次のように変更されます:

等号や値を指定せずに、変数名だけを指定して SET コマンドを実行すると、
SET コマンドに指定された名前にプレフィックスが一致するすべての変数の値が
表示されます。たとえば、

    SET P

と入力すると、文字 'P' で始まるすべての変数が表示されます。

変数名が現在の環境に見つからない場合は、SET コマンドは、ERRORLEVEL を
1 に設定します。

SET コマンドでは、変数の名前に等符号を使用することはできません。

SET コマンドには、2 つの新しいスイッチが追加されています:

    SET /A 式
    SET /P 変数=[プロンプト文字列]

/A スイッチは、等号の右側の文字列が、評価する数式であることを
指定します。式の評価はごく単純で、次の操作がサポートされます。
操作は、優先順位の高い順に示されています:

    ()                  - グループ化
    ! ~ -               - 単項演算子
    * / %              - 算術演算子
    + -                 - 算術演算子
    << >>               - 論理シフト
    &                    - ビット演算子 AND
    ^                   - ビット演算子排他的 OR
    |                   - ビット演算子 OR
    = *= /= %= += -=   - 代入
      &= ^= |= <<= >>=
    ,                   - 式の区切り記号

論理演算子またはモジュール演算子を使う場合は、式文字列を
引用符で囲む必要があります。式内の数値以外の文字列は環境変数文字列として
処理され、使用される前に数値に変換されます。
指定された環境変数名が現在の環境で定義されていない場合は、
値として 0 が使用されます。
これにより、いくつもの % 記号を入力して値を取得しないでも、
環境変数の値を算術演算に使うことができます。
コマンド スクリプト外でコマンド ラインから SET /A を実行すると、
式の最終的な値が表示されます。
割り当て演算子を使うには、割り当て演算子
の左側に環境変数名が必要です。
数値は 10 進数ですが、プレフィックスとして 0x
を付けると 16 進数、0 を付けると 8 進数になります。従って、0x12 は 18、
あるいは 022 と同じです。
8 進表記を使う場合は、注意してください。08 や
09 は、8 と 9 が有効な 8 進数ではないため、
有効な数値ではありません。

/P はユーザーによって入力された入力行を変数の値として設定できるようにします。
入力行を読み取る前に、指定されたプロンプト文字列を表示します。プロンプト文
字列は空でもかまいません。

環境変数の置換は、次のように拡張されます:

    %PATH:文字列 1 = 文字列 2%

は、PATH 環境変数を展開し、その結果に含まれるすべての "文字列 1" を
"文字列 2" に置き換えます。
"文字列 2" に空の文字列を指定すると、展開された出力からすべての "文字列 1"
を削除することができます。
"文字列 1"
をアスタリスクで始め、展開された出力の先頭から、文字列 1 の残りの部分
が最初に現れるまでのすべてを一致させることもできます。

また、展開の副文字列を指定することもできます。

    %PATH:~10,5%

は、PATH 環境変数を展開し、展開結果の 11 番目 (オフセット 10) の文字
から始まる 5 文字だけを使います。長さが指定されなかった場合は、変数の
値の残りの長さを既定値とします。オフセットまたは長さのどちらかが負の値
の場合、環境変数の値の長さに指定されたオフセットまたは長さをたしてその
数を使います。

    %PATH:~-10%

は、パス変数の最後の 10 文字が展開されます。

    %PATH:~0,-2%

は最後の 2 文字以外のすべてが展開されます。

最後に、遅延環境変数の展開が追加されました。このサポートは常に既定で
無効になっていますが、CMD.EXE の /V: のコマンド ライン スイッチを使
って有効または無効にできます。
CMD /? を参照してください。

遅延環境変数の展開は、実行時ではなく、テキスト行を読み取るときに展開
されるという現在の制限を避けるために役立ちます。
次の例は即時変数展開の問題を説明しています。

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after;
        if "%VAR%" == "after" @echo If you see this, it worked
    )

この例は、論理的には IF 文が別の IF 文の本体に含まれる複合文なので、
両方の IF 文の %VAR% が、最初の IF 文を読み取ったときに展開されます。
このため、メッセージは決して表示されません。
複合文の中の IF では "before" と "after" が比較され、
決して等しくはなりません。
同様に次の例も期待したようには動作しません。

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

この例では、現在のディレクトリのファイルの一覧は作成されず、代わりに最後
に見つけられたファイルが LIST 変数に設定されます。
これは %LIST% が FOR 文が読み取られるとき、
一度だけ展開され、そのときは LIST 変数が空だからです。
つまり、実際に実行されている FOR ループは

    for %i in (*) do set LIST= %i

で、LIST に最後に見つけられたファイルを設定し続けているだけです。

遅延環境変数の展開では、実行時に環境変数を展開するために異なった文字
(感嘆符) を使うことができます。
遅延環境変数の展開が有効な場合、上記の
例は次のように書くと意図したように動作します。

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

コマンド拡張機能が有効な場合、SET によって表示される変数の一覧には
現れないいくつかの動的な環境変数があります。
これらの変数の値は、変数の値が展開されるときに
動的に計算されます。
ユーザーがこれらの名前の変数を明示的に定義する場合、
その定義は下記の動的な定義を無効にします。

%CD%            - 現在のディレクトリ文字列に展開します。

%DATE%          - DATE コマンドと同じフォーマットで現在の日付に展開します。

%TIME%          - TIME コマンドと同じフォーマットで現在の時刻に展開します。

%RANDOM%        - 0 から 32767 の間の任意の 10 進数に展開します。

%ERRORLEVEL%    - 現在の ERRORLEVEL の値に展開します。

%CMDEXTVERSION% - 現在のコマンド プロセッサ拡張機能のバージョン番号に
                    展開します。

%CMDCMDLINE%    - コマンド プロセッサを起動したオリジナル コマンド ライン
                    に展開します。

%HIGHESTNUMANODENUMBER%
                  - このコンピューター上の最大の NUMA ノード番号に展開します。

>

要点だけだと

SET /P 変数=[プロンプト文字列]

/P はユーザーによって入力された入力行を変数の値として設定できるようにします。
入力行を読み取る前に、指定されたプロンプト文字列を表示します。プロンプト文
字列は空でもかまいません。

ユーザーによって入力された入力行を変数の値として設定できる つまり、ですが、変数のパラメータを省略できたりします。その場合変数代入がなくなり

>set /P a=
入力データ

>set a
a=入力データ
省略
>

set /P a=で入力待ちになり入力データ+改行で入力終了して環境変数aに入力データが代入れた。という動作になる。この時入力データに改行コードが入ると使いにくいので含まれない。これを応用したのが

>set /P=hello world<nul|od -t x1c
0000000  68  65  6c  6c  6f  20  77  6f  72  6c  64  20
          h   e   l   l   o       w   o   r   l   d
0000014

>set /P="hello world"<nul|od -t x1c
0000000  68  65  6c  6c  6f  20  77  6f  72  6c  64
          h   e   l   l   o       w   o   r   l   d
0000013

>set /P= "hello world" <nul|od -t x1c
0000000  68  65  6c  6c  6f  20  77  6f  72  6c  64
          h   e   l   l   o       w   o   r   l   d
0000013

>set /P='hello world'<nul|od -t x1c
0000000  27  68  65  6c  6c  6f  20  77  6f  72  6c  64  27  20
          '   h   e   l   l   o       w   o   r   l   d   '
0000016

となります。 echoと逆で'~'シングルクォーテーションで囲むと。シングルクォーテーションは出力される。また、"~"ダブルクォーテーションは、代入文字列として扱われ囲んだ範囲のみを文字列としてあつかってくれる。 なにもないとスペースが入るこれ変数にはいると使いにくだろうとおもうのだが。また、<nulを付けないと入力待ち状態でとまるのでリダイレクトで入力無を入力している。<空のファイル名でもいいが意味がないのでNULを使ったほうがよい

まとめ hello worldの入力

当初行いたかったhello worldは、

cmd.exeでは、

>set /P= "hello world" <nul|openssl md5
(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3

bashでは、

$echo -n hello world |openssl md5
(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3

とコマンド入力で確認できる。

VS code + python + Anaconda

Anaconda環境でVS codeを使う。

基本インストール等

基本インストール等は、公式ページや

docs.anaconda.com

code.visualstudio.com

を見てインストールしてください。それで、動作すればOKなので。インストール時期や、その後condaでパッケージ追加していって その状態で動作しなくなった人用のお話です。

前置き(ヨマなくてOK)

Anaconda Pythonディストリビューションは、便利である。沢山あるライブラリを比較的速やかに最新のものにupdateしてくれるのでバグがあって動かない機能が改善されたりする。昔は、自分でソースを拾ってきてコンパイルしていたが、Pythonの特性か高速に動作させようとするとCとか別言語のDLL等を使っていることも多くその辺も含めてコンパイルしないといけない。また、最近は、1つのライブラリで依存ライブラリも増えてきているので1つを変更するとほかも変更しないといけない等々簡単ではなくなってきている。そのうえ、Python2からPython3に分離したからと言って、3の中でも新しいシンタックス等が増えてきているのでそこで、Python3.6, 3.7,3.9など微妙に区別する必要が出てきている。新しい機能は便利であるが、Pythonは基本ソースベースなので機械語に変換されてないのでインストールされているPython.exeが古いと同じPython3.xでも動作しない。動作するかもしれないが、該当のシンタックスのところに行くとエラーを吐く。(また、脱線している。)とうい、感じにPythonでも複数のバージョンが存在している。もう一つ、最近大きなシステムのアプリケーションでは、大抵、そのシステムで動く組み込みマクロ言語等が使えるようになっている。有名なところでMSのOFFICE群では、VBAGoogleGoogle Apps Script(GAS) = Java scriptVLCやゲームの組み込みでLua。3Dグラフィックソフト周りではPython。古いところでは、EMACSではLISPなのどである。あ、忘れていた。ESP32のTOOLチェーンでもPythonを使用している。

仮想環境

Anacondaでは、複数の仮想環境を作ることができる。つまり、簡単にPythonの複数のバージョンや、プロジェクト毎にPythonバージョンや、importライブラリのバージョンを変えられるのでライブラリの依存プログラム等で動かなくなる等の状態を回避できる。この辺は、業務で毎日使用しているソフトがupdateで動かなくなり最悪すべてを泣く泣く再インストールして1日潰した人は山ほどいると思われる。このようなことも、この仮想環境を使い。クローンした後にその環境でUPDATEテストを行うなどできるので非常に便利である。

VS code + Anaconda

上記のような便利なAnacondaディストリビューションではあるが1企業が作っていることもあり他の企業が作ったシステム上のPython周りとは親和はよくない。 実際に、Visual Studio Code(VS code)上で使うPythonは、大抵公式Pythonかストアからインストールしてくださいとかになっている。でも、私がやりたいのは、 Anaconda環境のconda管理のライブラリが入った環境で動くプログラムの開発とデバッグなのである。Microsoftの公式のAnaconda Extension Packもあるのだが、あまりちゃんとに動作してない。これが原因なのか、Web上には何とか動かそうと怪しげな解決策が山ほどありどれもその人の環境では動くが…になっている。また、日々アップデートされているので古い情報となり動作しないこともある。という感じでここ1ヶ月ほどPythonデバッグ環境がうまく動作しなくてもやもやしていた。

解決方法?

解決方法はいくつかある。システムの実行PATHにPythonPATHを組み込む方法その他必要な環境変数全部である。 しかし、それはいらぬトラブルを引き起こす。上でも述べたが、python.exeは、他のアプリケーションでも使っており、他のディレクトリにも存在する。そして、開発言語なので、複数の実行コマンドを持っている。これが何を意味するかは、UNIXのPATH管理をしていた人はよくわかっていると思う。gccのバージョンや、ベンダーのlsコマンド、オプション違いのlessコマンド日本語が扱えないPerlやいろいろ、windowswindows95の頃は、ベンダーソフトが勝手にWindowsフォルダにプログラムをぶち込んだり、PATHを追加していってPATHが膨れ上がり、実行名が同じため動作しなくなった内部コマンドなど(起動コマンド以外名前なんて知らねーよ。また、そのジャンルの強豪同士が同じ名前を付けてインストール合戦していこともあった。)などのことがあるので、安易にシステムのPATHを追加するのは最近ではよろしくないということになっている。このようなことをPATH汚染という。 このような、過去があり最近は、他のシステムのコマンドを使う場合FULLPATHやフォルダを指定してもらいそのうえで使用するのが一般的になりつつあったがそうでもないのが、いろんな人がいろんな経験則に基づくソースが集まるソフトウェア開発コミュニティらしい(はぁ~)。有名になりつつあるソフトであれば改善されるであろうが、開発初めの時はそうでもなく動かないのである。現在、そんな感じ。あれこれ、時間を見ては、調べまくった結果。多少は、動作が怪しいが動くようになったが1回目動かないってどういうことよ?デバッグ実行時ターミナルが開いたときにすぐ実行され、デバッグ終了時に仮想環境にはいるらしい。そのうえで2度目の実行は仮想環境後に動作するので動くみたいだ。なにが致命的かNumpyのDLLが読まれないんだよ!まあ、一度デバッグ終了させて、再度実行すればいいのだが。

解決方法(原点回帰)

現在の問題点、Anaconda環境condaベースでインストールされたDLLが読み込まれない。環境変数には、CONDA PATH等いろいろ設定があるが結局のところうまくいってない。もう、いろいろとあきらめがついたので原始的な解決方法にすることにした。

f:id:chiyoh:20201115231654p:plain

VScodeの実行コマンドは、C:\Users\%USERNAME%\AppData\Local\Programs\Microsoft VS Code\Code.exe である。

昔からのやり方で、batchファイルを作り、そこでPATHを通す。なんて原始的なやりかた

call C:\Anaconda3\Scripts\activate.bat C:\Anaconda3\envs\py37
"C:\Users\%USERNAME%\AppData\Local\Programs\Microsoft VS Code\Code.exe"

某アドイン用のGITPATH追加する場合

call C:\Anaconda3\Scripts\activate.bat C:\Anaconda3\envs\py37
set PATH=%PATH%;C:\Program Files\Git\bin;
"C:\Users\%USERNAME%\AppData\Local\Programs\Microsoft VS Code\Code.exe"

やっていること
1.バッチファイル上でAnacondaの仮想環境をアクティベートする。
2.その他必要な環境変数やPATHを追加する
3.最後にVScodeを実行する

VScodeのバージョンが上がるときのUPDATEでディレクトリごと差し替えられてバッチファイルが消えたので バッチファイルはexeファイルがあるディレクトリでなく他のディレクトリに置いておいたほうがよさそう

f:id:chiyoh:20201115233130p:plain

適当に、ファイルを作り、ショートカット登録するだけ

とりあえず、これで、パスが通った状態でVScodeが起動するのですべての環境変数が受け継がれるのであった。 なんというか、すごい敗北感なんだよなぁ。

Markdown+α(HTML埋め込み)

今回のお題

MarkDown等で使う、埋め込みHTMLについて
WindowsOSでのお話になります。

気付き

最近VScodeを使っているが、非常に便利である。特に、1つのことではなく沢山の事を学んでしまうとその瞬間から忘れて行ってしまいそのままになってしまうことも多い。そういう意味もあってBLOGなどを書き始めたが、備忘録にもなってない。よく言う、メモは取るがメモは見ないである。ということでMarkDownである、最近はJupyterNoteBookや、ソースコードのドキュメント埋め込み、BLOGの文章とあちこちで活躍するMarkDown言語であるが使っている装飾が少ない。昔調べたときはたくさんの機能があったがチートシートが手元にないのがいけないのか覚えている数種のマークしか使っていない。これではいけないと、過去の記事を見直したがフムフムなるほどと思うがまた忘れそうである。チートシートでも作るかと思ったが今回は、特に便利そうな色付け機能等を何とか忘れないようにと思った次第だ。

chiyoh.hatenablog.com

方法

VScodeを使いだしてから、最近のトレンド?スニペットによる補完である。オートコンプリートよりもう少し大きいブロックになるこういうのは、あるアプリケーション上で動くPlug-in的動作であったり基本機能であったりする。そこまでしなくてもいいのだがなにか方法がないかと思っていたが、別途調べていたIMEの日本語ON/OFF勝手に切り替え機能を何とか黙らせる方法を探していて昔懐かしい機能に遭遇した。 単語登録機能である。最近は、辞書機能も進化していて辞書のビックデータ化などあり、マニアックな変換もサポートされているらしい。基本機能をインターネット越しというのも気持ち悪いので使用してないが。 さて、IMEも進化して、いつのころか同音異義語の中身の説明をしてくれる補助機能が付くようになっていた。

f:id:chiyoh:20201115194314p:plain

さらに、単語記録にもその機能を追加できるらしいのでこれを使えばべんりじゃね?とおもい組み込んでみた。

使用方法

単純に画面の右下のトレイのIMEアイコン「あ」とかあるやつを右クリックして単語の登録を起動左下のユーザー辞書ツールボタンをクリックしてメニューからヘルプ

f:id:chiyoh:20201115200521p:plain

ユーザー辞書を作るを見て作る。

メニューのツール-テキストファイルからの登録を使い一括登録

misc/imeWordReg.txt at master · chiyo-h/misc · GitHub

IME ONにして、「html」と打って変換するだけ簡単でしょ?

f:id:chiyoh:20201115191727p:plain

結果

改行

改行
マークダウンでは、スペース2つ以上の後改行コードか改行コード2つ以上だが見た目分かりにくい
<BR>
改行タグ

」 <br> 短縮よみ 改行 Enterキーの横の'」'とスペースとEnterで
を追加するようにしてみた。

スペース2つや、改行2つより、改行が歩かないかわからないスペースや文章が縦長になるより<BR>を入れるだけで組み込みHTMLになるので便利。

エンティティ

&  &amp;   短縮よみ    HTMLエンティティ
< &lt;    短縮よみ    HTMLエンティティ
> &gt;    短縮よみ    HTMLエンティティ
<>  &lt;&gt;    短縮よみ    HTMLエンティティ
” &quot;  短縮よみ    HTMLエンティティ

無意識に文章を書いていて、変換されなかったりする文字変換されなければ思い出すが頭に浮かばない時もあるのでIMEで全角変換されて腹が立つこともあるのでここでは、逆に全角で登録して置いて変換してしまおうという試み。><&<>"便利そうだ。

色付け

html <span style="color: #ff8800"></span>    短縮よみ    色コード
html    <span style="color: rgb(197,93,161)"></span>    短縮よみ    RGB表記
html    <span style="color:white,background-color:black"></span>    短縮よみ    バックカラー
html    <span style="color:black"></span>   短縮よみ    黒
html    <span style="color:silver"></span>  短縮よみ    銀
html    <span style="color:gray"></span>    短縮よみ    灰
html    <span style="color:white"></span>   短縮よみ    白
html    <span style="color:maroon"></span>  短縮よみ
html    <span style="color:red"></span> 短縮よみ    赤
html    <span style="color:purple"></span>  短縮よみ    紫
html    <span style="color:fuchsia"></span> 短縮よみ
html    <span style="color:green"></span>   短縮よみ    緑
html    <span style="color:lime"></span>    短縮よみ    ライム色
html    <span style="color:olive"></span>   短縮よみ    オリーブ色
html    <span style="color:yellow"></span>  短縮よみ    黄色
html    <span style="color:navy"></span>    短縮よみ
html    <span style="color:blue"></span>    短縮よみ    青
html    <span style="color:teal"></span>    短縮よみ
html    <span style="color:aqua"></span>    短縮よみ
<span style="color: #ff8800">RGBコード表記(16進)</span><br>
<span style="color: rgb(197,93,161)">RGBコード表記(10進)</span><br>
<span style="color:blue">色指定</span><br>
<span style="color:blue">色指定</span><br>
<span style="color:white,background-color:black">背景色有</span>

RGBコード表記(16進)
RGBコード表記(10進)
色指定
背景色有

フォントサイズ

html <span style="font-size:1em">1em</span>  短縮よみ    フォントサイズ(em)
html    <span style="font-size:24pt"> 24pt</span>   短縮よみ    フォントサイズ(pt)
<span style="font-size:1em">1 </span>
<span style="font-size:1.5em">1.5 </span>
<span style="font-size:2em">2 </span>
<span style="font-size:2.5em">2.5 </span>
<span style="font-size:3em">3 </span>
<span style="font-size:3.5em">3.5 </span>
<span style="font-size:4em">4 </span>
<span style="font-size:4.5em">4.5 </span>
<span style="font-size:5em">5 </span>
<span style="font-size:5.5em">5.5 </span>
<span style="font-size:6em">6 </span>
<span style="font-size:6.5em">6.5 </span>
<span style="font-size:7em">7</span><br>

emサイズ 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7

ptサイズ 1 2 3 4 5 6 7 8 9 10

6 8 10 10.5 11 12 14 16 18 20 22 24 26 28 36 48 72

pt表記は、7以上からっぽい。

下付き,上付き,ルビ

html <sub></sub> 短縮よみ    下付き
html    <sup></sup> 短縮よみ    上付き
html    <mark></mark>   短縮よみ    ハイライト
html    <ruby>漢字<rp>(</rp><rt>カンジ</rt><rp>)</rp></ruby>   短縮よみ    ルビ
H<sub>2</sub>SO<sub>4</sub>+Zn → ZnSO<sub>4</sub>+H<sub>2</sub>

<sup></sup>
<ruby>漢字<rp>(</rp><rt>カンジ</rt><rp>)</rp></ruby>

H2SO4+Zn → ZnSO4+H2
c2=a2+b2
漢字(カンジ)

【M5Stack_Core2】液晶ハードウエアスクロール機能

経緯

ここ、1~2週間はハマっていた内容がM5Core2から吐き出されるデータを液晶画面に表示して普通にスクロールアウトさせること。 まあ、当たり前すぎて誰も気に留めてないと思うが、エディタやWORDやEXCELでも、PageDownや↓キーで画面が上に移動していって次のデータが表示される機能である。
これをプログラム的に実行しようとすると画面内のデータをすべて記憶しておかないと再描画できない。昔のWindowsOS前のDOSパソコンであれば、FONT幅が等倍に なっており縦x横の文字数を記憶して置けば再描画ということで文字コードとして処理できた。現在、リッチテキスト(死語?)ではないが、装飾までいかなくても、Fontのプロポーショナルで1行の文字数がバラバラになる。また、UTF-8という、可変長文字コード問題もある。かといって、Frameバッファをカラーで使えばpixelとして管理できるが潤沢に使えるほど大きいRAMがないことは、描画のスプライト機能を使っていればわかる。そこで、そもそもスクールくらいハードウエアコマンドでできないのか?と、調べた結果。

Vertical Scrolling機能を使えば出来そう。

f:id:chiyoh:20201115162705p:plain

罠1 公開資料の間違い

M5Stack Core2のLCDコントロールICは、ILITEK ILI9341ではなく『ILI9342C』らしい。 液晶パネルを剥いて確かめてないのでわからないがM5Stackシリーズは前からこれみたい だ。ホントになってコッタい。M5公式のページから指定されているのはILI9341のデータ シートだから。その仕様書を読んで解析してたのに。 何とかの法則なのか丁度公式ページの更新があった。この苦労っていったい。。。

chiyoh.hatenablog.com

罠2 仕様書のあいまいさ(デメリットは、直接書かない)

hardscrollコマンドは、1方向固定らしい。つまり、ILI9341は、縦長方向。ILI9342C は、横長方向の時のみ有効。実際は、ILI9342C 240lineスクロールになっていてオリジナル サンプルプログラムは、ILI9341用なので240x320で縦長default設定320lineスクロールに なっている。このことは、サンプルのコメントにはsetRotation(0)じゃないと動かないと 書いてある。が実際は0,2,4,6の縦長でないと動かないである。どちらにしても、M5Stack では動作しない。

ILI9341 f:id:chiyoh:20201115164357p:plain

予期しない画像が表示されない限り、この設定は禁止されています。つまり、M5Stackシリーズは、ILI9342Cなので、下の仕様通り合計320の値では動作しない

ILI9342C f:id:chiyoh:20201115164454p:plain

M5Sackシリーズの横長画面では240になるように設定しなければならない。240より大きい320で動いてないので240mustなんでしょう

罠3 TFT_eSPIのドライバの定義(後から出てきたシリーズは亜種扱い)

M5StackシリーズのTFT_eSPI液晶ドライバ定義 In_eSPI_Setup.hでILI9341_DRIVERを 指定している。ILI9342Cは、ILI9341の亜種扱いで一部パラメータを変更する程度で対応 できるので、ILI9342C_DRIVERがないのであろう。ゆえに、勘違いする。

罠4 サンプルプログラム(見たままの機能の場合説明されない)

ハマった原因。サンプルプログラムを環境に合わせて変更し、一見動作している ように見えるが、どう動いたら正解なのかわからないのが問題。いや、サンプル プログラムは確実に動かないと問題なのだ。Serialからのデータ入力は、画面に 映っているがなにをハードスクロールしているか不明であった。

さんぷるプログラム

最近確認用のプログラムが長くなってきたのでこっちに移動

https://github.com/chiyo-h/Arduino/blob/master/M5Core2/TFT_Terminal/TFT_Terminal.ino

プログラムをUPLOADしたあと、PC端末側から、Serial通信でデータを送るとそのまま、M5Core2の液晶に文字が表示される。初期表示が、最下位行になっており、改行する毎に上側にハードウェアスクロールしていく。このプログラムのいいところは、表示スピード重視していて改行コード連打が最速になるようになっているっぽい。実際は、バグっているが。 もとは、TFT_eSPIライブラリ開発者のBodmerさんのサンプルプログラムこれをM5Core2用に変更と解析を行っていったもの うざいくらい説明書きをしてあるので内容は理解できると思う。というか、ハマりまくったので1行毎に動作確認が大変。 なんというか、最適化は、コンパイラに任せたらいいよ。みたいな、Pythonのシンプルさがありがたく感じるほかの方のプログラム解析

遊び機能

  • rot = 0;を変更すると縦横、変更される。0がdefaultで動かなかったモード。これはこれで、LOG表示としてはいいかも。
  • BOTTOMに、パラメータ設定を追加
  • スクロールが分かりやすいようにXラインを追加
  • FONT_HEIGHT/BOT_FIXED_AREA/TOP_FIXED_AREAを変更して機能確認ができる。
  • _キーでSCROLL機能ON/OFF
  • \\,/キーで強制ロール機能

副産物

M5.Lcd.setRotation(rot) 仕様 0~4が回転、5~7が鏡文字(液晶をそのまま表示するのではなく、鏡越しに表示したり、反射させて表示させるときのモード。)

f:id:chiyoh:20201115170627p:plain

f:id:chiyoh:20201115170707p:plain

まとめ

Vertical Scrolling機能は、使えるので上手くプログラムに組み込むと便利。SCROLL機能ON/OFFを使ってもらえればわかるように実際のFRAME RAMは、何ら書き換えは行われていない。 LSIの中でView位置を変更しているだけなのである。

f:id:chiyoh:20201115180206p:plain

わかってしまえば、VSPの値を変更しつつ普通に表示しているだけなのである。

なんか、脱線しまくって。こんなことしている。実は、まだまだ脱線しているのだが次回に続く

【M5Stack_Core2】LCDコントローラ ILI9341でなくILI9342Cです。

長らく、ユーザを迷わしていた。m5Stackシリーズの液晶コントロールICが公式ページでILI9341からILI9342Cに変更された。

docs.m5stack.com

ほかにも、資料として複数のICのデータシート。および、回路図のExternalが追加されているのでCore2早期購買ユーザは再確認すると幸せになれる。

VS code Arduino 文字化け

最近では、Visual Studio Code に慣れて便利に使っている。

しかし、突然出力コンソールの日本語文字化けが発生。何かと思ったら、Arduinoプラグインがupdateされたみたいだ。

f:id:chiyoh:20201108123223p:plain

これは、導入したときにも発生していてファイルにパッチを充てることで回避したが今回はまた上書きされてしまったみたいだ。

chiyoh.hatenablog.com

"C:\Users\%username%\.vscode\extensions\vsciot-vscode.vscode-arduino-0.3.3\out\src\common\util.js"

Ver. 0.3.4
"C:\Users\%username%\.vscode\extensions\vsciot-vscode.vscode-arduino-0.3.4\out\src\common\util.js"

<span style="color:red"></span>
    return new Promise((resolve, reject) => {
        const stdout = "";
        const stderr = "";
        options.cwd = options.cwd || path.resolve(path.join(__dirname, ".."));
        const child = childProcess.spawn(command, args, options);
        let codepage = "65001";
        if (os.platform() === "win32") {
            try {
                const chcp = childProcess.execSync("chcp.com");
                codepage = chcp.toString().split(":").pop().trim();
            }
            catch (error) {
                outputChannel_1.arduinoChannel.warning(`Defaulting to code page 850 because chcp.com failed.\
                \rEnsure your path includes %SystemRoot%\\system32\r${error.message}`);
                codepage = "850";
            }
        }
        codepage = "65001";  /* 今回はここを追加 */
        if (outputChannel) {
            child.stdout.on("data", (data) => {
                outputChannel.append(decodeData(data, codepage));
            });
            child.stderr.on("data", (data) => {
                outputChannel.append(decodeData(data, codepage));
            });
        }

前回は、よく分かっていなかったがよくよく見ればやっていることは単純。で、悩ましい問題でもあった。
マイクロソフトMS-DOSWindowsは、世界各国で販売をしていてその国毎にカスタマイズをしてきた。これによりその国の時間、通貨、言語に対応しシェアを伸ばしてきたのだが世界的に広まると今度は有名なソフトウェアが海外でも実行され、一応動くがローカライズされた文字が化けて表示できない等の問題を起こした。過去DOS(現在でいうとcmd.exe)では、CHCPというコマンドがある。 S-JISコードが932で、DOS/Vコードが437となっている。つまり、英語モードにして実行するときは、'CHCP 437'と打ち込み日本語に戻すのは'CHCP 932'である。MS-DOSには、US.BAT JP.BATなるバッチコマンドがありそれほど必要な人には必要なコマンドであった。

f:id:chiyoh:20201108131419p:plain

いまでも、CHCP 437と打てば英語モードになる。

f:id:chiyoh:20201108131555p:plain

UNIXの世界でも、同じことが起きていてscriptやbatchが動かないときには、setenv LANG Cや、unsetenv LANGを実行してお節介な日本語処理を無効にしたりしていた。もう世の中21世紀も四半世紀近くになりだいぶUNICODEUTF-8が浸透してきている。今回の文字化けはこれに起因する。

docs.microsoft.com

にあるように、'65001'は、UTF-8である。上のコードの一部は、文字体系をUTF-8に変更するよ。エラーがあったら'850'欧州多言語コードに変更みたいな。我々のwindowsは、chcp.comを実行すると932が返ってくる。

f:id:chiyoh:20201108133247p:plain

つまり、日本語 Shift-JISだ。最近は、UTF-8でプログラムソースを書いていることも多いが、WindwosのすべてがUTF-8ではないためシステムをUTF-8に変更するといままで動作していたアプリケーションが動かなくなってしまうことが予想されるのでシステムの文字体系を変更というのは安易にはできない。UTF-8を使っていて1バイトしか使わない欧米では問題ないが。その他の国でも、システム変数のページコードにしておけば問題ないよね。ということである。しかし、日本はマイクロソフトのOSをけん引してきたことによりつまりOSは、シフトJIS。しかし世の中は、世界標準のUTF-8なのでこの齟齬が発生している。Linux等は、UTF-8で統一されているからこの問題は起きていない?

文字化けは、親切に各開発ツールの出力を多国語対応表示つまり母国語出力するための仕組みであった。基本的に、開発ツールのコマンドは、LANG Cつまりlibcライブラリのコード体系GNUツール関係の出力メッセージを取り込んで判断するscriptがあるので基本英語出力にするのが基本である。

過去の日本語文字化けパッチは、windows環境では、chcpコマンドを実行してdefault言語体系に変更しなさいということころをコメントに変更しているのである。いろんな国でVisual Studio Code が使われているのでこのコードでうまくいっている地域が多いのであろう。かといって、ソースコードSJISで書いていけば問題ないというわけにもいかないのでだれかがPR書くまで毎回パッチを充てるのであった。

今回は、内容が分かったので、再度codepage = "65001";として再定義をすることで1行追加するだけで済むパッチにした。 まあ、'os.platform() === "win32"'を'os.platform() === "hogehoge"'でもいいんだけどね。

【M5Stack_Core2】備忘録

Arduinoの中身

Arduinoというカプセルの中で何が行われているかということを調べるための資料 initArduino()か何やっているんだろうなぁ

setupとloopの関係

/Arduino15/packages/m5stack/hardware/esp32/1.0.4/cores/esp32/main.cpp

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"
#include "Arduino.h"

TaskHandle_t loopTaskHandle = NULL;

#if CONFIG_AUTOSTART_ARDUINO

bool loopTaskWDTEnabled;

void loopTask(void *pvParameters)
{
    setup();
    for(;;) {
        if(loopTaskWDTEnabled){
            esp_task_wdt_reset();
        }
        loop();
    }
}

extern "C" void app_main()
{
    loopTaskWDTEnabled = false;
    initArduino();
    xTaskCreateUniversal(loopTask, "loopTask", 8192, NULL, 1, &loopTaskHandle, CONFIG_ARDUINO_RUNNING_CORE);
}

#endif

Arduinoのボード情報
Arduino15/packages/m5stack/hardware/esp32/1.0.4/boards.txt

m5stack-core2.name=M5Stack-Core2

m5stack-core2.upload.tool=esptool_py
m5stack-core2.upload.maximum_size=6553600
m5stack-core2.upload.maximum_data_size=4521984
m5stack-core2.upload.wait_for_upload_port=true

m5stack-core2.serial.disableDTR=true
m5stack-core2.serial.disableRTS=true

m5stack-core2.build.mcu=esp32
m5stack-core2.build.core=esp32
m5stack-core2.build.variant=m5stack_core2
m5stack-core2.build.board=M5STACK_Core2

m5stack-core2.build.f_cpu=240000000L
m5stack-core2.build.flash_size=16MB
m5stack-core2.build.flash_freq=80m
m5stack-core2.build.flash_mode=dio
m5stack-core2.build.boot=dio
m5stack-core2.build.partitions=default_16MB
m5stack-core2.build.defines=

m5stack-core2.menu.PSRAM.enabled=Enabled
m5stack-core2.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue
m5stack-core2.menu.PSRAM.disabled=Disabled
m5stack-core2.menu.PSRAM.disabled.build.defines=

m5stack-core2.menu.PartitionScheme.default=Default (2 x 6.5 MB app, 3.6 MB SPIFFS)
m5stack-core2.menu.PartitionScheme.default.build.partitions=default_16MB
m5stack-core2.menu.PartitionScheme.default.upload.maximum_size=6553600
m5stack-core2.menu.PartitionScheme.large_spiffs=Large SPIFFS (7 MB)
m5stack-core2.menu.PartitionScheme.large_spiffs.build.partitions=large_spiffs_16MB
m5stack-core2.menu.PartitionScheme.large_spiffs.upload.maximum_size=4685824

m5stack-core2.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS)
m5stack-core2.menu.PartitionScheme.minimal.build.partitions=minimal
m5stack-core2.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS)
m5stack-core2.menu.PartitionScheme.no_ota.build.partitions=no_ota
m5stack-core2.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
m5stack-core2.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS)
m5stack-core2.menu.PartitionScheme.noota_3g.build.partitions=noota_3g
m5stack-core2.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576
m5stack-core2.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS)
m5stack-core2.menu.PartitionScheme.huge_app.build.partitions=huge_app
m5stack-core2.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
m5stack-core2.menu.PartitionScheme.min_spiffs=Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS)
m5stack-core2.menu.PartitionScheme.min_spiffs.build.partitions=min_spiffs
m5stack-core2.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080

m5stack-core2.menu.CPUFreq.240=240MHz (WiFi/BT)
m5stack-core2.menu.CPUFreq.240.build.f_cpu=240000000L
m5stack-core2.menu.CPUFreq.160=160MHz (WiFi/BT)
m5stack-core2.menu.CPUFreq.160.build.f_cpu=160000000L
m5stack-core2.menu.CPUFreq.80=80MHz (WiFi/BT)
m5stack-core2.menu.CPUFreq.80.build.f_cpu=80000000L
m5stack-core2.menu.CPUFreq.40=40MHz (40MHz XTAL)
m5stack-core2.menu.CPUFreq.40.build.f_cpu=40000000L
m5stack-core2.menu.CPUFreq.26=26MHz (26MHz XTAL)
m5stack-core2.menu.CPUFreq.26.build.f_cpu=26000000L
m5stack-core2.menu.CPUFreq.20=20MHz (40MHz XTAL)
m5stack-core2.menu.CPUFreq.20.build.f_cpu=20000000L
m5stack-core2.menu.CPUFreq.13=13MHz (26MHz XTAL)
m5stack-core2.menu.CPUFreq.13.build.f_cpu=13000000L
m5stack-core2.menu.CPUFreq.10=10MHz (40MHz XTAL)
m5stack-core2.menu.CPUFreq.10.build.f_cpu=10000000L

m5stack-core2.menu.UploadSpeed.921600=921600
m5stack-core2.menu.UploadSpeed.921600.upload.speed=921600
m5stack-core2.menu.UploadSpeed.115200=115200
m5stack-core2.menu.UploadSpeed.115200.upload.speed=115200
m5stack-core2.menu.UploadSpeed.256000.windows=256000
m5stack-core2.menu.UploadSpeed.256000.upload.speed=256000
m5stack-core2.menu.UploadSpeed.230400.windows.upload.speed=256000
m5stack-core2.menu.UploadSpeed.230400=230400
m5stack-core2.menu.UploadSpeed.230400.upload.speed=230400
m5stack-core2.menu.UploadSpeed.460800.linux=460800
m5stack-core2.menu.UploadSpeed.460800.macosx=460800
m5stack-core2.menu.UploadSpeed.460800.upload.speed=460800
m5stack-core2.menu.UploadSpeed.512000.windows=512000
m5stack-core2.menu.UploadSpeed.512000.upload.speed=512000
m5stack-core2.menu.UploadSpeed.1500000=1500000
m5stack-core2.menu.UploadSpeed.1500000.upload.speed=1500000

m5stack-core2.menu.DebugLevel.none=None
m5stack-core2.menu.DebugLevel.none.build.code_debug=0
m5stack-core2.menu.DebugLevel.error=Error
m5stack-core2.menu.DebugLevel.error.build.code_debug=1
m5stack-core2.menu.DebugLevel.warn=Warn
m5stack-core2.menu.DebugLevel.warn.build.code_debug=2
m5stack-core2.menu.DebugLevel.info=Info
m5stack-core2.menu.DebugLevel.info.build.code_debug=3
m5stack-core2.menu.DebugLevel.debug=Debug
m5stack-core2.menu.DebugLevel.debug.build.code_debug=4
m5stack-core2.menu.DebugLevel.verbose=Verbose
m5stack-core2.menu.DebugLevel.verbose.build.code_debug=5

プラットフォーム情報(コンパイル・ビルドするときに必要な情報)
/Arduino15/packages/m5stack/hardware/esp32/1.0.4/platform.txt

name=M5Stack Arduino
version=



tools.esptool_py.path={runtime.tools.esptool_py.path}
tools.esptool_py.cmd=esptool
tools.esptool_py.cmd.linux=esptool.py
tools.esptool_py.cmd.windows=esptool.exe

tools.esptool_py.network_cmd=python "{runtime.platform.path}/tools/espota.py"
tools.esptool_py.network_cmd.windows="{runtime.platform.path}/tools/espota.exe"

tools.gen_esp32part.cmd=python "{runtime.platform.path}/tools/gen_esp32part.py"
tools.gen_esp32part.cmd.windows="{runtime.platform.path}/tools/gen_esp32part.exe"

compiler.warning_flags=-w
compiler.warning_flags.none=-w
compiler.warning_flags.default=
compiler.warning_flags.more=-Wall -Werror=all
compiler.warning_flags.all=-Wall -Werror=all -Wextra

compiler.path={runtime.tools.xtensa-esp32-elf-gcc.path}/bin/
compiler.sdk.path={runtime.platform.path}/tools/sdk
compiler.cpreprocessor.flags=-DESP_PLATFORM -DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h" -DHAVE_CONFIG_H -DGCC_NOT_5_2_0=0 -DWITH_POSIX "-I{compiler.sdk.path}/include/config" "-I{compiler.sdk.path}/include/app_trace" "-I{compiler.sdk.path}/include/app_update" "-I{compiler.sdk.path}/include/asio" "-I{compiler.sdk.path}/include/bootloader_support" "-I{compiler.sdk.path}/include/bt" "-I{compiler.sdk.path}/include/coap" "-I{compiler.sdk.path}/include/console" "-I{compiler.sdk.path}/include/driver" "-I{compiler.sdk.path}/include/esp-tls" "-I{compiler.sdk.path}/include/esp32" "-I{compiler.sdk.path}/include/esp_adc_cal" "-I{compiler.sdk.path}/include/esp_event" "-I{compiler.sdk.path}/include/esp_http_client" "-I{compiler.sdk.path}/include/esp_http_server" "-I{compiler.sdk.path}/include/esp_https_ota" "-I{compiler.sdk.path}/include/esp_ringbuf" "-I{compiler.sdk.path}/include/ethernet" "-I{compiler.sdk.path}/include/expat" "-I{compiler.sdk.path}/include/fatfs" "-I{compiler.sdk.path}/include/freemodbus" "-I{compiler.sdk.path}/include/freertos" "-I{compiler.sdk.path}/include/heap" "-I{compiler.sdk.path}/include/idf_test" "-I{compiler.sdk.path}/include/jsmn" "-I{compiler.sdk.path}/include/json" "-I{compiler.sdk.path}/include/libsodium" "-I{compiler.sdk.path}/include/log" "-I{compiler.sdk.path}/include/lwip" "-I{compiler.sdk.path}/include/mbedtls" "-I{compiler.sdk.path}/include/mdns" "-I{compiler.sdk.path}/include/micro-ecc" "-I{compiler.sdk.path}/include/mqtt" "-I{compiler.sdk.path}/include/newlib" "-I{compiler.sdk.path}/include/nghttp" "-I{compiler.sdk.path}/include/nvs_flash" "-I{compiler.sdk.path}/include/openssl" "-I{compiler.sdk.path}/include/protobuf-c" "-I{compiler.sdk.path}/include/protocomm" "-I{compiler.sdk.path}/include/pthread" "-I{compiler.sdk.path}/include/sdmmc" "-I{compiler.sdk.path}/include/smartconfig_ack" "-I{compiler.sdk.path}/include/soc" "-I{compiler.sdk.path}/include/spi_flash" "-I{compiler.sdk.path}/include/spiffs" "-I{compiler.sdk.path}/include/tcp_transport" "-I{compiler.sdk.path}/include/tcpip_adapter" "-I{compiler.sdk.path}/include/ulp" "-I{compiler.sdk.path}/include/vfs" "-I{compiler.sdk.path}/include/wear_levelling" "-I{compiler.sdk.path}/include/wifi_provisioning" "-I{compiler.sdk.path}/include/wpa_supplicant" "-I{compiler.sdk.path}/include/xtensa-debug-module" "-I{compiler.sdk.path}/include/esp-face" "-I{compiler.sdk.path}/include/esp32-camera" "-I{compiler.sdk.path}/include/esp-face" "-I{compiler.sdk.path}/include/fb_gfx"

compiler.c.cmd=xtensa-esp32-elf-gcc
compiler.c.flags=-std=gnu99 -Os -g3 -fstack-protector -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib -Wpointer-arith {compiler.warning_flags} -Wno-maybe-uninitialized -Wno-unused-function -Wno-unused-but-set-variable -Wno-unused-variable -Wno-deprecated-declarations -Wno-unused-parameter -Wno-sign-compare -Wno-old-style-declaration -MMD -c

compiler.cpp.cmd=xtensa-esp32-elf-g++
compiler.cpp.flags=-std=gnu++11 -Os -g3 -Wpointer-arith -fexceptions -fstack-protector -ffunction-sections -fdata-sections -fstrict-volatile-bitfields -mlongcalls -nostdlib {compiler.warning_flags} -Wno-error=maybe-uninitialized -Wno-error=unused-function -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=deprecated-declarations -Wno-unused-parameter -Wno-unused-but-set-parameter -Wno-missing-field-initializers -Wno-sign-compare -fno-rtti -MMD -c

compiler.S.cmd=xtensa-esp32-elf-gcc
compiler.S.flags=-c -g3 -x assembler-with-cpp -MMD -mlongcalls

compiler.c.elf.cmd=xtensa-esp32-elf-gcc
compiler.c.elf.flags=-nostdlib "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" -T esp32_out.ld -T esp32.common.ld -T esp32.rom.ld -T esp32.peripherals.ld -T esp32.rom.libgcc.ld -T esp32.rom.spiram_incompatible_fns.ld -u ld_include_panic_highint_hdl -u call_user_start_cpu0 -Wl,--gc-sections -Wl,-static -Wl,--undefined=uxTopUsedPriority  -u __cxa_guard_dummy -u __cxx_fatal_exception
compiler.c.elf.libs=-lgcc -lesp32 -lphy -lesp_http_client -lmbedtls -lrtc -lesp_http_server -lbtdm_app -lspiffs -lbootloader_support -lmdns -lnvs_flash -lfatfs -lpp -lnet80211 -ljsmn -lface_detection -llibsodium -lvfs -ldl_lib -llog -lfreertos -lcxx -lsmartconfig_ack -lxtensa-debug-module -lheap -ltcpip_adapter -lmqtt -lulp -lfd -lfb_gfx -lnghttp -lprotocomm -lsmartconfig -lm -lethernet -limage_util -lc_nano -lsoc -ltcp_transport -lc -lmicro-ecc -lface_recognition -ljson -lwpa_supplicant -lmesh -lesp_https_ota -lwpa2 -lexpat -llwip -lwear_levelling -lapp_update -ldriver -lbt -lespnow -lcoap -lasio -lnewlib -lconsole -lapp_trace -lesp32-camera -lhal -lprotobuf-c -lsdmmc -lcore -lpthread -lcoexist -lfreemodbus -lspi_flash -lesp-tls -lwpa -lwifi_provisioning -lwps -lesp_adc_cal -lesp_event -lopenssl -lesp_ringbuf -lfr  -lstdc++

compiler.as.cmd=xtensa-esp32-elf-as

compiler.ar.cmd=xtensa-esp32-elf-ar
compiler.ar.flags=cru

compiler.size.cmd=xtensa-esp32-elf-size

# This can be overriden in boards.txt
build.flash_size=4MB
build.flash_mode=dio
build.boot=bootloader
build.code_debug=0
build.defines=
build.extra_flags=-DESP32 -DCORE_DEBUG_LEVEL={build.code_debug} {build.defines}

# These can be overridden in platform.local.txt
compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=

## Compile c files
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.c.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" -DARDUINO_VARIANT="{build.variant}" {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

## Compile c++ files
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" -DARDUINO_VARIANT="{build.variant}" {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

## Compile S files
recipe.S.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.cpreprocessor.flags} {compiler.S.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} -DARDUINO_BOARD="{build.board}" -DARDUINO_VARIANT="{build.variant}" {compiler.S.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

## Create archives
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"

## Combine gc-sections, archives, and objects
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} -Wl,--end-group -Wl,-EL -o "{build.path}/{build.project_name}.elf"

## Create eeprom
recipe.objcopy.eep.pattern={tools.gen_esp32part.cmd} -q "{runtime.platform.path}/tools/partitions/{build.partitions}.csv" "{build.path}/{build.project_name}.partitions.bin"

## Create hex
recipe.objcopy.hex.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"
recipe.objcopy.hex.pattern.linux=python "{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"

## Save hex
recipe.output.tmp_file={build.project_name}.bin
recipe.output.save_file={build.project_name}.{build.variant}.bin

## Compute size
recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
recipe.size.regex=^(?:\.iram0\.text|\.iram0\.vectors|\.dram0\.data|\.flash\.text|\.flash\.rodata|)\s+([0-9]+).*
recipe.size.regex.data=^(?:\.dram0\.data|\.dram0\.bss|\.noinit)\s+([0-9]+).*

# ------------------------------

tools.esptool_py.upload.protocol=esp32
tools.esptool_py.upload.params.verbose=
tools.esptool_py.upload.params.quiet=
tools.esptool_py.upload.pattern="{path}/{cmd}" --chip esp32 --port "{serial.port}" --baud {upload.speed}  --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin"
tools.esptool_py.upload.pattern.linux=python "{path}/{cmd}" --chip esp32 --port "{serial.port}" --baud {upload.speed}  --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin"
tools.esptool_py.upload.network_pattern={network_cmd} -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"

ピンコネ情報

/Arduino15/packages/m5stack/hardware/esp32/1.0.4/variants/m5stack_core2/pins_arduino.h

#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#include <stdint.h>

#define EXTERNAL_NUM_INTERRUPTS 16
#define NUM_DIGITAL_PINS        20
#define NUM_ANALOG_INPUTS       16

#define analogInputToDigitalPin(p)  (((p)<20)?(esp32_adc2gpio[(p)]):-1)
#define digitalPinToInterrupt(p)    (((p)<40)?(p):-1)
#define digitalPinHasPWM(p)         (p < 34)

static const uint8_t TX = 1;
static const uint8_t RX = 3;

static const uint8_t TXD2 = 14;
static const uint8_t RXD2 = 13;

static const uint8_t SDA = 32;
static const uint8_t SCL = 33;

static const uint8_t SS    = 5;
static const uint8_t MOSI  = 23;
static const uint8_t MISO  = 38;
static const uint8_t SCK   = 18;

static const uint8_t G23 = 23;
static const uint8_t G38 = 38;
static const uint8_t G18 = 18;
static const uint8_t G3 = 3;
static const uint8_t G13 = 13;
static const uint8_t G21 = 21;
static const uint8_t G32 = 32;
static const uint8_t G27 = 27;
static const uint8_t G2 = 2;
static const uint8_t G35 = 35;
static const uint8_t G36 = 36;
static const uint8_t G25 = 25;
static const uint8_t G26 = 26;
static const uint8_t G1 = 1;
static const uint8_t G14 = 14;
static const uint8_t G22 = 22;
static const uint8_t G33 = 33;
static const uint8_t G19 = 19;
static const uint8_t G0 = 0;
static const uint8_t G34 = 34;

static const uint8_t G12 = 12;
static const uint8_t G15 = 15;
static const uint8_t G17 = 17;
static const uint8_t G5 = 5;

static const uint8_t DAC1 = 25;
static const uint8_t DAC2 = 26;

static const uint8_t ADC1 = 35;
static const uint8_t ADC2 = 36;

#endif /* Pins_Arduino_h */

まとめ

  • グローバルで沢山の定数を定義していて使っているので上書きするとまずい場合がある。なので、なるべくコンパイル時のワーニングを見てコンフリクトしてないか確認が必要。
  • /Arduino15/packages/m5stack/hardware/esp32/1.0.4/tools/sdk/includeこの辺がコンパイル時にインクルードされている。sourceはまた別の場所なので2倍必要?
  • defineもあるのでこの辺を処理するとVisual studio codeで幸せ?

VisualStudioCode の.vscodeファイルのc_cpp_properties.jsondefinesを追加してみた。コンソールのワーニングが1つ減った。

{
    "env" : {
        "Arduino15Packages" : "C:\\Users\\ユーザ名\\AppData\\Local\\Arduino15\\packages",
        "ArduinoEsp32Sdk" : "C:\\Users\\ユーザ名\\AppData\\Local\\Arduino15\\packages\\m5stack\\hardware\\esp32\\1.0.4\\tools\\sdk",
        "ArduinoMyLibraries" : "C:\\Users\\ユーザ名\\Documents\\Arduino\\libraries",
        "espidf33" : "C:\\home\\esp-idf-3.3",
        "newlib_src" : "C:\\home\\newlib\\newlib-3.3.0\\newlib"
    },
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                // M5Core2 Librarie soruce/include
                "${ArduinoMyLibraries}\\M5Core2\\src",
                // ESP32 SDK include
                "${ArduinoEsp32Sdk}\\include\\app_trace",
                "${ArduinoEsp32Sdk}\\include\\app_update",
                "${ArduinoEsp32Sdk}\\include\\asio",
                "${ArduinoEsp32Sdk}\\include\\bootloader_support",
                "${ArduinoEsp32Sdk}\\include\\bt",
                "${ArduinoEsp32Sdk}\\include\\coap",
                "${ArduinoEsp32Sdk}\\include\\config",
                "${ArduinoEsp32Sdk}\\include\\console",
                "${ArduinoEsp32Sdk}\\include\\driver",
                "${ArduinoEsp32Sdk}\\include\\esp-face",
                "${ArduinoEsp32Sdk}\\include\\esp-tls",
                "${ArduinoEsp32Sdk}\\include\\esp32",
                "${ArduinoEsp32Sdk}\\include\\esp32-camera",
                "${ArduinoEsp32Sdk}\\include\\esp_adc_cal",
                "${ArduinoEsp32Sdk}\\include\\esp_event",
                "${ArduinoEsp32Sdk}\\include\\esp_http_client",
                "${ArduinoEsp32Sdk}\\include\\esp_http_server",
                "${ArduinoEsp32Sdk}\\include\\esp_https_ota",
                "${ArduinoEsp32Sdk}\\include\\esp_ringbuf",
                "${ArduinoEsp32Sdk}\\include\\ethernet",
                "${ArduinoEsp32Sdk}\\include\\expat",
                "${ArduinoEsp32Sdk}\\include\\fatfs",
                "${ArduinoEsp32Sdk}\\include\\fb_gfx",
                "${ArduinoEsp32Sdk}\\include\\freemodbus",
                "${ArduinoEsp32Sdk}\\include\\freertos",
                "${ArduinoEsp32Sdk}\\include\\heap",
                "${ArduinoEsp32Sdk}\\include\\idf_test",
                "${ArduinoEsp32Sdk}\\include\\jsmn",
                "${ArduinoEsp32Sdk}\\include\\libsodium",
                "${ArduinoEsp32Sdk}\\include\\log",
                "${ArduinoEsp32Sdk}\\include\\lwip",
                "${ArduinoEsp32Sdk}\\include\\mbedtls",
                "${ArduinoEsp32Sdk}\\include\\mdns",
                "${ArduinoEsp32Sdk}\\include\\micro-ecc",
                "${ArduinoEsp32Sdk}\\include\\mqtt",
                "${ArduinoEsp32Sdk}\\include\\newlib",
                "${ArduinoEsp32Sdk}\\include\\nvs_flash",
                "${ArduinoEsp32Sdk}\\include\\openssl",
                "${ArduinoEsp32Sdk}\\include\\protobuf-c",
                "${ArduinoEsp32Sdk}\\include\\protocomm",
                "${ArduinoEsp32Sdk}\\include\\pthread",
                "${ArduinoEsp32Sdk}\\include\\sdmmc",
                "${ArduinoEsp32Sdk}\\include\\smartconfig_ack",
                "${ArduinoEsp32Sdk}\\include\\soc",
                "${ArduinoEsp32Sdk}\\include\\spi_flash",
                "${ArduinoEsp32Sdk}\\include\\spiffs",
                "${ArduinoEsp32Sdk}\\include\\tcp_transport",
                "${ArduinoEsp32Sdk}\\include\\tcpip_adapter",
                "${ArduinoEsp32Sdk}\\include\\ulp",
                "${ArduinoEsp32Sdk}\\include\\vfs",
                "${ArduinoEsp32Sdk}\\include\\wear_levelling",
                "${ArduinoEsp32Sdk}\\include\\wifi_provisioning",
                "${ArduinoEsp32Sdk}\\include\\wpa_supplicant",
                "${ArduinoEsp32Sdk}\\include\\xtensa-debug-module",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\cores\\esp32",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\FS\\src",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\HTTPClient\\src",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\SD\\src",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\SPIFFS\\src",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\SPI\\src",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\WiFiClientSecure\\src",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\WiFi\\src",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\variants\\m5stack_core2",
                // 何か足りない?
                "${ArduinoEsp32Sdk}\\include\\**",
                "${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\libraries\\**",
                // Arduino Libraries manager関係
                "${ArduinoMyLibraries}\\M5Core2\\src\\**",
                "${Arduino15Packages}\\m5stack\\tools\\xtensa-esp32-elf-gcc\\1.22.0-80-g6c4433a-5.2.0\\xtensa-esp32-elf\\include\\c++\\5.2.0\\**",
                // esp-ide-3.3 sourceを展開したpath
                "${espidf33}\\components\\**",
                // newlib sourceを展開したpath(ESP32関係は、独自に展開してなければROMに焼いてあるモノらしいなのでリビルド用のsourceは無いので参照用で展開)
                "${newlib_src}\\libc\\**"
                //"${Arduino15Packages}\\**",
                //"${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\cores\\esp32\\**",
                //"${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\variants\\m5stack_core2\\**",
                //"${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\tools\\sdk\\include\\newlib\\**",
                //"${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\tools\\sdk\\include\\**",
                //"${Arduino15Packages}\\m5stack\\hardware\\esp32\\1.0.4\\**",
                //"${Arduino15Packages}\\m5stack\\tools\\**"
            ],
            "defines": ["ARDUINO=10813", "ARDUINO_ARCH_ESP32", "ARDUINO_BOARD=\"M5STACK_Core2\"", 
                "ARDUINO_LIB_DISCOVERY_PHASE", "ARDUINO_M5STACK_Core2", "ARDUINO_VARIANT=\"m5stack_core2\"", 
                "BOARD_HAS_PSRAM", "CORE_DEBUG_LEVEL=0", "ESP32", "ESP_PLATFORM", "F_CPU=240000000L", 
                "GCC_NOT_5_2_0=0", "HAVE_CONFIG_H", "MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"", "WITH_POSIX" ],
            "forcedInclude": [],
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "${Arduino15Packages}\\m5stack\\tools\\xtensa-esp32-elf-gcc\\1.22.0-80-g6c4433a-5.2.0\\bin\\xtensa-esp32-elf-gcc.exe",
            "cStandard": "c99",
            "cppStandard": "c++11"
        }
    ],
    "version": 4
}