toupper

toupperは、指定された文字がアルファベットの小文字の時、大文字に変換する。

Man page of TOUPPER
C言語関数辞典 - toupper

入力された文字列に小文字があったらすべて大文字に変換してみる。

textのi番目、text[i]をtoupperに渡して、戻り値をtext[i]に代入し直す。

$ vi toupper.c
$ gcc toupper.c -o toupper
$ ./toupper
abc
ABC
$ ./toupper
aBcDe
ABCDE
$ ./toupper
Ab123cD
AB123CD
$ ./toupper
aB1+C2-d3e4
AB1+C2-D3E4
$

このようにすべて大文字になっている。

Sample/c/toupper/toupper/src/toupper at master · bg1bgst333/Sample · GitHub

Console.log

logメソッドで、標準出力、または、ファイルにログを出力する。

Console | Node.js v11.10.1 Documentation

logメソッドの特徴としては、出力書式を指定できることと、複数の変数の内容を並べて出力できることであり、それらを同時に行うこともできる。

普通に文字列1つを出力というこのパターン。

数値10を変数aに入れて1つ出力。

"a = %d"という書式でaを出力。

bに20を代入して、aとbを並べて出力。

aは書式出力で、その後にbが並ぶ。

cに30を代入して、aとbとcを並べて出力。

"a = %d, b = %d"という形式で、aとbを出力し、cもその横に並べる。

$ node console.js
ABCDE
10
a = 10
10 20
a = 10 20
10 20 30
a = 10, b = 20 30
$

複数並べた場合は、スペースが区切り文字となる。

Sample/nodejs/Console/log/src/Console at master · bg1bgst333/Sample · GitHub

