echo出力について~コマンドプロンプト(Windows、DOS窓、command)~
echo出力について~コマンドプロンプト(Windows、DOS窓、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.
WindowsのCertUtil -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を使う。
基本インストール等
基本インストール等は、公式ページや
を見てインストールしてください。それで、動作すれば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群では、VBA
。GoogleのGoogle Apps Script(GAS) = Java script
、VLCやゲームの組み込みで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やいろいろ、windowsもwindows95の頃は、ベンダーソフトが勝手にWindowsフォルダにプログラムをぶち込んだり、PATHを追加していってPATHが膨れ上がり、実行名が同じため動作しなくなった内部コマンドなど(起動コマンド以外名前なんて知らねーよ。また、そのジャンルの強豪同士が同じ名前を付けてインストール合戦していこともあった。)などのことがあるので、安易にシステムのPATHを追加するのは最近ではよろしくないということになっている。このようなことをPATH汚染という。 このような、過去があり最近は、他のシステムのコマンドを使う場合FULLPATHやフォルダを指定してもらいそのうえで使用するのが一般的になりつつあったがそうでもないのが、いろんな人がいろんな経験則に基づくソースが集まるソフトウェア開発コミュニティらしい(はぁ~)。有名になりつつあるソフトであれば改善されるであろうが、開発初めの時はそうでもなく動かないのである。現在、そんな感じ。あれこれ、時間を見ては、調べまくった結果。多少は、動作が怪しいが動くようになったが1回目動かないってどういうことよ?デバッグ実行時ターミナルが開いたときにすぐ実行され、デバッグ終了時に仮想環境にはいるらしい。そのうえで2度目の実行は仮想環境後に動作するので動くみたいだ。なにが致命的かNumpyのDLLが読まれないんだよ!まあ、一度デバッグ終了させて、再度実行すればいいのだが。
解決方法(原点回帰)
現在の問題点、Anaconda環境condaベースでインストールされたDLLが読み込まれない。環境変数には、CONDA PATH等いろいろ設定があるが結局のところうまくいってない。もう、いろいろとあきらめがついたので原始的な解決方法にすることにした。
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ファイルがあるディレクトリでなく他のディレクトリに置いておいたほうがよさそう
適当に、ファイルを作り、ショートカット登録するだけ
とりあえず、これで、パスが通った状態でVScodeが起動するのですべての環境変数が受け継がれるのであった。 なんというか、すごい敗北感なんだよなぁ。
Markdown+α(HTML埋め込み)
今回のお題
MarkDown等で使う、埋め込みHTMLについて
WindowsOSでのお話になります。
気付き
最近VScodeを使っているが、非常に便利である。特に、1つのことではなく沢山の事を学んでしまうとその瞬間から忘れて行ってしまいそのままになってしまうことも多い。そういう意味もあってBLOGなどを書き始めたが、備忘録にもなってない。よく言う、メモは取るがメモは見ないである。ということでMarkDownである、最近はJupyterNoteBookや、ソースコードのドキュメント埋め込み、BLOGの文章とあちこちで活躍するMarkDown言語であるが使っている装飾が少ない。昔調べたときはたくさんの機能があったがチートシートが手元にないのがいけないのか覚えている数種のマークしか使っていない。これではいけないと、過去の記事を見直したがフムフムなるほどと思うがまた忘れそうである。チートシートでも作るかと思ったが今回は、特に便利そうな色付け機能等を何とか忘れないようにと思った次第だ。
方法
VScodeを使いだしてから、最近のトレンド?スニペットによる補完である。オートコンプリートよりもう少し大きいブロックになるこういうのは、あるアプリケーション上で動くPlug-in的動作であったり基本機能であったりする。そこまでしなくてもいいのだがなにか方法がないかと思っていたが、別途調べていたIMEの日本語ON/OFF勝手に切り替え機能を何とか黙らせる方法を探していて昔懐かしい機能に遭遇した。 単語登録機能である。最近は、辞書機能も進化していて辞書のビックデータ化などあり、マニアックな変換もサポートされているらしい。基本機能をインターネット越しというのも気持ち悪いので使用してないが。 さて、IMEも進化して、いつのころか同音異義語の中身の説明をしてくれる補助機能が付くようになっていた。
さらに、単語記録にもその機能を追加できるらしいのでこれを使えばべんりじゃね?とおもい組み込んでみた。
使用方法
単純に画面の右下のトレイのIMEアイコン「あ」とかあるやつを右クリックして単語の登録
を起動左下のユーザー辞書ツール
ボタンをクリックしてメニューからヘルプ
ユーザー辞書を作るを見て作る。
メニューのツール
-テキストファイルからの登録
を使い一括登録
misc/imeWordReg.txt at master · chiyo-h/misc · GitHub
IME ONにして、「html」と打って変換するだけ簡単でしょ?
結果
改行
- 改行
- マークダウンでは、スペース2つ以上の後改行コードか改行コード2つ以上だが見た目分かりにくい
- <BR>
- 改行タグ
」 <br> 短縮よみ 改行
Enterキーの横の'」'とスペースとEnterで
を追加するようにしてみた。
スペース2つや、改行2つより、改行が歩かないかわからないスペースや文章が縦長になるより<BR>を入れるだけで組み込みHTMLになるので便利。
エンティティ
& & 短縮よみ HTMLエンティティ < < 短縮よみ HTMLエンティティ > > 短縮よみ HTMLエンティティ <> <> 短縮よみ HTMLエンティティ ” " 短縮よみ 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機能を使えば出来そう。
罠
罠1 公開資料の間違い
M5Stack Core2のLCDコントロールICは、ILITEK ILI9341ではなく『ILI9342C』らしい。 液晶パネルを剥いて確かめてないのでわからないがM5Stackシリーズは前からこれみたい だ。ホントになってコッタい。M5公式のページから指定されているのはILI9341のデータ シートだから。その仕様書を読んで解析してたのに。 何とかの法則なのか丁度公式ページの更新があった。この苦労っていったい。。。
罠2 仕様書のあいまいさ(デメリットは、直接書かない)
hardscrollコマンドは、1方向固定らしい。つまり、ILI9341は、縦長方向。ILI9342C は、横長方向の時のみ有効。実際は、ILI9342C 240lineスクロールになっていてオリジナル サンプルプログラムは、ILI9341用なので240x320で縦長default設定320lineスクロールに なっている。このことは、サンプルのコメントにはsetRotation(0)じゃないと動かないと 書いてある。が実際は0,2,4,6の縦長でないと動かないである。どちらにしても、M5Stack では動作しない。
ILI9341
予期しない画像が表示されない限り、この設定は禁止されています。つまり、M5Stackシリーズは、ILI9342Cなので、下の仕様通り合計320の値では動作しない
ILI9342C
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が鏡文字(液晶をそのまま表示するのではなく、鏡越しに表示したり、反射させて表示させるときのモード。)
まとめ
Vertical Scrolling機能は、使えるので上手くプログラムに組み込むと便利。SCROLL機能ON/OFFを使ってもらえればわかるように実際のFRAME RAMは、何ら書き換えは行われていない。 LSIの中でView位置を変更しているだけなのである。
わかってしまえば、VSPの値を変更しつつ普通に表示しているだけなのである。
なんか、脱線しまくって。こんなことしている。実は、まだまだ脱線しているのだが次回に続く
【M5Stack_Core2】LCDコントローラ ILI9341でなくILI9342Cです。
長らく、ユーザを迷わしていた。m5Stackシリーズの液晶コントロールICが公式ページでILI9341からILI9342Cに変更された。
ほかにも、資料として複数のICのデータシート。および、回路図のExternalが追加されているのでCore2早期購買ユーザは再確認すると幸せになれる。
VS code Arduino 文字化け
最近では、Visual Studio Code に慣れて便利に使っている。
しかし、突然出力コンソールの日本語文字化けが発生。何かと思ったら、Arduinoプラグインがupdateされたみたいだ。
これは、導入したときにも発生していてファイルにパッチを充てることで回避したが今回はまた上書きされてしまったみたいだ。
"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-DOSやWindowsは、世界各国で販売をしていてその国毎にカスタマイズをしてきた。これによりその国の時間、通貨、言語に対応しシェアを伸ばしてきたのだが世界的に広まると今度は有名なソフトウェアが海外でも実行され、一応動くがローカライズされた文字が化けて表示できない等の問題を起こした。過去DOS(現在でいうとcmd.exe)では、CHCPというコマンドがある。
S-JISコードが932で、DOS/Vコードが437となっている。つまり、英語モードにして実行するときは、'CHCP 437'と打ち込み日本語に戻すのは'CHCP 932'である。MS-DOSには、US.BAT
JP.BAT
なるバッチコマンドがありそれほど必要な人には必要なコマンドであった。
いまでも、CHCP 437
と打てば英語モードになる。
UNIXの世界でも、同じことが起きていてscriptやbatchが動かないときには、setenv LANG C
や、unsetenv LANGを実行してお節介な日本語処理を無効にしたりしていた。もう世の中21世紀も四半世紀近くになりだいぶUNICODEやUTF-8が浸透してきている。今回の文字化けはこれに起因する。
にあるように、'65001'は、UTF-8である。上のコードの一部は、文字体系をUTF-8に変更するよ。エラーがあったら'850'欧州多言語コードに変更みたいな。我々のwindowsは、chcp.com
を実行すると932が返ってくる。
つまり、日本語 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.json のdefines
を追加してみた。コンソールのワーニングが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 }