OneLang32/OneLang32Console(0, 0, 0, 5/Nishi-Funabashi #5) -スペースもトークンすることにした.

当初は、スペースは読み飛ばすことも考えていたが、ダブルクォートなどの中のスペースは消失させてはいけないし、今後の機能の充実を考えると、スペースをトークンとすることが必要になったので、そのように修正した。

LexicalAnalyzer.cppで、

スペースの時は、それまでの文字列があるならトークンリストに追加して、さらにトークンリストに"<Space>"を追加する。そして、トークンは空の状態にリセットする。

これで、test.1の字句解析をすると、

C:\Project\Cloud\github.com\OneLang32\debug console>OneLang32Console.exe test.1
argv[1] = test.1
CLexicalAnalyzer::Analyze!
----- start -----
ho + ge
foo b/ar
ABC /  XYZ
----- end -----
ho
<Space>
+
<Space>
ge
<CR>
<LF>
foo
<Space>
b
/
ar
<CR>
<LF>
ABC
<Space>
/
<Space>
<Space>
XYZ

C:\Project\Cloud\github.com\OneLang32\debug console>

スペースもトークンのひとつとなる。

-スペースもトークンすることにした. · bg1bgst333/OneLang32@0e4a619 · GitHub

RGB

色の指定に、RGBマクロを使うと、どの色かわかりやすい。

RGB macro | Microsoft Docs

WindowProcのWM_PAINTで、

RGBマクロは、R, G, B, の順に指定する。Rが0xffなのでこれも赤。

赤

赤になっている。

Sample/winapi/RGB/RGB/src/RGB at master · bg1bgst333/Sample · GitHub

Console(consoleモジュールのConsoleコンストラクタ)

前回、consoleは"Consoleクラスのグローバルインスタンス"と言っていたけど、いろいろ調べていくと、consoleは"consoleモジュールのグローバルインスタンス"のほうが正しいのかなあっておもった・・・。

前回は、"consoleモジュールのグローバルインスタンス"について扱ったが、今回は"consoleモジュールのコンストラクタConsole"について扱う。

Console | Node.js v11.10.1 Documentation

コンストラクタに引数として、出力ストリームや、入力ストリーム、エラー出力ストリームを渡すことで、ファイルにログ出力などができる。
で、前回のグローバルインスタンス、今回のConsoleコンストラクタ含めて、いろいろな呼び出し方ができることがわかった。
まず、

前回のようなグローバルインスタンスで標準出力。

$ vi console1.js
$ node console1.js
AAA
$

こうなってました。
次に、

requireでconsoleモジュールの参照を取得し、varでcustomConsoleという変数に格納し、customConsole.logで出力。

$ vi console2.js
$ node console2.js
BBB
$

変わらない。
続いて、

customConsoleが、varによる変数から、constによる定数になっている。

$ vi console3.js
$ node console3.js
CCC
$

これも変わらない。
さて、ここから、

requireでconsoleモジュールの参照が取得できるわけだが、

分割代入 - JavaScript | MDN

constの次の"{Console}"、これは『分割代入』というJavaScriptの機能で、"その名前の要素を、その名前の変数に代入する"というもの。
consoleモジュールの中にはConsoleコンストラクタの参照があり、これをconstのConsoleに格納しているのである。

ここはfsモジュールで"output.log"への書き込みストリームを作成している。
('fs'モジュールについては後日・・・。)

Consoleコンストラクタの前にnewを付けて、オブジェクトを作成。このとき、outputStreamを渡すことで、outputStreamへの書き込みになる。
あとはlogで"DDD"を出力。

$ vi console4.js
$ node console4.js
$ ls
console1.js  console2.js  console3.js  console4.js  output.log
$ cat output.log
DDD
$

このように標準出力ではなく、"output.log"に"DDD"と書き込まれている。

さて、Consoleコンストラクタは、require('console')モジュールのConsole関数であるとも言える。

なので、それにnewを付けてオブジェクト生成をし、customConsoleに格納もできる。

$ ls
console1.js  console2.js  console3.js  console4.js  console5.js  output.log
$ vi console5.js
$ node -v
v10.15.0
$ node console5.js
/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console5.js:5
customConsole.log("EEE"); // customConsole.logで'output2.log'に"EEE"を出力.
              ^

TypeError: Cannot read property 'log' of undefined
    at Object.<anonymous>
(/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console5.js:5:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
output.log  output2.log
$ cat output2.log
$

ただし、これをv10.15.0でやったら、エラーが出てしまう。

$ sudo n 11.10.0
[sudo] bg1 のパスワード:
$ node -v
v11.10.0
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
output.log  output2.log
$ rm output2.log
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js  output.log
$ node console5.js
$ cat output2.log
EEE
$

そこで、nでv11.10.0に切り替えて、再度実行してみたら、今度は成功した。
(v10系のバグだろうか・・・。LTSなのに・・・。)

グローバルインスタンスのconsoleもrequire('console')と参照してるものは同じなので、

こういう風にもできる。

$ node -v
v10.15.0
$ vi console6.js
$ node console6.js
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  output.log  output2.log  output3.log
$ cat output3.log
FFF
$

これはv10.15.0でも成功する。

Consoleは関数だから、別にnewで生成しなくても、require('console')の参照から関数として呼び出せる。(結局、newはいらない。)

$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  output.log  output2.log  output3.log
$ vi console7.js
$ node -v
v10.15.0
$ node console7.js
/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console7.js:5
customConsole.log("GGG"); // customConsole.logで'output4.log'に"GGG"を出力.
              ^

TypeError: Cannot read property 'log' of undefined
    at Object.<anonymous>
(/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console7.js:5:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  output.log  output2.log  output3.log
output4.log
$ cat output4.log
$ rm output4.log
$ sudo n 11.10.0
[sudo] bg1 のパスワード:
$ node -v
v11.10.0
$ node console7.js
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  output.log  output2.log  output3.log
output4.log
$ cat output4.log
GGG
$

これも、v10.15.0で失敗するが、v11.10.0だと成功。

グローバルインスタンスからの呼び出しも、

$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  console8.js  output.log  output2.log
output3.log  output4.log
$ vi console8.js
$ node console8.js
/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console8.js:5
customConsole.log("HHH"); // customConsole.logで'output5.log'に"HHH"を出力.
              ^

TypeError: Cannot read property 'log' of undefined
    at Object.<anonymous>
(/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console8.js:5:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  console8.js  output.log  output2.log
output3.log  output4.log  output5.log
$ cat output5.log
$ rm output5.log
$ sudo n 11.10.0
$ node -v
v11.10.0
$ node console8.js
$ cat output5.log
HHH
$

これも、v10.15.0で失敗するが、v11.10.0だと成功。

とにかく、今回の一件で、いろんな呼び出し方があるということを知り、JavaScriptにはクラスなんて概念なんてないことを思い知らされ、バージョンによって出来たり出来なかったりなどなど、いろんなことを学んだ・・・。

Sample/nodejs/Console/Console/src/Console at master · bg1bgst333/Sample · GitHub

プロパティ

プロパティは、オブジェクトが持つさまざまな値のこと。他のオブジェクト指向言語でいう、メンバ変数、データメンバ、フィールドなどのこと。

JavaScript の基本文法

例えば、ブラウザ本体を表すNavigatorオブジェクトのappNameプロパティを表示するには、

こうすると、

appNameプロパティ
appNameプロパティ

このようにNavigatorオブジェクトのappNameプロパティが表示される。
にしても、"Netscape"って・・・。

Sample/js/property/property/src/property at master · bg1bgst333/Sample · GitHub

SetTextColor

SetTextColorは、TextOutなどでテキストを描画するときの文字色を設定する。

SetTextColor function | Microsoft Docs

WindowProcのWM_PAINTで、

TextOutの前に、SetTextColorで、16進数で色を指定した。
第1引数はhDCで、本来、第2引数にはCOLORREFで色を指定するが、実態はただの16進数、ただし、XBGR(ABGRって書いたけど正確にはXBGR)の順なので注意。
最後がffなので赤になるはず。

テキストが赤になった
テキストが赤になった

このようにテキストが赤になった。

Sample/winapi/SetTextColor/SetTextColor/src/SetTextColor at master · bg1bgst333/Sample · GitHub